45
class GAnnotateWindow(Window):
44
class GAnnotateWindow(gtk.Window):
46
45
"""Annotate window."""
48
def __init__(self, all=False, plain=False, parent=None):
47
def __init__(self, all=False, plain=False):
52
Window.__init__(self, parent)
51
gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
54
53
self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
55
54
self.annotate_colormap = AnnotateColorSaturation()
58
57
self.revisions = {}
62
59
def annotate(self, tree, branch, file_id):
63
60
self.annotations = []
64
61
self.branch = branch
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)()
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:
82
revno = committer = ""
88
84
last_seen = revision.revision_id
89
author = revision.get_apparent_author()
85
committer = revision.committer
91
87
if revision.revision_id not in self.revisions:
92
88
self.revisions[revision.revision_id] = revision
94
90
self.annomodel.append([revision.revision_id,
99
95
line.rstrip("\r\n")
182
178
return self.annomodel[path][REVISION_ID_COL]
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:
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
195
self.back_button.set_sensitive(enable_back)
184
self.logview.set_revision(self.revisions[rev_id])
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()
201
vbox = gtk.VBox(False)
190
vbox = gtk.VBox(False, 12)
191
vbox.set_border_width(12)
204
194
sw = gtk.ScrolledWindow()
207
197
sw.add(self.annoview)
208
198
self.annoview.gwindow = self
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)
221
vbox.pack_start(hbox, expand=False, fill=True)
223
201
self.pane = pane = gtk.VPaned()
225
pane.add2(self.revisionview)
203
pane.add2(self.logview)
227
205
vbox.pack_start(pane, expand=True, fill=True)
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)
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)
222
vbox.pack_start(hbox, expand=False, fill=True)
242
226
def _search_by_text(self, accel_group, window, key, modifiers):
328
312
def _create_log_view(self):
333
def _create_back_button(self):
317
def _create_button_box(self):
318
box = gtk.HButtonBox()
319
box.set_layout(gtk.BUTTONBOX_END)
322
button = gtk.Button()
323
button.set_use_stock(True)
324
button.set_label("gtk-close")
325
button.connect("clicked", lambda w: self.destroy())
328
box.pack_start(button, expand=False, fill=False)
332
def _create_prev_button(self):
333
box = gtk.HButtonBox()
334
box.set_layout(gtk.BUTTONBOX_START)
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)
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)
349
button.set_sensitive(False)
342
box.pack_start(button, expand=False, fill=False)
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)
361
self._no_back.add(parent_id)
362
self.back_button.set_sensitive(False)
364
def go_forward(self):
365
if len(self.history) == 0:
367
target_tree = self.history.pop()
368
if len(self.history) == 0:
369
self.forward_button.set_sensitive(False)
370
self._go(target_tree)
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)
381
self.annoview.set_cursor(new_row)
352
self.annotate(tree, self.branch, self.file_id)
353
self.annoview.set_cursor(row+offset)
386
355
def get_scroll_offset(self, tree):
387
356
old = self.tree.get_file(self.file_id)