16
16
from bzrlib.plugins.gtk.window import Window
17
from bzrlib.plugins.gtk import icon_path
18
17
from bzrlib.plugins.gtk.tags import AddTagDialog
19
18
from bzrlib.plugins.gtk.preferences import PreferencesWindow
20
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
22
from bzrlib.config import BranchConfig, GlobalConfig
23
from bzrlib.revision import Revision, NULL_REVISION
24
from bzrlib.trace import mutter
19
from bzrlib.plugins.gtk.branchview import TreeView
20
from bzrlib.revision import Revision
21
from bzrlib.config import BranchConfig
22
from bzrlib.config import GlobalConfig
26
24
class BranchWindow(Window):
30
28
for a particular branch.
33
def __init__(self, branch, start_revs, maxnum, parent=None):
31
def __init__(self, branch, start, maxnum, parent=None):
34
32
"""Create a new BranchWindow.
36
34
:param branch: Branch object for branch to show.
37
:param start_revs: Revision ids of top revisions.
35
:param start: Revision id of top revision.
38
36
:param maxnum: Maximum number of revisions to display,
68
66
gtk.accel_map_add_entry("<viz>/Go/Next Revision", gtk.keysyms.Up, gtk.gdk.MOD1_MASK)
69
67
gtk.accel_map_add_entry("<viz>/Go/Previous Revision", gtk.keysyms.Down, gtk.gdk.MOD1_MASK)
70
gtk.accel_map_add_entry("<viz>/View/Refresh", gtk.keysyms.F5, 0)
72
69
self.accel_group = gtk.AccelGroup()
73
70
self.add_accel_group(self.accel_group)
86
83
self.next_rev_action.connect("activate", self._fwd_clicked_cb)
87
84
self.next_rev_action.connect_accelerator()
89
self.refresh_action = gtk.Action("refresh", "_Refresh", "Refresh view", gtk.STOCK_REFRESH)
90
self.refresh_action.set_accel_path("<viz>/View/Refresh")
91
self.refresh_action.set_accel_group(self.accel_group)
92
self.refresh_action.connect("activate", self._refresh_clicked)
93
self.refresh_action.connect_accelerator()
97
88
def set_revision(self, revid):
110
101
vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
111
102
vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
103
vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
113
105
vbox.pack_start(self.paned, expand=True, fill=True)
114
106
vbox.set_focus_child(self.paned)
152
144
view_menuitem = gtk.MenuItem("_View")
153
145
view_menuitem.set_submenu(view_menu)
155
view_menu_refresh = self.refresh_action.create_menu_item()
156
view_menu_refresh.connect('activate', self._refresh_clicked)
158
view_menu.add(view_menu_refresh)
159
view_menu.add(gtk.SeparatorMenuItem())
161
147
view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
162
148
view_menu_toolbar.set_active(True)
163
149
view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
170
156
view_menu.add(view_menu_compact)
171
157
view_menu.add(gtk.SeparatorMenuItem())
173
self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
174
self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
176
# Revision numbers are pointless if there are multiple branches
177
if len(self.start_revs) > 1:
178
self.mnu_show_revno_column.set_sensitive(False)
179
self.treeview.set_property('revno-column-visible', False)
181
for (col, name) in [(self.mnu_show_revno_column, "revno"),
182
(self.mnu_show_date_column, "date")]:
159
for (label, name) in [("Revision _Number", "revno"), ("_Date", "date")]:
160
col = gtk.CheckMenuItem("Show " + label + " Column")
183
161
col.set_active(self.treeview.get_property(name + "-column-visible"))
184
162
col.connect('toggled', self._col_visibility_changed, name)
185
163
view_menu.add(col)
192
170
go_menu_next = self.next_rev_action.create_menu_item()
193
171
go_menu_prev = self.prev_rev_action.create_menu_item()
195
tag_image = gtk.Image()
196
tag_image.set_from_file(icon_path("tag-16.png"))
197
self.go_menu_tags = gtk.ImageMenuItem("_Tags")
198
self.go_menu_tags.set_image(tag_image)
173
self.go_menu_tags = gtk.MenuItem("_Tags")
199
174
self._update_tags()
201
176
go_menu.add(go_menu_next)
210
185
revision_menu_diff = gtk.MenuItem("View Changes")
211
186
revision_menu_diff.connect('activate',
214
revision_menu_compare = gtk.MenuItem("Compare with...")
215
revision_menu_compare.connect('activate',
216
self._compare_with_cb)
187
lambda w: self.treeview.show_diff())
218
189
revision_menu_tag = gtk.MenuItem("Tag Revision")
219
190
revision_menu_tag.connect('activate', self._tag_revision_cb)
221
192
revision_menu.add(revision_menu_tag)
222
193
revision_menu.add(revision_menu_diff)
223
revision_menu.add(revision_menu_compare)
225
195
branch_menu = gtk.Menu()
226
196
branch_menuitem = gtk.MenuItem("_Branch")
229
199
branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
230
200
branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
233
from bzrlib.plugins import search
235
mutter("Didn't find search plugin")
237
branch_index_menuitem = gtk.MenuItem("_Index")
238
branch_index_menuitem.connect('activate', self._branch_index_cb)
239
branch_menu.add(branch_index_menuitem)
241
help_menu = gtk.Menu()
242
help_menuitem = gtk.MenuItem("_Help")
243
help_menuitem.set_submenu(help_menu)
245
help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
246
help_about_menuitem.connect('activate', self._about_dialog_cb)
248
help_menu.add(help_about_menuitem)
250
202
menubar.add(file_menuitem)
251
203
menubar.add(edit_menuitem)
252
204
menubar.add(view_menuitem)
253
205
menubar.add(go_menuitem)
254
206
menubar.add(revision_menuitem)
255
207
menubar.add(branch_menuitem)
256
menubar.add(help_menuitem)
257
208
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
261
230
def construct_top(self):
262
231
"""Construct the top-half of the window."""
263
232
# FIXME: Make broken_line_length configurable
265
self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
234
self.treeview = TreeView(self.branch, self.start, self.maxnum, self.compact_view)
267
236
self.treeview.connect('revision-selected',
268
237
self._treeselection_changed_cb)
269
self.treeview.connect('revision-activated',
270
self._tree_revision_activated)
239
self.treeview.connect('revisions-loaded',
240
lambda x: self.loading_msg_box.hide())
272
242
self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
329
297
parents = self.treeview.get_parents()
330
298
children = self.treeview.get_children()
332
if revision and revision != NULL_REVISION:
300
if revision is not None:
333
301
prev_menu = gtk.Menu()
334
302
if len(parents) > 0:
335
303
self.prev_rev_action.set_sensitive(True)
336
304
for parent_id in parents:
337
if parent_id and parent_id != NULL_REVISION:
338
parent = self.branch.repository.get_revision(parent_id)
340
str = ' (' + parent.properties['branch-nick'] + ')'
305
parent = self.branch.repository.get_revision(parent_id)
307
str = ' (' + parent.properties['branch-nick'] + ')'
344
item = gtk.MenuItem(parent.message.split("\n")[0] + str)
345
item.connect('activate', self._set_revision_cb, parent_id)
311
item = gtk.MenuItem(parent.message.split("\n")[0] + str)
312
item.connect('activate', self._set_revision_cb, parent_id)
347
314
prev_menu.show_all()
349
316
self.prev_rev_action.set_sensitive(False)
374
341
self.revisionview.set_revision(revision)
375
342
self.revisionview.set_children(children)
377
def _tree_revision_activated(self, widget, path, col):
378
# TODO: more than one parent
379
"""Callback for when a treeview row gets activated."""
380
revision = self.treeview.get_revision()
381
parents = self.treeview.get_parents()
383
if len(parents) == 0:
386
parent_id = parents[0]
388
self.show_diff(revision.revision_id, parent_id)
389
self.treeview.grab_focus()
391
def _menu_diff_cb(self,w):
392
(path, focus) = self.treeview.treeview.get_cursor()
393
revid = self.treeview.model[path][treemodel.REVID]
395
parentids = self.branch.repository.revision_parents(revid)
397
if len(parentids) == 0:
398
parentid = NULL_REVISION
400
parentid = parentids[0]
402
self.show_diff(revid,parentid)
404
344
def _back_clicked_cb(self, *args):
405
345
"""Callback for when the back button is clicked."""
417
357
def _show_clicked_cb(self, revid, parentid):
418
358
"""Callback for when the show button for a parent is clicked."""
419
self.show_diff(revid, parentid)
359
self.treeview.show_diff(revid, parentid)
420
360
self.treeview.grab_focus()
422
def _compare_with_cb(self,w):
423
"""Callback for revision 'compare with' menu. Will show a small
424
dialog with branch revisions to compare with selected revision in TreeView"""
426
from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
428
rb = RevisionBrowser(self.branch,self)
431
if ret == gtk.RESPONSE_OK:
432
(path, focus) = self.treeview.treeview.get_cursor()
433
revid = self.treeview.model[path][treemodel.REVID]
434
self.show_diff(revid, rb.selected_revid)
438
362
def _set_revision_cb(self, w, revision_id):
439
363
self.treeview.set_revision_id(revision_id)
467
391
self.treeview.set_sensitive(True)
469
def _branch_index_cb(self, w):
470
from bzrlib.plugins.search import index as _mod_index
471
_mod_index.index_url(self.branch.base)
473
def _about_dialog_cb(self, w):
474
from bzrlib.plugins.gtk.about import AboutDialog
478
393
def _col_visibility_changed(self, col, property):
479
394
self.config.set_user_option(property + '-column-visible', col.get_active())
480
395
self.treeview.set_property(property + '-column-visible', col.get_active())
503
418
for tag, revid in tags:
504
tag_image = gtk.Image()
505
tag_image.set_from_file(icon_path('tag-16.png'))
506
tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
507
tag_item.set_image(tag_image)
419
tag_item = gtk.MenuItem(tag)
508
420
tag_item.connect('activate', self._tag_selected_cb, revid)
509
421
menu.add(tag_item)
510
422
self.go_menu_tags.set_submenu(menu)
516
428
self.go_menu_tags.show_all()
518
def show_diff(self, revid=None, parentid=None):
519
"""Open a new window to show a diff between the given revisions."""
520
from bzrlib.plugins.gtk.diff import DiffWindow
521
window = DiffWindow(parent=self)
524
parentid = NULL_REVISION
526
rev_tree = self.branch.repository.revision_tree(revid)
527
parent_tree = self.branch.repository.revision_tree(parentid)
529
description = revid + " - " + self.branch.nick
530
window.set_diff(description, rev_tree, parent_tree)