/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: 2007-02-01 15:50:40 UTC
  • Revision ID: jelmer@samba.org-20070201155040-3hq4mfbxs99kzazy
add framework for tests.

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 logview import LogView
 
32
from spanselector import SpanSelector
32
33
 
33
34
 
34
35
(
55
56
 
56
57
        self._create()
57
58
        self.revisions = {}
58
 
        self.history = []
59
 
        self._no_back = set()
60
59
 
61
60
    def annotate(self, tree, branch, file_id):
62
61
        self.annotations = []
66
65
        self.revision_id = getattr(tree, 'get_revision_id', 
67
66
                                   lambda: CURRENT_REVISION)()
68
67
        
69
 
        # [revision id, line number, author, revno, highlight color, line]
 
68
        # [revision id, line number, committer, revno, highlight color, line]
70
69
        self.annomodel = gtk.ListStore(gobject.TYPE_STRING,
71
70
                                       gobject.TYPE_STRING,
72
71
                                       gobject.TYPE_STRING,
84
83
                    revno = committer = ""
85
84
                else:
86
85
                    last_seen = revision.revision_id
87
 
                    committer = revision.properties.get('author',
88
 
                        revision.committer)
 
86
                    committer = revision.committer
89
87
 
90
88
                if revision.revision_id not in self.revisions:
91
89
                    self.revisions[revision.revision_id] = revision
142
140
        current_revision.timestamp = time.time()
143
141
        current_revision.message = '[Not yet committed]'
144
142
        current_revision.parent_ids = tree.get_parent_ids()
145
 
        current_revision.properties['branch-nick'] = self.branch.nick
146
143
        current_revno = '%d?' % (self.branch.revno() + 1)
147
144
        repository = self.branch.repository
148
145
        if self.revision_id == CURRENT_REVISION:
180
177
            return None
181
178
        return self.annomodel[path][REVISION_ID_COL]
182
179
 
183
 
    def _activate_selected_revision(self, w):
 
180
    def _show_log(self, w):
184
181
        rev_id = self._selected_revision()
185
182
        if rev_id is None:
186
183
            return
187
 
        selected = self.revisions[rev_id]
188
 
        self.logview.set_revision(selected)
189
 
        if (len(selected.parent_ids) != 0 and selected.parent_ids[0] not in
190
 
            self._no_back):
191
 
            enable_back = True
192
 
        else:
193
 
            enable_back = False
194
 
        self.back_button.set_sensitive(enable_back)
 
184
        self.logview.set_revision(self.revisions[rev_id])
195
185
 
196
186
    def _create(self):
197
187
        self.logview = self._create_log_view()
198
188
        self.annoview = self._create_annotate_view()
199
189
 
200
 
        vbox = gtk.VBox(False)
 
190
        vbox = gtk.VBox(False, 12)
 
191
        vbox.set_border_width(12)
201
192
        vbox.show()
202
193
 
203
194
        sw = gtk.ScrolledWindow()
206
197
        sw.add(self.annoview)
207
198
        self.annoview.gwindow = self
208
199
        sw.show()
209
 
 
210
 
        swbox = gtk.VBox()
211
 
        swbox.pack_start(sw)
212
 
        swbox.show()
213
 
 
214
 
        hbox = gtk.HBox(False, 6)
215
 
        self.back_button = self._create_back_button()
216
 
        hbox.pack_start(self.back_button, expand=False, fill=True)
217
 
        self.forward_button = self._create_forward_button()
218
 
        hbox.pack_start(self.forward_button, expand=False, fill=True)
219
 
        hbox.show()
220
 
        vbox.pack_start(hbox, expand=False, fill=True)
221
200
        
222
201
        self.pane = pane = gtk.VPaned()
223
 
        pane.add1(swbox)
 
202
        pane.add1(sw)
224
203
        pane.add2(self.logview)
225
204
        pane.show()
226
205
        vbox.pack_start(pane, expand=True, fill=True)
227
206
 
228
207
        self._search = SearchBox()
229
 
        swbox.pack_start(self._search, expand=False, fill=True)
 
208
        vbox.pack_start(self._search, expand=False, fill=True)
230
209
        accels = gtk.AccelGroup()
231
210
        accels.connect_group(gtk.keysyms.f, gtk.gdk.CONTROL_MASK,
232
211
                             gtk.ACCEL_LOCKED,
236
215
                             self._search_by_line)
237
216
        self.add_accel_group(accels)
238
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
 
239
224
        self.add(vbox)
240
225
 
241
226
    def _search_by_text(self, accel_group, window, key, modifiers):
259
244
                tree2 = repository.revision_tree(revision.parent_ids[0])
260
245
            else:
261
246
                tree2 = repository.revision_tree(NULL_REVISION)
262
 
        from bzrlib.plugins.gtk.diff import DiffWindow
 
247
        from bzrlib.plugins.gtk.viz.diffwin import DiffWindow
263
248
        window = DiffWindow()
264
249
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
265
250
        window.set_file(tree1.id2path(self.file_id))
269
254
    def _create_annotate_view(self):
270
255
        tv = gtk.TreeView()
271
256
        tv.set_rules_hint(False)
272
 
        tv.connect("cursor-changed", self._activate_selected_revision)
 
257
        tv.connect("cursor-changed", self._show_log)
273
258
        tv.show()
274
259
        tv.connect("row-activated", self.row_diff)
275
260
 
327
312
    def _create_log_view(self):
328
313
        lv = LogView()
329
314
        lv.show()
 
315
 
330
316
        return lv
331
317
 
332
 
    def _create_back_button(self):
 
318
    def _create_button_box(self):
 
319
        box = gtk.HButtonBox()
 
320
        box.set_layout(gtk.BUTTONBOX_END)
 
321
        box.show()
 
322
 
 
323
        button = gtk.Button()
 
324
        button.set_use_stock(True)
 
325
        button.set_label("gtk-close")
 
326
        button.connect("clicked", lambda w: self.destroy())
 
327
        button.show()
 
328
 
 
329
        box.pack_start(button, expand=False, fill=False)
 
330
 
 
331
        return box
 
332
 
 
333
    def _create_prev_button(self):
 
334
        box = gtk.HButtonBox()
 
335
        box.set_layout(gtk.BUTTONBOX_START)
 
336
        box.show()
 
337
        
333
338
        button = gtk.Button()
334
339
        button.set_use_stock(True)
335
340
        button.set_label("gtk-go-back")
336
341
        button.connect("clicked", lambda w: self.go_back())
337
 
        button.set_relief(gtk.RELIEF_NONE)
338
 
        button.show()
339
 
        return button
340
 
 
341
 
    def _create_forward_button(self):
342
 
        button = gtk.Button()
343
 
        button.set_use_stock(True)
344
 
        button.set_label("gtk-go-forward")
345
 
        button.connect("clicked", lambda w: self.go_forward())
346
 
        button.set_relief(gtk.RELIEF_NONE)
347
 
        button.show()
348
 
        button.set_sensitive(False)
349
 
        return button
 
342
        button.show()
 
343
        box.pack_start(button, expand=False, fill=False)
 
344
        return box
350
345
 
351
346
    def go_back(self):
352
 
        last_tree = self.tree
353
347
        rev_id = self._selected_revision()
354
348
        parent_id = self.revisions[rev_id].parent_ids[0]
355
 
        target_tree = self.branch.repository.revision_tree(parent_id)
356
 
        if self._go(target_tree):
357
 
            self.history.append(last_tree)
358
 
            self.forward_button.set_sensitive(True)
359
 
        else:
360
 
            self._no_back.add(parent_id)
361
 
            self.back_button.set_sensitive(False)
362
 
 
363
 
    def go_forward(self):
364
 
        if len(self.history) == 0:
365
 
            return
366
 
        target_tree = self.history.pop()
367
 
        if len(self.history) == 0:
368
 
            self.forward_button.set_sensitive(False)
369
 
        self._go(target_tree)
370
 
 
371
 
    def _go(self, target_tree):
372
 
        rev_id = self._selected_revision()
373
 
        if self.file_id in target_tree:
374
 
            offset = self.get_scroll_offset(target_tree)
 
349
        tree = self.branch.repository.revision_tree(parent_id)
 
350
        if self.file_id in tree:
 
351
            offset = self.get_scroll_offset(tree)
375
352
            (row,), col = self.annoview.get_cursor()
376
 
            self.annotate(target_tree, self.branch, self.file_id)
377
 
            new_row = row+offset
378
 
            if new_row < 0:
379
 
                new_row = 0
380
 
            self.annoview.set_cursor(new_row)
381
 
            return True
382
 
        else:
383
 
            return False
 
353
            self.annotate(tree, self.branch, self.file_id)
 
354
            self.annoview.set_cursor(row+offset)
384
355
 
385
356
    def get_scroll_offset(self, tree):
386
357
        old = self.tree.get_file(self.file_id)
400
371
    For when a revision is referenced but not present.
401
372
    """
402
373
 
403
 
    def __init__(self, revision_id, committer='?', nick=None):
 
374
    def __init__(self, revision_id, committer='?'):
404
375
        self.revision_id = revision_id
405
376
        self.parent_ids = []
406
377
        self.committer = committer
407
378
        self.message = "?"
408
379
        self.timestamp = 0.0
409
380
        self.timezone = 0
410
 
        self.properties = {}
411
381
 
412
382
 
413
383
class RevisionCache(object):