16
from bzrlib.plugins.gtk.window import Window
17
16
from bzrlib.plugins.gtk import icon_path
17
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
18
18
from bzrlib.plugins.gtk.tags import AddTagDialog
19
19
from bzrlib.plugins.gtk.preferences import PreferencesWindow
20
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
20
from bzrlib.plugins.gtk.revisionmenu import RevisionMenu
21
from bzrlib.plugins.gtk.window import Window
23
from bzrlib.config import BranchConfig, GlobalConfig
21
24
from bzrlib.revision import Revision, NULL_REVISION
22
from bzrlib.config import BranchConfig
23
from bzrlib.config import GlobalConfig
25
from bzrlib.trace import mutter
25
27
class BranchWindow(Window):
58
62
monitor = screen.get_monitor_geometry(0)
59
63
width = int(monitor.width * 0.75)
60
64
height = int(monitor.height * 0.75)
65
# user-configured window size
66
size = self._load_size('viz-window-size')
61
69
self.set_default_size(width, height)
70
self.set_size_request(width/3, height/3)
71
self.connect("size-allocate", self._on_size_allocate, 'viz-window-size')
64
74
icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
104
114
self.paned = gtk.VPaned()
105
self.paned.pack1(self.construct_top(), resize=True, shrink=False)
106
self.paned.pack2(self.construct_bottom(), resize=False, shrink=True)
115
self.paned.pack1(self.construct_top(), resize=False, shrink=True)
116
self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
107
117
self.paned.show()
109
vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
110
vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
119
nav = self.construct_navigation()
120
menubar = self.construct_menubar()
121
vbox.pack_start(menubar, expand=False, fill=True)
122
vbox.pack_start(nav, expand=False, fill=True)
112
124
vbox.pack_start(self.paned, expand=True, fill=True)
113
125
vbox.set_focus_child(self.paned)
160
172
view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
161
173
view_menu_toolbar.set_active(True)
174
if self.config.get_user_option('viz-toolbar-visible') == 'False':
175
view_menu_toolbar.set_active(False)
162
177
view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
164
179
view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
165
180
view_menu_compact.set_active(self.compact_view)
166
181
view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
183
view_menu_diffs = gtk.CheckMenuItem("Show Diffs")
184
view_menu_diffs.set_active(False)
185
if self.config.get_user_option('viz-show-diffs') == 'True':
186
view_menu_diffs.set_active(True)
187
view_menu_diffs.connect('toggled', self._diff_visibility_changed)
168
189
view_menu.add(view_menu_toolbar)
169
190
view_menu.add(view_menu_compact)
191
view_menu.add(view_menu_diffs)
170
192
view_menu.add(gtk.SeparatorMenuItem())
172
194
self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
202
224
go_menu.add(gtk.SeparatorMenuItem())
203
225
go_menu.add(self.go_menu_tags)
205
revision_menu = gtk.Menu()
227
self.revision_menu = RevisionMenu(self.branch.repository, [], self.branch, parent=self)
206
228
revision_menuitem = gtk.MenuItem("_Revision")
207
revision_menuitem.set_submenu(revision_menu)
209
revision_menu_diff = gtk.MenuItem("View Changes")
210
revision_menu_diff.connect('activate',
213
revision_menu_compare = gtk.MenuItem("Compare with...")
214
revision_menu_compare.connect('activate',
215
self._compare_with_cb)
217
revision_menu_tag = gtk.MenuItem("Tag Revision")
218
revision_menu_tag.connect('activate', self._tag_revision_cb)
220
revision_menu.add(revision_menu_tag)
221
revision_menu.add(revision_menu_diff)
222
revision_menu.add(revision_menu_compare)
229
revision_menuitem.set_submenu(self.revision_menu)
224
231
branch_menu = gtk.Menu()
225
232
branch_menuitem = gtk.MenuItem("_Branch")
228
235
branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
229
236
branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
239
from bzrlib.plugins import search
241
mutter("Didn't find search plugin")
243
branch_menu.add(gtk.SeparatorMenuItem())
245
branch_index_menuitem = gtk.MenuItem("_Index")
246
branch_index_menuitem.connect('activate', self._branch_index_cb)
247
branch_menu.add(branch_index_menuitem)
249
branch_search_menuitem = gtk.MenuItem("_Search")
250
branch_search_menuitem.connect('activate', self._branch_search_cb)
251
branch_menu.add(branch_search_menuitem)
231
253
help_menu = gtk.Menu()
232
254
help_menuitem = gtk.MenuItem("_Help")
233
255
help_menuitem.set_submenu(help_menu)
273
295
align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
274
296
align.set_padding(5, 0, 0, 0)
275
297
align.add(self.treeview)
298
# user-configured size
299
size = self._load_size('viz-graph-size')
302
align.set_size_request(width, height)
304
(width, height) = self.get_size()
305
align.set_size_request(width, int(height / 2.5))
306
align.connect('size-allocate', self._on_size_allocate, 'viz-graph-size')
301
332
def construct_bottom(self):
302
333
"""Construct the bottom half of the window."""
334
self.bottom_hpaned = gtk.HPaned()
335
(width, height) = self.get_size()
336
self.bottom_hpaned.set_size_request(20, 20) # shrinkable
303
338
from bzrlib.plugins.gtk.revisionview import RevisionView
304
339
self.revisionview = RevisionView(branch=self.branch)
305
(width, height) = self.get_size()
306
self.revisionview.set_size_request(width, int(height / 2.5))
340
self.revisionview.set_size_request(width/3, int(height / 2.5))
341
# user-configured size
342
size = self._load_size('viz-revisionview-size')
345
self.revisionview.set_size_request(width, height)
346
self.revisionview.connect('size-allocate', self._on_size_allocate, 'viz-revisionview-size')
307
347
self.revisionview.show()
308
348
self.revisionview.set_show_callback(self._show_clicked_cb)
309
349
self.revisionview.connect('notify::revision', self._go_clicked_cb)
310
350
self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
311
return self.revisionview
351
self.bottom_hpaned.pack1(self.revisionview)
353
from bzrlib.plugins.gtk.diff import DiffWidget
354
self.diff = DiffWidget()
355
self.bottom_hpaned.pack2(self.diff)
357
self.bottom_hpaned.show_all()
358
if self.config.get_user_option('viz-show-diffs') != 'True':
361
return self.bottom_hpaned
313
363
def _tag_selected_cb(self, menuitem, revid):
314
364
self.treeview.set_revision_id(revid)
364
416
self.revisionview.set_revision(revision)
365
417
self.revisionview.set_children(children)
419
self.update_diff_panel(revision, parents)
367
421
def _tree_revision_activated(self, widget, path, col):
368
422
# TODO: more than one parent
369
423
"""Callback for when a treeview row gets activated."""
378
432
self.show_diff(revision.revision_id, parent_id)
379
433
self.treeview.grab_focus()
381
def _menu_diff_cb(self,w):
382
(path, focus) = self.treeview.treeview.get_cursor()
383
revid = self.treeview.model[path][treemodel.REVID]
385
parentids = self.branch.repository.revision_parents(revid)
387
if len(parentids) == 0:
388
parentid = NULL_REVISION
390
parentid = parentids[0]
392
self.show_diff(revid,parentid)
394
435
def _back_clicked_cb(self, *args):
395
436
"""Callback for when the back button is clicked."""
396
437
self.treeview.back()
409
450
self.show_diff(revid, parentid)
410
451
self.treeview.grab_focus()
412
def _compare_with_cb(self,w):
413
"""Callback for revision 'compare with' menu. Will show a small
414
dialog with branch revisions to compare with selected revision in TreeView"""
416
from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
418
rb = RevisionBrowser(self.branch,self)
421
if ret == gtk.RESPONSE_OK:
422
(path, focus) = self.treeview.treeview.get_cursor()
423
revid = self.treeview.model[path][treemodel.REVID]
424
self.show_diff(revid, rb.selected_revid)
428
453
def _set_revision_cb(self, w, revision_id):
429
454
self.treeview.set_revision_id(revision_id)
440
465
self.treeview.set_property('compact', self.compact_view)
441
466
self.treeview.refresh()
443
def _tag_revision_cb(self, w):
445
self.treeview.set_sensitive(False)
446
dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
447
response = dialog.run()
448
if response != gtk.RESPONSE_NONE:
451
if response == gtk.RESPONSE_OK:
452
self.treeview.add_tag(dialog.tagname, dialog._revid)
457
self.treeview.set_sensitive(True)
468
def _branch_index_cb(self, w):
469
from bzrlib.plugins.search import index as _mod_index
470
_mod_index.index_url(self.branch.base)
472
def _branch_search_cb(self, w):
473
from bzrlib.plugins.gtk.search import SearchDialog
474
dialog = SearchDialog(self.branch)
476
if dialog.run() == gtk.RESPONSE_OK:
477
self.set_revision(dialog.get_revision())
459
481
def _about_dialog_cb(self, w):
460
482
from bzrlib.plugins.gtk.about import AboutDialog
468
490
def _toolbar_visibility_changed(self, col):
469
491
if col.get_active():
472
494
self.toolbar.hide()
495
self.config.set_user_option('viz-toolbar-visible', col.get_active())
497
def _diff_visibility_changed(self, col):
500
# make sure the diff isn't zero-width
501
alloc = self.diff.get_allocation()
503
width, height = self.get_size()
504
self.revisionview.set_size_request(width/3, int(height / 2.5))
507
self.config.set_user_option('viz-show-diffs', str(col.get_active()))
508
self.update_diff_panel()
474
510
def _show_about_cb(self, w):
475
511
dialog = AboutDialog()
502
538
self.go_menu_tags.show_all()
540
def _load_size(self, name):
541
"""Read and parse 'name' from self.config.
542
The value is a string, formatted as WIDTHxHEIGHT
543
Returns None, or (width, height)
545
size = self.config.get_user_option(name)
547
width, height = [int(num) for num in size.split('x')]
548
# avoid writing config every time we start
549
self._sizes[name] = (width, height)
553
def _on_size_allocate(self, widget, allocation, name):
554
"""When window has been resized, save the new size."""
556
if name in self._sizes:
557
width, height = self._sizes[name]
559
size_changed = (width != allocation.width) or \
560
(height != allocation.height)
563
width, height = allocation.width, allocation.height
564
self._sizes[name] = (width, height)
565
value = '%sx%s' % (width, height)
566
self.config.set_user_option(name, value)
504
568
def show_diff(self, revid=None, parentid=None):
505
569
"""Open a new window to show a diff between the given revisions."""
506
570
from bzrlib.plugins.gtk.diff import DiffWindow
584
def update_diff_panel(self, revision=None, parents=None):
585
"""Show the current revision in the diff panel."""
586
if self.config.get_user_option('viz-show-diffs') != 'True':
589
if not revision: # default to selected row
590
revision = self.treeview.get_revision()
591
if (not revision) or (revision == NULL_REVISION):
594
if not parents: # default to selected row's parents
595
parents = self.treeview.get_parents()
596
if len(parents) == 0:
599
parent_id = parents[0]
601
rev_tree = self.branch.repository.revision_tree(revision.revision_id)
602
parent_tree = self.branch.repository.revision_tree(parent_id)
604
self.diff.set_diff(rev_tree, parent_tree)