/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
21
22
 
22
23
from bzrlib.config import BranchConfig, GlobalConfig
23
24
from bzrlib.revision import Revision, NULL_REVISION
47
48
        self.maxnum      = maxnum
48
49
        self.config      = GlobalConfig()
49
50
 
 
51
        self._sizes      = {} # window and widget sizes
 
52
 
50
53
        if self.config.get_user_option('viz-compact-view') == 'yes':
51
54
            self.compact_view = True
52
55
        else:
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')
 
67
        if size:
 
68
            width, height = 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')
63
72
 
64
73
        # FIXME AndyFitz!
65
74
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
103
112
        self.add(vbox)
104
113
 
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()
109
118
 
110
 
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
111
 
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
112
 
        
 
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
 
113
124
        vbox.pack_start(self.paned, expand=True, fill=True)
114
125
        vbox.set_focus_child(self.paned)
115
126
 
160
171
 
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)
 
176
            self.toolbar.hide()
163
177
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
164
178
 
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)
168
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
 
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())
172
193
 
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)
205
226
 
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)
209
 
 
210
 
        revision_menu_diff = gtk.MenuItem("View Changes")
211
 
        revision_menu_diff.connect('activate', 
212
 
                self._menu_diff_cb)
213
 
        
214
 
        revision_menu_compare = gtk.MenuItem("Compare with...")
215
 
        revision_menu_compare.connect('activate',
216
 
                self._compare_with_cb)
217
 
 
218
 
        revision_menu_tag = gtk.MenuItem("Tag Revision")
219
 
        revision_menu_tag.connect('activate', self._tag_revision_cb)
220
 
 
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)
224
230
 
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")
236
242
        else:
 
243
            branch_menu.add(gtk.SeparatorMenuItem())
 
244
 
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)
240
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
 
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')
 
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')
286
307
        align.show()
287
308
 
288
309
        return align
310
331
 
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
 
337
 
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')
 
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')
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)
 
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
322
362
 
323
363
    def _tag_selected_cb(self, menuitem, revid):
324
364
        self.treeview.set_revision_id(revid)
329
369
        parents  = self.treeview.get_parents()
330
370
        children = self.treeview.get_children()
331
371
 
 
372
        self.revision_menu.set_revision_ids([revision.revision_id])
 
373
 
332
374
        if revision and revision != NULL_REVISION:
333
375
            prev_menu = gtk.Menu()
334
376
            if len(parents) > 0:
373
415
 
374
416
            self.revisionview.set_revision(revision)
375
417
            self.revisionview.set_children(children)
376
 
    
 
418
 
 
419
            self.update_diff_panel(revision, parents)
 
420
 
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()
390
434
        
391
 
    def _menu_diff_cb(self,w):
392
 
        (path, focus) = self.treeview.treeview.get_cursor()
393
 
        revid = self.treeview.model[path][treemodel.REVID]
394
 
        
395
 
        parentids = self.branch.repository.revision_parents(revid)
396
 
 
397
 
        if len(parentids) == 0:
398
 
            parentid = NULL_REVISION
399
 
        else:
400
 
            parentid = parentids[0]
401
 
        
402
 
        self.show_diff(revid,parentid)    
403
 
 
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()
421
452
 
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"""
425
 
        
426
 
        from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
427
 
        
428
 
        rb = RevisionBrowser(self.branch,self)
429
 
        ret = rb.run()
430
 
        
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)
435
 
            
436
 
        rb.destroy()
437
 
            
438
453
    def _set_revision_cb(self, w, revision_id):
439
454
        self.treeview.set_revision_id(revision_id)
440
455
 
450
465
        self.treeview.set_property('compact', self.compact_view)
451
466
        self.treeview.refresh()
452
467
 
453
 
    def _tag_revision_cb(self, w):
454
 
        try:
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:
459
 
                dialog.hide()
460
 
            
461
 
                if response == gtk.RESPONSE_OK:
462
 
                    self.treeview.add_tag(dialog.tagname, dialog._revid)
463
 
                
464
 
                dialog.destroy()
465
 
 
466
 
        finally:
467
 
            self.treeview.set_sensitive(True)
468
 
 
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
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()
 
480
 
473
481
    def _about_dialog_cb(self, w):
474
482
        from bzrlib.plugins.gtk.about import AboutDialog
475
483
 
481
489
 
482
490
    def _toolbar_visibility_changed(self, col):
483
491
        if col.get_active():
484
 
            self.toolbar.show() 
 
492
            self.toolbar.show()
485
493
        else:
486
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()
487
509
 
488
510
    def _show_about_cb(self, w):
489
511
        dialog = AboutDialog()
515
537
 
516
538
        self.go_menu_tags.show_all()
517
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
 
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
531
581
        window.show()
532
582
 
533
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()