/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: 2007-12-06 23:37:06 UTC
  • mto: This revision was merged to the branch mainline in revision 417.
  • Revision ID: daniel.schierbeck@gmail.com-20071206233706-eeinks66w86r3gfm
Fixed bug in gmissing.

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")
177
181
            return None
178
182
        return self.annomodel[path][REVISION_ID_COL]
179
183
 
180
 
    def _show_log(self, w):
 
184
    def _activate_selected_revision(self, w):
181
185
        rev_id = self._selected_revision()
182
186
        if rev_id is None:
183
187
            return
184
 
        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)
185
196
 
186
197
    def _create(self):
187
 
        self.logview = self._create_log_view()
 
198
        self.revisionview = self._create_log_view()
188
199
        self.annoview = self._create_annotate_view()
189
200
 
190
 
        vbox = gtk.VBox(False, 12)
191
 
        vbox.set_border_width(12)
 
201
        vbox = gtk.VBox(False)
192
202
        vbox.show()
193
203
 
194
204
        sw = gtk.ScrolledWindow()
197
207
        sw.add(self.annoview)
198
208
        self.annoview.gwindow = self
199
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)
200
222
        
201
223
        self.pane = pane = gtk.VPaned()
202
 
        pane.add1(sw)
203
 
        pane.add2(self.logview)
 
224
        pane.add1(swbox)
 
225
        pane.add2(self.revisionview)
204
226
        pane.show()
205
227
        vbox.pack_start(pane, expand=True, fill=True)
206
228
 
207
229
        self._search = SearchBox()
208
 
        vbox.pack_start(self._search, expand=False, fill=True)
 
230
        swbox.pack_start(self._search, expand=False, fill=True)
209
231
        accels = gtk.AccelGroup()
210
232
        accels.connect_group(gtk.keysyms.f, gtk.gdk.CONTROL_MASK,
211
233
                             gtk.ACCEL_LOCKED,
215
237
                             self._search_by_line)
216
238
        self.add_accel_group(accels)
217
239
 
218
 
        hbox = gtk.HBox(True, 6)
219
 
        hbox.pack_start(self._create_prev_button(), expand=False, fill=True)
220
 
        hbox.pack_end(self._create_button_box(), expand=False, fill=True)
221
 
        hbox.show()
222
 
        vbox.pack_start(hbox, expand=False, fill=True)
223
 
 
224
240
        self.add(vbox)
225
241
 
226
242
    def _search_by_text(self, accel_group, window, key, modifiers):
254
270
    def _create_annotate_view(self):
255
271
        tv = gtk.TreeView()
256
272
        tv.set_rules_hint(False)
257
 
        tv.connect("cursor-changed", self._show_log)
 
273
        tv.connect("cursor-changed", self._activate_selected_revision)
258
274
        tv.show()
259
275
        tv.connect("row-activated", self.row_diff)
260
276
 
310
326
        return tv
311
327
 
312
328
    def _create_log_view(self):
313
 
        lv = LogView()
 
329
        lv = RevisionView()
314
330
        lv.show()
315
331
        return lv
316
332
 
317
 
    def _create_button_box(self):
318
 
        box = gtk.HButtonBox()
319
 
        box.set_layout(gtk.BUTTONBOX_END)
320
 
        box.show()
321
 
 
322
 
        button = gtk.Button()
323
 
        button.set_use_stock(True)
324
 
        button.set_label("gtk-close")
325
 
        button.connect("clicked", lambda w: self.destroy())
326
 
        button.show()
327
 
 
328
 
        box.pack_start(button, expand=False, fill=False)
329
 
 
330
 
        return box
331
 
 
332
 
    def _create_prev_button(self):
333
 
        box = gtk.HButtonBox()
334
 
        box.set_layout(gtk.BUTTONBOX_START)
335
 
        box.show()
336
 
        
 
333
    def _create_back_button(self):
337
334
        button = gtk.Button()
338
335
        button.set_use_stock(True)
339
336
        button.set_label("gtk-go-back")
340
337
        button.connect("clicked", lambda w: self.go_back())
341
 
        button.show()
342
 
        box.pack_start(button, expand=False, fill=False)
343
 
        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
344
351
 
345
352
    def go_back(self):
 
353
        last_tree = self.tree
346
354
        rev_id = self._selected_revision()
347
355
        parent_id = self.revisions[rev_id].parent_ids[0]
348
 
        tree = self.branch.repository.revision_tree(parent_id)
349
 
        if self.file_id in tree:
350
 
            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)
351
376
            (row,), col = self.annoview.get_cursor()
352
 
            self.annotate(tree, self.branch, self.file_id)
353
 
            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
354
385
 
355
386
    def get_scroll_offset(self, tree):
356
387
        old = self.tree.get_file(self.file_id)
363
394
                return j - i
364
395
 
365
396
 
366
 
 
367
397
class FakeRevision:
368
398
    """ A fake revision.
369
399
 
379
409
        self.timezone = 0
380
410
        self.properties = {}
381
411
 
 
412
    def get_apparent_author(self):
 
413
        return self.committer
 
414
 
382
415
 
383
416
class RevisionCache(object):
384
417
    """A caching revision source"""