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
22
23
from bzrlib.config import BranchConfig, GlobalConfig
23
24
from bzrlib.revision import Revision, NULL_REVISION
59
62
monitor = screen.get_monitor_geometry(0)
60
63
width = int(monitor.width * 0.75)
61
64
height = int(monitor.height * 0.75)
65
# user-configured window size
66
size = self._load_size('viz-window-size')
62
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')
65
74
icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
105
114
self.paned = gtk.VPaned()
106
self.paned.pack1(self.construct_top(), resize=True, shrink=False)
107
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)
108
117
self.paned.show()
110
vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
111
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)
113
124
vbox.pack_start(self.paned, expand=True, fill=True)
114
125
vbox.set_focus_child(self.paned)
161
172
view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
162
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)
163
177
view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
165
179
view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
166
180
view_menu_compact.set_active(self.compact_view)
167
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)
169
189
view_menu.add(view_menu_toolbar)
170
190
view_menu.add(view_menu_compact)
191
view_menu.add(view_menu_diffs)
171
192
view_menu.add(gtk.SeparatorMenuItem())
173
194
self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
203
224
go_menu.add(gtk.SeparatorMenuItem())
204
225
go_menu.add(self.go_menu_tags)
206
revision_menu = gtk.Menu()
227
self.revision_menu = RevisionMenu(self.branch.repository, [], self.branch, parent=self)
207
228
revision_menuitem = gtk.MenuItem("_Revision")
208
revision_menuitem.set_submenu(revision_menu)
210
revision_menu_diff = gtk.MenuItem("View Changes")
211
revision_menu_diff.connect('activate',
214
revision_menu_compare = gtk.MenuItem("Compare with...")
215
revision_menu_compare.connect('activate',
216
self._compare_with_cb)
218
revision_menu_tag = gtk.MenuItem("Tag Revision")
219
revision_menu_tag.connect('activate', self._tag_revision_cb)
221
revision_menu.add(revision_menu_tag)
222
revision_menu.add(revision_menu_diff)
223
revision_menu.add(revision_menu_compare)
229
revision_menuitem.set_submenu(self.revision_menu)
225
231
branch_menu = gtk.Menu()
226
232
branch_menuitem = gtk.MenuItem("_Branch")
234
240
except ImportError:
235
241
mutter("Didn't find search plugin")
243
branch_menu.add(gtk.SeparatorMenuItem())
237
245
branch_index_menuitem = gtk.MenuItem("_Index")
238
246
branch_index_menuitem.connect('activate', self._branch_index_cb)
239
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)
241
253
help_menu = gtk.Menu()
242
254
help_menuitem = gtk.MenuItem("_Help")
243
255
help_menuitem.set_submenu(help_menu)
283
295
align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
284
296
align.set_padding(5, 0, 0, 0)
285
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')
311
332
def construct_bottom(self):
312
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
313
338
from bzrlib.plugins.gtk.revisionview import RevisionView
314
339
self.revisionview = RevisionView(branch=self.branch)
315
(width, height) = self.get_size()
316
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')
317
347
self.revisionview.show()
318
348
self.revisionview.set_show_callback(self._show_clicked_cb)
319
349
self.revisionview.connect('notify::revision', self._go_clicked_cb)
320
350
self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
321
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
323
363
def _tag_selected_cb(self, menuitem, revid):
324
364
self.treeview.set_revision_id(revid)
374
416
self.revisionview.set_revision(revision)
375
417
self.revisionview.set_children(children)
419
self.update_diff_panel(revision, parents)
377
421
def _tree_revision_activated(self, widget, path, col):
378
422
# TODO: more than one parent
379
423
"""Callback for when a treeview row gets activated."""
388
432
self.show_diff(revision.revision_id, parent_id)
389
433
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
435
def _back_clicked_cb(self, *args):
405
436
"""Callback for when the back button is clicked."""
406
437
self.treeview.back()
419
450
self.show_diff(revid, parentid)
420
451
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
453
def _set_revision_cb(self, w, revision_id):
439
454
self.treeview.set_revision_id(revision_id)
450
465
self.treeview.set_property('compact', self.compact_view)
451
466
self.treeview.refresh()
453
def _tag_revision_cb(self, w):
455
self.treeview.set_sensitive(False)
456
dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
457
response = dialog.run()
458
if response != gtk.RESPONSE_NONE:
461
if response == gtk.RESPONSE_OK:
462
self.treeview.add_tag(dialog.tagname, dialog._revid)
467
self.treeview.set_sensitive(True)
469
468
def _branch_index_cb(self, w):
470
469
from bzrlib.plugins.search import index as _mod_index
471
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())
473
481
def _about_dialog_cb(self, w):
474
482
from bzrlib.plugins.gtk.about import AboutDialog
482
490
def _toolbar_visibility_changed(self, col):
483
491
if col.get_active():
486
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()
488
510
def _show_about_cb(self, w):
489
511
dialog = AboutDialog()
516
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)
518
568
def show_diff(self, revid=None, parentid=None):
519
569
"""Open a new window to show a diff between the given revisions."""
520
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)