26
26
for a particular branch.
29
def __init__(self, parent=None):
30
30
gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
31
31
self.set_border_width(0)
32
32
self.set_title("bzrk")
36
self.connect('key-press-event', self._on_key_pressed)
38
34
# Use three-quarters of the screen by default
39
35
screen = self.get_screen()
40
36
monitor = screen.get_monitor_geometry(0)
77
73
self.treeview = gtk.TreeView()
78
74
self.treeview.set_rules_hint(True)
79
75
self.treeview.set_search_column(4)
80
self.treeview.get_selection().connect("changed", self._treeselection_changed_cb)
76
self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
81
77
self.treeview.connect("row-activated", self._treeview_row_activated_cb)
82
self.treeview.connect("button-release-event",
83
self._treeview_row_mouseclick)
84
78
scrollwin.add(self.treeview)
85
79
self.treeview.show()
153
147
"""Construct the bottom half of the window."""
154
148
from bzrlib.plugins.gtk.logview import LogView
155
149
self.logview = LogView()
150
self.logview.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
151
self.logview.set_shadow_type(gtk.SHADOW_NONE)
156
152
(width, height) = self.get_size()
157
153
self.logview.set_size_request(width, int(height / 2.5))
158
154
self.logview.show()
176
172
gobject.TYPE_PYOBJECT,
179
self.set_title(branch.nick + " - bzrk")
180
gobject.idle_add(self.populate_model, start, maxnum)
182
def populate_model(self, start, maxnum):
186
178
(self.revisions, colours, self.children, self.parent_ids,
187
merge_sorted) = distances(self.branch.repository, start,
179
merge_sorted) = distances(branch, start)
189
180
for (index, (revision, node, lines)) in enumerate(graph(
190
181
self.revisions, colours, merge_sorted)):
191
182
# FIXME: at this point we should be able to show the graph order
202
193
last_lines = lines
203
194
if maxnum is not None and index > maxnum:
197
self.set_title(branch.nick + " - bzrk")
205
198
self.treeview.set_model(self.model)
206
self.treeview.get_selection().select_path(0)
209
def _on_key_pressed(self, widget, event):
210
""" Key press event handler. """
211
keyname = gtk.gdk.keyval_name(event.keyval)
212
func = getattr(self, '_on_key_press_' + keyname, None)
216
def _on_key_press_w(self, event):
217
if event.state & gtk.gdk.CONTROL_MASK:
219
if self._parent is None:
222
def _on_key_press_q(self, event):
223
if event.state & gtk.gdk.CONTROL_MASK:
226
def _treeselection_changed_cb(self, selection, *args):
227
"""Callback for when the treeview changes."""
228
(model, selected_rows) = selection.get_selected_rows()
229
if len(selected_rows) > 0:
230
revision = self.model[selected_rows[0]][0]
232
self.back_button.set_sensitive(len(self.parent_ids[revision]) > 0)
233
self.fwd_button.set_sensitive(len(self.children[revision]) > 0)
235
if self.branch.supports_tags():
236
tagdict = self.branch.tags.get_reverse_tag_dict()
237
if tagdict.has_key(revision.revision_id):
238
tags = tagdict[revision.revision_id]
239
self.logview.set_revision(revision, tags)
200
def _treeview_cursor_cb(self, *args):
201
"""Callback for when the treeview cursor changes."""
202
(path, col) = self.treeview.get_cursor()
203
revision = self.model[path][0]
205
self.back_button.set_sensitive(len(self.parent_ids[revision]) > 0)
206
self.fwd_button.set_sensitive(len(self.children[revision]) > 0)
207
self.logview.set_revision(revision)
241
209
def _back_clicked_cb(self, *args):
242
210
"""Callback for when the back button is clicked."""
280
248
"""Open a new window to show a diff between the given revisions."""
281
249
from bzrlib.plugins.gtk.diff import DiffWindow
282
250
window = DiffWindow()
283
(parent_tree, rev_tree) = branch.repository.revision_trees([parentid,
251
rev_tree = branch.repository.revision_tree(revid)
252
parent_tree = branch.repository.revision_tree(parentid)
285
253
description = revid + " - " + branch.nick
286
254
window.set_diff(description, rev_tree, parent_tree)
291
259
self.show_diff(self.branch, revid, parentid)
292
260
self.treeview.grab_focus()
294
def _treeview_row_mouseclick(self, widget, event):
295
from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
296
if event.button == 3:
297
menu = RevisionPopupMenu(self.branch.repository,
298
[x.revision_id for x in self.selected_revisions()],
300
menu.popup(None, None, None, event.button, event.get_time())
302
def selected_revision(self, path):
303
return self.model[path][0]
305
def selected_revisions(self):
306
return [self.selected_revision(path) for path in \
307
self.treeview.get_selection().get_selected_rows()[1]]
309
262
def _treeview_row_activated_cb(self, widget, path, col):
310
263
# TODO: more than one parent
311
264
"""Callback for when a treeview row gets activated."""
312
revision = self.selected_revision(path)
265
revision = self.model[path][0]
313
266
if len(self.parent_ids[revision]) == 0:
314
267
# Ignore revisions without parent