/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: Daniel Schierbeck
  • Date: 2008-01-13 14:12:49 UTC
  • mto: (423.1.2 trunk)
  • mto: This revision was merged to the branch mainline in revision 429.
  • Revision ID: daniel.schierbeck@gmail.com-20080113141249-gd0i2lknr3yik55r
Moved branch view to its own package.

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):
 
48
    def __init__(self, all=False, plain=False, parent=None):
48
49
        self.all = all
49
50
        self.plain = plain
50
51
        
51
 
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
 
52
        Window.__init__(self, parent)
52
53
        
53
54
        self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
54
55
        self.annotate_colormap = AnnotateColorSaturation()
55
56
 
56
57
        self._create()
57
58
        self.revisions = {}
 
59
        self.history = []
 
60
        self._no_back = set()
58
61
 
59
62
    def annotate(self, tree, branch, file_id):
60
63
        self.annotations = []
61
64
        self.branch = branch
62
65
        self.tree = tree
63
66
        self.file_id = file_id
 
67
        self.revisionview.set_file_id(file_id)
64
68
        self.revision_id = getattr(tree, 'get_revision_id', 
65
69
                                   lambda: CURRENT_REVISION)()
66
70
        
67
 
        # [revision id, line number, committer, revno, highlight color, line]
 
71
        # [revision id, line number, author, revno, highlight color, line]
68
72
        self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
69
73
                                       gobject.TYPE_STRING,
70
74
                                       gobject.TYPE_STRING,
79
83
            for line_no, (revision, revno, line)\
80
84
                    in enumerate(self._annotate(tree, file_id)):
81
85
                if revision.revision_id == last_seen and not self.all:
82
 
                    revno = committer = ""
 
86
                    revno = author = ""
83
87
                else:
84
88
                    last_seen = revision.revision_id
85
 
                    committer = revision.committer
 
89
                    author = revision.get_apparent_author()
86
90
 
87
91
                if revision.revision_id not in self.revisions:
88
92
                    self.revisions[revision.revision_id] = revision
89
93
 
90
94
                self.annomodel.append([revision.revision_id,
91
95
                                       line_no + 1,
92
 
                                       committer,
 
96
                                       author,
93
97
                                       revno,
94
98
                                       None,
95
99
                                       line.rstrip("\r\n")
139
143
        current_revision.timestamp = time.time()
140
144
        current_revision.message = '[Not yet committed]'
141
145
        current_revision.parent_ids = tree.get_parent_ids()
 
146
        current_revision.properties['branch-nick'] = self.branch.nick
142
147
        current_revno = '%d?' % (self.branch.revno() + 1)
143
148
        repository = self.branch.repository
144
149
        if self.revision_id == CURRENT_REVISION:
176
181
            return None
177
182
        return self.annomodel[path][REVISION_ID_COL]
178
183
 
179
 
    def _show_log(self, w):
 
184
    def _activate_selected_revision(self, w):
180
185
        rev_id = self._selected_revision()
181
186
        if rev_id is None:
182
187
            return
183
 
        self.logview.set_revision(self.revisions[rev_id])
 
188
        selected = self.revisions[rev_id]
 
189
        self.revisionview.set_revision(selected)
 
190
        if (len(selected.parent_ids) != 0 and selected.parent_ids[0] not in
 
191
            self._no_back):
 
192
            enable_back = True
 
193
        else:
 
194
            enable_back = False
 
195
        self.back_button.set_sensitive(enable_back)
184
196
 
185
197
    def _create(self):
186
 
        self.logview = self._create_log_view()
 
198
        self.revisionview = self._create_log_view()
187
199
        self.annoview = self._create_annotate_view()
188
200
 
189
 
        vbox = gtk.VBox(False, 12)
190
 
        vbox.set_border_width(12)
 
201
        vbox = gtk.VBox(False)
191
202
        vbox.show()
192
203
 
193
204
        sw = gtk.ScrolledWindow()
196
207
        sw.add(self.annoview)
197
208
        self.annoview.gwindow = self
198
209
        sw.show()
 
210
 
 
211
        swbox = gtk.VBox()
 
212
        swbox.pack_start(sw)
 
213
        swbox.show()
 
214
 
 
215
        hbox = gtk.HBox(False, 6)
 
216
        self.back_button = self._create_back_button()
 
217
        hbox.pack_start(self.back_button, expand=False, fill=True)
 
218
        self.forward_button = self._create_forward_button()
 
219
        hbox.pack_start(self.forward_button, expand=False, fill=True)
 
220
        hbox.show()
 
221
        vbox.pack_start(hbox, expand=False, fill=True)
199
222
        
200
223
        self.pane = pane = gtk.VPaned()
201
 
        pane.add1(sw)
202
 
        pane.add2(self.logview)
 
224
        pane.add1(swbox)
 
225
        pane.add2(self.revisionview)
203
226
        pane.show()
204
227
        vbox.pack_start(pane, expand=True, fill=True)
205
228
 
206
229
        self._search = SearchBox()
207
 
        vbox.pack_start(self._search, expand=False, fill=True)
 
230
        swbox.pack_start(self._search, expand=False, fill=True)
208
231
        accels = gtk.AccelGroup()
209
232
        accels.connect_group(gtk.keysyms.f, gtk.gdk.CONTROL_MASK,
210
233
                             gtk.ACCEL_LOCKED,
214
237
                             self._search_by_line)
215
238
        self.add_accel_group(accels)
216
239
 
217
 
        hbox = gtk.HBox(True, 6)
218
 
        hbox.pack_start(self._create_prev_button(), expand=False, fill=True)
219
 
        hbox.pack_end(self._create_button_box(), expand=False, fill=True)
220
 
        hbox.show()
221
 
        vbox.pack_start(hbox, expand=False, fill=True)
222
 
 
223
240
        self.add(vbox)
224
241
 
225
242
    def _search_by_text(self, accel_group, window, key, modifiers):
253
270
    def _create_annotate_view(self):
254
271
        tv = gtk.TreeView()
255
272
        tv.set_rules_hint(False)
256
 
        tv.connect("cursor-changed", self._show_log)
 
273
        tv.connect("cursor-changed", self._activate_selected_revision)
257
274
        tv.show()
258
275
        tv.connect("row-activated", self.row_diff)
259
276
 
309
326
        return tv
310
327
 
311
328
    def _create_log_view(self):
312
 
        lv = LogView()
 
329
        lv = RevisionView()
313
330
        lv.show()
314
331
        return lv
315
332
 
316
 
    def _create_button_box(self):
317
 
        box = gtk.HButtonBox()
318
 
        box.set_layout(gtk.BUTTONBOX_END)
319
 
        box.show()
320
 
 
321
 
        button = gtk.Button()
322
 
        button.set_use_stock(True)
323
 
        button.set_label("gtk-close")
324
 
        button.connect("clicked", lambda w: self.destroy())
325
 
        button.show()
326
 
 
327
 
        box.pack_start(button, expand=False, fill=False)
328
 
 
329
 
        return box
330
 
 
331
 
    def _create_prev_button(self):
332
 
        box = gtk.HButtonBox()
333
 
        box.set_layout(gtk.BUTTONBOX_START)
334
 
        box.show()
335
 
        
 
333
    def _create_back_button(self):
336
334
        button = gtk.Button()
337
335
        button.set_use_stock(True)
338
336
        button.set_label("gtk-go-back")
339
337
        button.connect("clicked", lambda w: self.go_back())
340
 
        button.show()
341
 
        box.pack_start(button, expand=False, fill=False)
342
 
        return box
 
338
        button.set_relief(gtk.RELIEF_NONE)
 
339
        button.show()
 
340
        return button
 
341
 
 
342
    def _create_forward_button(self):
 
343
        button = gtk.Button()
 
344
        button.set_use_stock(True)
 
345
        button.set_label("gtk-go-forward")
 
346
        button.connect("clicked", lambda w: self.go_forward())
 
347
        button.set_relief(gtk.RELIEF_NONE)
 
348
        button.show()
 
349
        button.set_sensitive(False)
 
350
        return button
343
351
 
344
352
    def go_back(self):
 
353
        last_tree = self.tree
345
354
        rev_id = self._selected_revision()
346
355
        parent_id = self.revisions[rev_id].parent_ids[0]
347
 
        tree = self.branch.repository.revision_tree(parent_id)
348
 
        if self.file_id in tree:
349
 
            offset = self.get_scroll_offset(tree)
 
356
        target_tree = self.branch.repository.revision_tree(parent_id)
 
357
        if self._go(target_tree):
 
358
            self.history.append(last_tree)
 
359
            self.forward_button.set_sensitive(True)
 
360
        else:
 
361
            self._no_back.add(parent_id)
 
362
            self.back_button.set_sensitive(False)
 
363
 
 
364
    def go_forward(self):
 
365
        if len(self.history) == 0:
 
366
            return
 
367
        target_tree = self.history.pop()
 
368
        if len(self.history) == 0:
 
369
            self.forward_button.set_sensitive(False)
 
370
        self._go(target_tree)
 
371
 
 
372
    def _go(self, target_tree):
 
373
        rev_id = self._selected_revision()
 
374
        if self.file_id in target_tree:
 
375
            offset = self.get_scroll_offset(target_tree)
350
376
            (row,), col = self.annoview.get_cursor()
351
 
            self.annotate(tree, self.branch, self.file_id)
352
 
            self.annoview.set_cursor(row+offset)
 
377
            self.annotate(target_tree, self.branch, self.file_id)
 
378
            new_row = row+offset
 
379
            if new_row < 0:
 
380
                new_row = 0
 
381
            self.annoview.set_cursor(new_row)
 
382
            return True
 
383
        else:
 
384
            return False
353
385
 
354
386
    def get_scroll_offset(self, tree):
355
387
        old = self.tree.get_file(self.file_id)
362
394
                return j - i
363
395
 
364
396
 
365
 
 
366
397
class FakeRevision:
367
398
    """ A fake revision.
368
399
 
369
400
    For when a revision is referenced but not present.
370
401
    """
371
402
 
372
 
    def __init__(self, revision_id, committer='?'):
 
403
    def __init__(self, revision_id, committer='?', nick=None):
373
404
        self.revision_id = revision_id
374
405
        self.parent_ids = []
375
406
        self.committer = committer
376
407
        self.message = "?"
377
408
        self.timestamp = 0.0
378
409
        self.timezone = 0
379
 
        self.properties = []
 
410
        self.properties = {}
 
411
 
 
412
    def get_apparent_author(self):
 
413
        return self.committer
380
414
 
381
415
 
382
416
class RevisionCache(object):