/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: Szilveszter Farkas (Phanatic)
  • Date: 2007-03-15 16:23:15 UTC
  • mfrom: (170 trunk)
  • mto: (170.1.3 trunk)
  • mto: This revision was merged to the branch mainline in revision 172.
  • Revision ID: szilveszter.farkas@gmail.com-20070315162315-rs1sbxjh31n314zc
MergeĀ fromĀ trunk.

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.revisionview import RevisionView
32
 
from bzrlib.plugins.gtk.window import Window
 
31
from bzrlib.plugins.gtk.logview import LogView
33
32
 
34
33
 
35
34
(
42
41
) = range(6)
43
42
 
44
43
 
45
 
class GAnnotateWindow(Window):
 
44
class GAnnotateWindow(gtk.Window):
46
45
    """Annotate window."""
47
46
 
48
 
    def __init__(self, all=False, plain=False, parent=None):
 
47
    def __init__(self, all=False, plain=False):
49
48
        self.all = all
50
49
        self.plain = plain
51
50
        
52
 
        Window.__init__(self, parent)
 
51
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
53
52
        
54
53
        self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
55
54
        self.annotate_colormap = AnnotateColorSaturation()
56
55
 
57
56
        self._create()
58
57
        self.revisions = {}
59
 
        self.history = []
60
 
        self._no_back = set()
61
58
 
62
59
    def annotate(self, tree, branch, file_id):
63
60
        self.annotations = []
64
61
        self.branch = branch
65
62
        self.tree = tree
66
63
        self.file_id = file_id
67
 
        self.revisionview.set_file_id(file_id)
68
64
        self.revision_id = getattr(tree, 'get_revision_id', 
69
65
                                   lambda: CURRENT_REVISION)()
70
66
        
71
 
        # [revision id, line number, author, revno, highlight color, line]
 
67
        # [revision id, line number, committer, revno, highlight color, line]
72
68
        self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
73
69
                                       gobject.TYPE_STRING,
74
70
                                       gobject.TYPE_STRING,
83
79
            for line_no, (revision, revno, line)\
84
80
                    in enumerate(self._annotate(tree, file_id)):
85
81
                if revision.revision_id == last_seen and not self.all:
86
 
                    revno = author = ""
 
82
                    revno = committer = ""
87
83
                else:
88
84
                    last_seen = revision.revision_id
89
 
                    author = revision.get_apparent_author()
 
85
                    committer = revision.committer
90
86
 
91
87
                if revision.revision_id not in self.revisions:
92
88
                    self.revisions[revision.revision_id] = revision
93
89
 
94
90
                self.annomodel.append([revision.revision_id,
95
91
                                       line_no + 1,
96
 
                                       author,
 
92
                                       committer,
97
93
                                       revno,
98
94
                                       None,
99
95
                                       line.rstrip("\r\n")
181
177
            return None
182
178
        return self.annomodel[path][REVISION_ID_COL]
183
179
 
184
 
    def _activate_selected_revision(self, w):
 
180
    def _show_log(self, w):
185
181
        rev_id = self._selected_revision()
186
182
        if rev_id is None:
187
183
            return
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
        self.logview.set_revision(self.revisions[rev_id])
196
185
 
197
186
    def _create(self):
198
 
        self.revisionview = self._create_log_view()
 
187
        self.logview = self._create_log_view()
199
188
        self.annoview = self._create_annotate_view()
200
189
 
201
 
        vbox = gtk.VBox(False)
 
190
        vbox = gtk.VBox(False, 12)
 
191
        vbox.set_border_width(12)
202
192
        vbox.show()
203
193
 
204
194
        sw = gtk.ScrolledWindow()
207
197
        sw.add(self.annoview)
208
198
        self.annoview.gwindow = self
209
199
        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)
222
200
        
223
201
        self.pane = pane = gtk.VPaned()
224
 
        pane.add1(swbox)
225
 
        pane.add2(self.revisionview)
 
202
        pane.add1(sw)
 
203
        pane.add2(self.logview)
226
204
        pane.show()
227
205
        vbox.pack_start(pane, expand=True, fill=True)
228
206
 
229
207
        self._search = SearchBox()
230
 
        swbox.pack_start(self._search, expand=False, fill=True)
 
208
        vbox.pack_start(self._search, expand=False, fill=True)
231
209
        accels = gtk.AccelGroup()
232
210
        accels.connect_group(gtk.keysyms.f, gtk.gdk.CONTROL_MASK,
233
211
                             gtk.ACCEL_LOCKED,
237
215
                             self._search_by_line)
238
216
        self.add_accel_group(accels)
239
217
 
 
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
 
240
224
        self.add(vbox)
241
225
 
242
226
    def _search_by_text(self, accel_group, window, key, modifiers):
270
254
    def _create_annotate_view(self):
271
255
        tv = gtk.TreeView()
272
256
        tv.set_rules_hint(False)
273
 
        tv.connect("cursor-changed", self._activate_selected_revision)
 
257
        tv.connect("cursor-changed", self._show_log)
274
258
        tv.show()
275
259
        tv.connect("row-activated", self.row_diff)
276
260
 
326
310
        return tv
327
311
 
328
312
    def _create_log_view(self):
329
 
        lv = RevisionView()
 
313
        lv = LogView()
330
314
        lv.show()
331
315
        return lv
332
316
 
333
 
    def _create_back_button(self):
 
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
        
334
337
        button = gtk.Button()
335
338
        button.set_use_stock(True)
336
339
        button.set_label("gtk-go-back")
337
340
        button.connect("clicked", lambda w: self.go_back())
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
 
341
        button.show()
 
342
        box.pack_start(button, expand=False, fill=False)
 
343
        return box
351
344
 
352
345
    def go_back(self):
353
 
        last_tree = self.tree
354
346
        rev_id = self._selected_revision()
355
347
        parent_id = self.revisions[rev_id].parent_ids[0]
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)
 
348
        tree = self.branch.repository.revision_tree(parent_id)
 
349
        if self.file_id in tree:
 
350
            offset = self.get_scroll_offset(tree)
376
351
            (row,), col = self.annoview.get_cursor()
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
 
352
            self.annotate(tree, self.branch, self.file_id)
 
353
            self.annoview.set_cursor(row+offset)
385
354
 
386
355
    def get_scroll_offset(self, tree):
387
356
        old = self.tree.get_file(self.file_id)
394
363
                return j - i
395
364
 
396
365
 
 
366
 
397
367
class FakeRevision:
398
368
    """ A fake revision.
399
369
 
409
379
        self.timezone = 0
410
380
        self.properties = {}
411
381
 
412
 
    def get_apparent_author(self):
413
 
        return self.committer
414
 
 
415
382
 
416
383
class RevisionCache(object):
417
384
    """A caching revision source"""