16
16
from bzrlib.plugins.gtk.window import Window
17
from bzrlib.plugins.gtk import icon_path
17
18
from bzrlib.plugins.gtk.tags import AddTagDialog
18
19
from bzrlib.plugins.gtk.preferences import PreferencesWindow
19
from bzrlib.plugins.gtk.branchview import TreeView
20
from bzrlib.revision import Revision
20
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
21
from bzrlib.revision import Revision, NULL_REVISION
21
22
from bzrlib.config import BranchConfig
22
23
from bzrlib.config import GlobalConfig
28
29
for a particular branch.
31
def __init__(self, branch, start, maxnum, parent=None):
32
def __init__(self, branch, start_revs, maxnum, parent=None):
32
33
"""Create a new BranchWindow.
34
35
:param branch: Branch object for branch to show.
35
:param start: Revision id of top revision.
36
:param start_revs: Revision ids of top revisions.
36
37
:param maxnum: Maximum number of revisions to display,
101
102
vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
102
103
vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
103
vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
105
105
vbox.pack_start(self.paned, expand=True, fill=True)
106
106
vbox.set_focus_child(self.paned)
156
156
view_menu.add(view_menu_compact)
157
157
view_menu.add(gtk.SeparatorMenuItem())
159
for (label, name) in [("Revision _Number", "revno"), ("_Date", "date")]:
160
col = gtk.CheckMenuItem("Show " + label + " Column")
159
self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
160
self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
162
# Revision numbers are pointless if there are multiple branches
163
if len(self.start_revs) > 1:
164
self.mnu_show_revno_column.set_sensitive(False)
165
self.treeview.set_property('revno-column-visible', False)
167
for (col, name) in [(self.mnu_show_revno_column, "revno"),
168
(self.mnu_show_date_column, "date")]:
161
169
col.set_active(self.treeview.get_property(name + "-column-visible"))
162
170
col.connect('toggled', self._col_visibility_changed, name)
163
171
view_menu.add(col)
170
178
go_menu_next = self.next_rev_action.create_menu_item()
171
179
go_menu_prev = self.prev_rev_action.create_menu_item()
173
self.go_menu_tags = gtk.MenuItem("_Tags")
181
tag_image = gtk.Image()
182
tag_image.set_from_file(icon_path("tag-16.png"))
183
self.go_menu_tags = gtk.ImageMenuItem("_Tags")
184
self.go_menu_tags.set_image(tag_image)
174
185
self._update_tags()
176
187
go_menu.add(go_menu_next)
185
196
revision_menu_diff = gtk.MenuItem("View Changes")
186
197
revision_menu_diff.connect('activate',
187
lambda w: self.treeview.show_diff())
200
revision_menu_compare = gtk.MenuItem("Compare with...")
201
revision_menu_compare.connect('activate',
202
self._compare_with_cb)
189
204
revision_menu_tag = gtk.MenuItem("Tag Revision")
190
205
revision_menu_tag.connect('activate', self._tag_revision_cb)
192
207
revision_menu.add(revision_menu_tag)
193
208
revision_menu.add(revision_menu_diff)
209
revision_menu.add(revision_menu_compare)
195
211
branch_menu = gtk.Menu()
196
212
branch_menuitem = gtk.MenuItem("_Branch")
199
215
branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
200
216
branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
218
help_menu = gtk.Menu()
219
help_menuitem = gtk.MenuItem("_Help")
220
help_menuitem.set_submenu(help_menu)
222
help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
223
help_about_menuitem.connect('activate', self._about_dialog_cb)
225
help_menu.add(help_about_menuitem)
202
227
menubar.add(file_menuitem)
203
228
menubar.add(edit_menuitem)
204
229
menubar.add(view_menuitem)
205
230
menubar.add(go_menuitem)
206
231
menubar.add(revision_menuitem)
207
232
menubar.add(branch_menuitem)
233
menubar.add(help_menuitem)
208
234
menubar.show_all()
212
def construct_loading_msg(self):
213
image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
214
gtk.ICON_SIZE_BUTTON)
217
label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
218
label_loading.set_alignment(0.0, 0.5)
221
self.loading_msg_box = gtk.HBox()
222
self.loading_msg_box.set_spacing(5)
223
self.loading_msg_box.set_border_width(5)
224
self.loading_msg_box.pack_start(image_loading, False, False)
225
self.loading_msg_box.pack_start(label_loading, True, True)
226
self.loading_msg_box.show()
228
return self.loading_msg_box
230
238
def construct_top(self):
231
239
"""Construct the top-half of the window."""
232
240
# FIXME: Make broken_line_length configurable
234
self.treeview = TreeView(self.branch, self.start, self.maxnum, self.compact_view)
242
self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
236
244
self.treeview.connect('revision-selected',
237
245
self._treeselection_changed_cb)
239
self.treeview.connect('revisions-loaded',
240
lambda x: self.loading_msg_box.hide())
246
self.treeview.connect('revision-activated',
247
self._tree_revision_activated)
242
249
self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
297
306
parents = self.treeview.get_parents()
298
307
children = self.treeview.get_children()
300
if revision is not None:
309
if revision and revision != NULL_REVISION:
301
310
prev_menu = gtk.Menu()
302
311
if len(parents) > 0:
303
312
self.prev_rev_action.set_sensitive(True)
304
313
for parent_id in parents:
305
parent = self.branch.repository.get_revision(parent_id)
307
str = ' (' + parent.properties['branch-nick'] + ')'
314
if parent_id and parent_id != NULL_REVISION:
315
parent = self.branch.repository.get_revision(parent_id)
317
str = ' (' + parent.properties['branch-nick'] + ')'
311
item = gtk.MenuItem(parent.message.split("\n")[0] + str)
312
item.connect('activate', self._set_revision_cb, parent_id)
321
item = gtk.MenuItem(parent.message.split("\n")[0] + str)
322
item.connect('activate', self._set_revision_cb, parent_id)
314
324
prev_menu.show_all()
316
326
self.prev_rev_action.set_sensitive(False)
341
351
self.revisionview.set_revision(revision)
342
352
self.revisionview.set_children(children)
354
def _tree_revision_activated(self, widget, path, col):
355
# TODO: more than one parent
356
"""Callback for when a treeview row gets activated."""
357
revision = self.treeview.get_revision()
358
parents = self.treeview.get_parents()
360
if len(parents) == 0:
363
parent_id = parents[0]
365
self.show_diff(revision.revision_id, parent_id)
366
self.treeview.grab_focus()
368
def _menu_diff_cb(self,w):
369
(path, focus) = self.treeview.treeview.get_cursor()
370
revid = self.treeview.model[path][treemodel.REVID]
372
parentids = self.branch.repository.revision_parents(revid)
374
if len(parentids) == 0:
375
parentid = NULL_REVISION
377
parentid = parentids[0]
379
self.show_diff(revid,parentid)
344
381
def _back_clicked_cb(self, *args):
345
382
"""Callback for when the back button is clicked."""
357
394
def _show_clicked_cb(self, revid, parentid):
358
395
"""Callback for when the show button for a parent is clicked."""
359
self.treeview.show_diff(revid, parentid)
396
self.show_diff(revid, parentid)
360
397
self.treeview.grab_focus()
399
def _compare_with_cb(self,w):
400
"""Callback for revision 'compare with' menu. Will show a small
401
dialog with branch revisions to compare with selected revision in TreeView"""
403
from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
405
rb = RevisionBrowser(self.branch,self)
408
if ret == gtk.RESPONSE_OK:
409
(path, focus) = self.treeview.treeview.get_cursor()
410
revid = self.treeview.model[path][treemodel.REVID]
411
self.show_diff(revid, rb.selected_revid)
362
415
def _set_revision_cb(self, w, revision_id):
363
416
self.treeview.set_revision_id(revision_id)
391
444
self.treeview.set_sensitive(True)
446
def _about_dialog_cb(self, w):
447
from bzrlib.plugins.gtk.about import AboutDialog
393
451
def _col_visibility_changed(self, col, property):
394
452
self.config.set_user_option(property + '-column-visible', col.get_active())
395
453
self.treeview.set_property(property + '-column-visible', col.get_active())
418
476
for tag, revid in tags:
419
tag_item = gtk.MenuItem(tag)
477
tag_image = gtk.Image()
478
tag_image.set_from_file(icon_path('tag-16.png'))
479
tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
480
tag_item.set_image(tag_image)
420
481
tag_item.connect('activate', self._tag_selected_cb, revid)
421
482
menu.add(tag_item)
422
483
self.go_menu_tags.set_submenu(menu)
428
489
self.go_menu_tags.show_all()
491
def show_diff(self, revid=None, parentid=None):
492
"""Open a new window to show a diff between the given revisions."""
493
from bzrlib.plugins.gtk.diff import DiffWindow
494
window = DiffWindow(parent=self)
497
parentid = NULL_REVISION
499
rev_tree = self.branch.repository.revision_tree(revid)
500
parent_tree = self.branch.repository.revision_tree(parentid)
502
description = revid + " - " + self.branch.nick
503
window.set_diff(description, rev_tree, parent_tree)