/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to viz/branchwin.py

  • Committer: Scott Scriven
  • Date: 2008-07-17 11:24:26 UTC
  • mto: This revision was merged to the branch mainline in revision 549.
  • Revision ID: ubuntu@toykeeper.net-20080717112426-mqjnn717ja3bqqjt
Removed exception-swallowing hasattr()s.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
import gobject
14
14
import pango
15
15
 
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
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
24
26
 
25
27
class BranchWindow(Window):
26
28
    """Branch window.
46
48
        self.maxnum      = maxnum
47
49
        self.config      = GlobalConfig()
48
50
 
 
51
        self._sizes      = {} # window and widget sizes
 
52
 
49
53
        if self.config.get_user_option('viz-compact-view') == 'yes':
50
54
            self.compact_view = True
51
55
        else:
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')
 
67
        if size:
 
68
            width, height = 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')
62
72
 
63
73
        # FIXME AndyFitz!
64
74
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
102
112
        self.add(vbox)
103
113
 
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()
108
118
 
109
 
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
110
 
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
111
 
        
 
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)
 
123
 
112
124
        vbox.pack_start(self.paned, expand=True, fill=True)
113
125
        vbox.set_focus_child(self.paned)
114
126
 
159
171
 
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)
 
176
            self.toolbar.hide()
162
177
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
163
178
 
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)
167
182
 
 
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)
 
188
 
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())
171
193
 
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)
204
226
 
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)
208
 
 
209
 
        revision_menu_diff = gtk.MenuItem("View Changes")
210
 
        revision_menu_diff.connect('activate', 
211
 
                self._menu_diff_cb)
212
 
        
213
 
        revision_menu_compare = gtk.MenuItem("Compare with...")
214
 
        revision_menu_compare.connect('activate',
215
 
                self._compare_with_cb)
216
 
 
217
 
        revision_menu_tag = gtk.MenuItem("Tag Revision")
218
 
        revision_menu_tag.connect('activate', self._tag_revision_cb)
219
 
 
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)
223
230
 
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"))
230
237
 
 
238
        try:
 
239
            from bzrlib.plugins import search
 
240
        except ImportError:
 
241
            mutter("Didn't find search plugin")
 
242
        else:
 
243
            branch_menu.add(gtk.SeparatorMenuItem())
 
244
 
 
245
            branch_index_menuitem = gtk.MenuItem("_Index")
 
246
            branch_index_menuitem.connect('activate', self._branch_index_cb)
 
247
            branch_menu.add(branch_index_menuitem)
 
248
 
 
249
            branch_search_menuitem = gtk.MenuItem("_Search")
 
250
            branch_search_menuitem.connect('activate', self._branch_search_cb)
 
251
            branch_menu.add(branch_search_menuitem)
 
252
 
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')
 
300
        if size:
 
301
            width, height = size
 
302
            align.set_size_request(width, height)
 
303
        else:
 
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')
276
307
        align.show()
277
308
 
278
309
        return align
300
331
 
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
 
337
 
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')
 
343
        if size:
 
344
            width, height = 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)
 
352
 
 
353
        from bzrlib.plugins.gtk.diff import DiffWidget
 
354
        self.diff = DiffWidget()
 
355
        self.bottom_hpaned.pack2(self.diff)
 
356
 
 
357
        self.bottom_hpaned.show_all()
 
358
        if self.config.get_user_option('viz-show-diffs') != 'True':
 
359
            self.diff.hide()
 
360
 
 
361
        return self.bottom_hpaned
312
362
 
313
363
    def _tag_selected_cb(self, menuitem, revid):
314
364
        self.treeview.set_revision_id(revid)
319
369
        parents  = self.treeview.get_parents()
320
370
        children = self.treeview.get_children()
321
371
 
 
372
        self.revision_menu.set_revision_ids([revision.revision_id])
 
373
 
322
374
        if revision and revision != NULL_REVISION:
323
375
            prev_menu = gtk.Menu()
324
376
            if len(parents) > 0:
363
415
 
364
416
            self.revisionview.set_revision(revision)
365
417
            self.revisionview.set_children(children)
366
 
    
 
418
 
 
419
            self.update_diff_panel(revision, parents)
 
420
 
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()
380
434
        
381
 
    def _menu_diff_cb(self,w):
382
 
        (path, focus) = self.treeview.treeview.get_cursor()
383
 
        revid = self.treeview.model[path][treemodel.REVID]
384
 
        
385
 
        parentids = self.branch.repository.revision_parents(revid)
386
 
 
387
 
        if len(parentids) == 0:
388
 
            parentid = NULL_REVISION
389
 
        else:
390
 
            parentid = parentids[0]
391
 
        
392
 
        self.show_diff(revid,parentid)    
393
 
 
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()
411
452
 
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"""
415
 
        
416
 
        from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
417
 
        
418
 
        rb = RevisionBrowser(self.branch,self)
419
 
        ret = rb.run()
420
 
        
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)
425
 
            
426
 
        rb.destroy()
427
 
            
428
453
    def _set_revision_cb(self, w, revision_id):
429
454
        self.treeview.set_revision_id(revision_id)
430
455
 
440
465
        self.treeview.set_property('compact', self.compact_view)
441
466
        self.treeview.refresh()
442
467
 
443
 
    def _tag_revision_cb(self, w):
444
 
        try:
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:
449
 
                dialog.hide()
450
 
            
451
 
                if response == gtk.RESPONSE_OK:
452
 
                    self.treeview.add_tag(dialog.tagname, dialog._revid)
453
 
                
454
 
                dialog.destroy()
455
 
 
456
 
        finally:
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)
 
471
 
 
472
    def _branch_search_cb(self, w):
 
473
        from bzrlib.plugins.gtk.search import SearchDialog
 
474
        dialog = SearchDialog(self.branch)
 
475
        
 
476
        if dialog.run() == gtk.RESPONSE_OK:
 
477
            self.set_revision(dialog.get_revision())
 
478
 
 
479
        dialog.destroy()
458
480
 
459
481
    def _about_dialog_cb(self, w):
460
482
        from bzrlib.plugins.gtk.about import AboutDialog
467
489
 
468
490
    def _toolbar_visibility_changed(self, col):
469
491
        if col.get_active():
470
 
            self.toolbar.show() 
 
492
            self.toolbar.show()
471
493
        else:
472
494
            self.toolbar.hide()
 
495
        self.config.set_user_option('viz-toolbar-visible', col.get_active())
 
496
 
 
497
    def _diff_visibility_changed(self, col):
 
498
        if col.get_active():
 
499
            self.diff.show()
 
500
            # make sure the diff isn't zero-width
 
501
            alloc = self.diff.get_allocation()
 
502
            if alloc.width < 10:
 
503
                width, height = self.get_size()
 
504
                self.revisionview.set_size_request(width/3, int(height / 2.5))
 
505
        else:
 
506
            self.diff.hide()
 
507
        self.config.set_user_option('viz-show-diffs', str(col.get_active()))
 
508
        self.update_diff_panel()
473
509
 
474
510
    def _show_about_cb(self, w):
475
511
        dialog = AboutDialog()
501
537
 
502
538
        self.go_menu_tags.show_all()
503
539
 
 
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)
 
544
        """
 
545
        size = self.config.get_user_option(name)
 
546
        if size:
 
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)
 
550
            return width, height
 
551
        return None
 
552
 
 
553
    def _on_size_allocate(self, widget, allocation, name):
 
554
        """When window has been resized, save the new size."""
 
555
        width, height = 0, 0
 
556
        if name in self._sizes:
 
557
            width, height = self._sizes[name]
 
558
 
 
559
        size_changed = (width != allocation.width) or \
 
560
                (height != allocation.height)
 
561
 
 
562
        if size_changed:
 
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)
 
567
 
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
517
581
        window.show()
518
582
 
519
583
 
 
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':
 
587
            return
 
588
 
 
589
        if not revision: # default to selected row
 
590
            revision = self.treeview.get_revision()
 
591
        if (not revision) or (revision == NULL_REVISION):
 
592
            return
 
593
 
 
594
        if not parents: # default to selected row's parents
 
595
            parents  = self.treeview.get_parents()
 
596
        if len(parents) == 0:
 
597
            parent_id = None
 
598
        else:
 
599
            parent_id = parents[0]
 
600
 
 
601
        rev_tree    = self.branch.repository.revision_tree(revision.revision_id)
 
602
        parent_tree = self.branch.repository.revision_tree(parent_id)
 
603
 
 
604
        self.diff.set_diff(rev_tree, parent_tree)
 
605
        self.diff.show_all()