/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to annotate/gannotate.py

  • Committer: Jelmer Vernooij
  • Date: 2008-06-29 19:07:23 UTC
  • mto: This revision was merged to the branch mainline in revision 515.
  • Revision ID: jelmer@samba.org-20080629190723-l8mzg9x4oec0lhsl
Return cleartext from seahorse module

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
from bzrlib.revision import NULL_REVISION, CURRENT_REVISION
29
29
 
30
30
from colormap import AnnotateColorMap, AnnotateColorSaturation
31
 
from bzrlib.plugins.gtk.logview import LogView
 
31
from bzrlib.plugins.gtk.revisionview import RevisionView
 
32
from bzrlib.plugins.gtk.window import Window
32
33
 
33
34
 
34
35
(
41
42
) = range(6)
42
43
 
43
44
 
44
 
class GAnnotateWindow(gtk.Window):
 
45
class GAnnotateWindow(Window):
45
46
    """Annotate window."""
46
47
 
47
 
    def __init__(self, all=False, plain=False, parent=None):
 
48
    def __init__(self, all=False, plain=False, parent=None, branch=None):
48
49
        self.all = all
49
50
        self.plain = plain
50
 
        self._parent = parent
 
51
        self._branch = branch
51
52
        
52
 
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
53
 
 
54
 
        self.connect("key-press-event", self._on_key_pressed)
 
53
        Window.__init__(self, parent)
55
54
        
56
55
        self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
57
56
        self.annotate_colormap = AnnotateColorSaturation()
66
65
        self.branch = branch
67
66
        self.tree = tree
68
67
        self.file_id = file_id
 
68
        self.revisionview.set_file_id(file_id)
69
69
        self.revision_id = getattr(tree, 'get_revision_id', 
70
70
                                   lambda: CURRENT_REVISION)()
71
71
        
81
81
        try:
82
82
            branch.lock_read()
83
83
            branch.repository.lock_read()
 
84
            self.dotted = {}
 
85
            revno_map = self.branch.get_revision_id_to_revno_map()
 
86
            for revision_id, revno in revno_map.iteritems():
 
87
                self.dotted[revision_id] = '.'.join(str(num) for num in revno)
84
88
            for line_no, (revision, revno, line)\
85
89
                    in enumerate(self._annotate(tree, file_id)):
86
90
                if revision.revision_id == last_seen and not self.all:
110
114
 
111
115
        self.annoview.set_model(self.annomodel)
112
116
        self.annoview.grab_focus()
 
117
        my_revno = self.dotted.get(self.revision_id, 'current')
 
118
        title = '%s (%s) - gannotate' % (self.tree.id2path(file_id), my_revno)
 
119
        self.set_title(title)
113
120
 
114
121
    def jump_to_line(self, lineno):
115
122
        if lineno > len(self.annomodel) or lineno < 1:
125
132
        self.annoview.set_cursor(row)
126
133
        self.annoview.scroll_to_cell(row, use_align=True)
127
134
 
128
 
    def _dotted_revnos(self, repository, revision_id):
129
 
        """Return a dict of revision_id -> dotted revno
130
 
        
131
 
        :param repository: The repository to get the graph from
132
 
        :param revision_id: The last revision for which this info is needed
133
 
        """
134
 
        graph = repository.get_revision_graph(revision_id)
135
 
        dotted = {}
136
 
        for n, revision_id, d, revno, e in tsort.merge_sort(graph, 
137
 
            revision_id, generate_revno=True):
138
 
            dotted[revision_id] = '.'.join(str(num) for num in revno)
139
 
        return dotted
140
135
 
141
136
    def _annotate(self, tree, file_id):
142
137
        current_revision = FakeRevision(CURRENT_REVISION)
151
146
            revision_id = self.branch.last_revision()
152
147
        else:
153
148
            revision_id = self.revision_id
154
 
        dotted = self._dotted_revnos(repository, revision_id)
155
149
        revision_cache = RevisionCache(repository, self.revisions)
156
150
        for origin, text in tree.annotate_iter(file_id):
157
151
            rev_id = origin
161
155
            else:
162
156
                try:
163
157
                    revision = revision_cache.get_revision(rev_id)
164
 
                    revno = dotted.get(rev_id, 'merge')
 
158
                    revno = self.dotted.get(rev_id, 'merge')
165
159
                    if len(revno) > 15:
166
160
                        revno = 'merge'
167
161
                except NoSuchRevision:
184
178
 
185
179
    def _activate_selected_revision(self, w):
186
180
        rev_id = self._selected_revision()
187
 
        if rev_id is None:
 
181
        if not rev_id or rev_id == NULL_REVISION:
188
182
            return
189
183
        selected = self.revisions[rev_id]
190
 
        self.logview.set_revision(selected)
 
184
        self.revisionview.set_revision(selected)
191
185
        if (len(selected.parent_ids) != 0 and selected.parent_ids[0] not in
192
186
            self._no_back):
193
187
            enable_back = True
196
190
        self.back_button.set_sensitive(enable_back)
197
191
 
198
192
    def _create(self):
199
 
        self.logview = self._create_log_view()
 
193
        self.revisionview = self._create_log_view()
200
194
        self.annoview = self._create_annotate_view()
201
195
 
202
196
        vbox = gtk.VBox(False)
223
217
        
224
218
        self.pane = pane = gtk.VPaned()
225
219
        pane.add1(swbox)
226
 
        pane.add2(self.logview)
 
220
        pane.add2(self.revisionview)
227
221
        pane.show()
228
222
        vbox.pack_start(pane, expand=True, fill=True)
229
223
 
248
242
        self._search.show_for('line')
249
243
        self._search.set_target(self.annoview, LINE_NUM_COL)
250
244
 
251
 
    def row_diff(self, tv, path, tvc):
 
245
    def line_diff(self, tv, path, tvc):
252
246
        row = path[0]
253
247
        revision = self.annotations[row]
254
248
        repository = self.branch.repository
263
257
                tree2 = repository.revision_tree(NULL_REVISION)
264
258
        from bzrlib.plugins.gtk.diff import DiffWindow
265
259
        window = DiffWindow()
266
 
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
 
260
        window.set_diff("Diff for line %d" % (row+1), tree1, tree2)
267
261
        window.set_file(tree1.id2path(self.file_id))
268
262
        window.show()
269
263
 
273
267
        tv.set_rules_hint(False)
274
268
        tv.connect("cursor-changed", self._activate_selected_revision)
275
269
        tv.show()
276
 
        tv.connect("row-activated", self.row_diff)
 
270
        tv.connect("row-activated", self.line_diff)
277
271
 
278
272
        cell = gtk.CellRendererText()
279
273
        cell.set_property("xalign", 1.0)
327
321
        return tv
328
322
 
329
323
    def _create_log_view(self):
330
 
        lv = LogView()
 
324
        lv = RevisionView(self._branch)
331
325
        lv.show()
332
326
        return lv
333
327
 
394
388
            if i + n >= row:
395
389
                return j - i
396
390
 
397
 
    def _on_key_pressed(self, widget, event):
398
 
        """ Key press event handler. """
399
 
        keyname = gtk.gdk.keyval_name(event.keyval)
400
 
        func = getattr(self, '_on_key_press_' + keyname, None)
401
 
        if func:
402
 
            return func(event)
403
 
 
404
 
    def _on_key_press_w(self, event):
405
 
        if event.state & gtk.gdk.CONTROL_MASK:
406
 
            self.destroy()
407
 
            if self._parent is None:
408
 
                gtk.main_quit()
409
 
 
410
 
    def _on_key_press_q(self, event):
411
 
        if event.state & gtk.gdk.CONTROL_MASK:
412
 
            gtk.main_quit()
413
 
    
414
 
 
415
 
 
416
391
 
417
392
class FakeRevision:
418
393
    """ A fake revision.