16
16
from bzrlib.plugins.gtk.window import Window
17
17
from bzrlib.plugins.gtk.tags import AddTagDialog
18
18
from bzrlib.plugins.gtk.preferences import PreferencesWindow
19
from bzrlib.plugins.gtk.branchview import TreeView
20
from bzrlib.revision import Revision
19
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
20
from bzrlib.revision import Revision, NULL_REVISION
21
21
from bzrlib.config import BranchConfig
22
22
from bzrlib.config import GlobalConfig
101
101
vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
102
102
vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
103
vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
105
104
vbox.pack_start(self.paned, expand=True, fill=True)
106
105
vbox.set_focus_child(self.paned)
170
169
go_menu_next = self.next_rev_action.create_menu_item()
171
170
go_menu_prev = self.prev_rev_action.create_menu_item()
173
tags_menu = gtk.Menu()
174
go_menu_tags = gtk.MenuItem("_Tags")
175
go_menu_tags.set_submenu(tags_menu)
177
if self.branch.supports_tags():
178
tags = self.branch.tags.get_tag_dict().items()
181
for tag, revid in tags:
182
tag_item = gtk.MenuItem(tag)
183
tag_item.connect('activate', self._tag_selected_cb, revid)
184
tags_menu.add(tag_item)
186
go_menu_tags.set_sensitive(len(tags) != 0)
188
go_menu_tags.set_sensitive(False)
172
self.go_menu_tags = gtk.MenuItem("_Tags")
190
175
go_menu.add(go_menu_next)
191
176
go_menu.add(go_menu_prev)
192
177
go_menu.add(gtk.SeparatorMenuItem())
193
go_menu.add(go_menu_tags)
178
go_menu.add(self.go_menu_tags)
195
180
revision_menu = gtk.Menu()
196
181
revision_menuitem = gtk.MenuItem("_Revision")
213
198
branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
214
199
branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
201
help_menu = gtk.Menu()
202
help_menuitem = gtk.MenuItem("_Help")
203
help_menuitem.set_submenu(help_menu)
205
help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
206
help_about_menuitem.connect('activate', self._about_dialog_cb)
208
help_menu.add(help_about_menuitem)
216
210
menubar.add(file_menuitem)
217
211
menubar.add(edit_menuitem)
218
212
menubar.add(view_menuitem)
219
213
menubar.add(go_menuitem)
220
214
menubar.add(revision_menuitem)
221
215
menubar.add(branch_menuitem)
216
menubar.add(help_menuitem)
222
217
menubar.show_all()
226
def construct_loading_msg(self):
227
image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
228
gtk.ICON_SIZE_BUTTON)
231
label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
232
label_loading.set_alignment(0.0, 0.5)
235
self.loading_msg_box = gtk.HBox()
236
self.loading_msg_box.set_spacing(5)
237
self.loading_msg_box.set_border_width(5)
238
self.loading_msg_box.pack_start(image_loading, False, False)
239
self.loading_msg_box.pack_start(label_loading, True, True)
240
self.loading_msg_box.show()
242
return self.loading_msg_box
244
221
def construct_top(self):
245
222
"""Construct the top-half of the window."""
250
227
self.treeview.connect('revision-selected',
251
228
self._treeselection_changed_cb)
229
self.treeview.connect('revision-activated',
230
self._tree_revision_activated)
253
self.treeview.connect('revisions-loaded',
254
lambda x: self.loading_msg_box.hide())
232
self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
256
234
for col in ["revno", "date"]:
257
235
option = self.config.get_user_option(col + '-column-visible')
297
275
self.revisionview.show()
298
276
self.revisionview.set_show_callback(self._show_clicked_cb)
299
277
self.revisionview.connect('notify::revision', self._go_clicked_cb)
278
self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
300
279
return self.revisionview
302
281
def _tag_selected_cb(self, menuitem, revid):
352
331
self.revisionview.set_revision(revision)
353
332
self.revisionview.set_children(children)
334
def _tree_revision_activated(self, widget, path, col):
335
# TODO: more than one parent
336
"""Callback for when a treeview row gets activated."""
337
revision = self.treeview.get_revision()
338
parents = self.treeview.get_parents()
340
if len(parents) == 0:
343
parent_id = parents[0]
345
self.show_diff(revision.revision_id, parent_id)
346
self.treeview.grab_focus()
355
349
def _back_clicked_cb(self, *args):
356
350
"""Callback for when the back button is clicked."""
368
362
def _show_clicked_cb(self, revid, parentid):
369
363
"""Callback for when the show button for a parent is clicked."""
370
self.treeview.show_diff(revid, parentid)
364
self.show_diff(revid, parentid)
371
365
self.treeview.grab_focus()
373
367
def _set_revision_cb(self, w, revision_id):
388
382
def _tag_revision_cb(self, w):
390
384
self.treeview.set_sensitive(False)
392
385
dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
393
386
response = dialog.run()
394
387
if response != gtk.RESPONSE_NONE:
397
390
if response == gtk.RESPONSE_OK:
399
self.branch.lock_write()
400
self.branch.tags.set_tag(dialog.tagname, dialog._revid)
391
self.treeview.add_tag(dialog.tagname, dialog._revid)
407
self.branch.lock_read()
408
self.treeview.emit("revision-selected")
409
396
self.treeview.set_sensitive(True)
398
def _about_dialog_cb(self, w):
399
from bzrlib.plugins.gtk.about import AboutDialog
411
403
def _col_visibility_changed(self, col, property):
412
404
self.config.set_user_option(property + '-column-visible', col.get_active())
413
405
self.treeview.set_property(property + '-column-visible', col.get_active())
426
418
def _refresh_clicked(self, w):
427
self.treeview.update()
419
self.treeview.refresh()
421
def _update_tags(self):
424
if self.branch.supports_tags():
425
tags = self.branch.tags.get_tag_dict().items()
428
for tag, revid in tags:
429
tag_item = gtk.MenuItem(tag, use_underline=False)
430
tag_item.connect('activate', self._tag_selected_cb, revid)
432
self.go_menu_tags.set_submenu(menu)
434
self.go_menu_tags.set_sensitive(len(tags) != 0)
436
self.go_menu_tags.set_sensitive(False)
438
self.go_menu_tags.show_all()
440
def show_diff(self, revid=None, parentid=None):
441
"""Open a new window to show a diff between the given revisions."""
442
from bzrlib.plugins.gtk.diff import DiffWindow
443
window = DiffWindow(parent=self)
446
parentid = NULL_REVISION
448
rev_tree = self.branch.repository.revision_tree(revid)
449
parent_tree = self.branch.repository.revision_tree(parentid)
451
description = revid + " - " + self.branch.nick
452
window.set_diff(description, rev_tree, parent_tree)