/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: Jelmer Vernooij
  • Date: 2008-07-18 12:29:56 UTC
  • mfrom: (531.7.14 vis-enhancements)
  • Revision ID: jelmer@samba.org-20080718122956-27468cxu2b613ib8
Merge diff widget in viz.

Show diffs side-by-side

added added

removed removed

Lines of Context:
48
48
        self.maxnum      = maxnum
49
49
        self.config      = GlobalConfig()
50
50
 
 
51
        self._sizes      = {} # window and widget sizes
 
52
 
51
53
        if self.config.get_user_option('viz-compact-view') == 'yes':
52
54
            self.compact_view = True
53
55
        else:
60
62
        monitor = screen.get_monitor_geometry(0)
61
63
        width = int(monitor.width * 0.75)
62
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
63
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
72
 
65
73
        # FIXME AndyFitz!
66
74
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
104
112
        self.add(vbox)
105
113
 
106
114
        self.paned = gtk.VPaned()
107
 
        self.paned.pack1(self.construct_top(), resize=True, shrink=False)
108
 
        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)
109
117
        self.paned.show()
110
118
 
111
 
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
112
 
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
113
 
        
 
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
 
114
124
        vbox.pack_start(self.paned, expand=True, fill=True)
115
125
        vbox.set_focus_child(self.paned)
116
126
 
161
171
 
162
172
        view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
163
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()
164
177
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
165
178
 
166
179
        view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
167
180
        view_menu_compact.set_active(self.compact_view)
168
181
        view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
169
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
 
 
189
        view_menu_wide_diffs = gtk.CheckMenuItem("Wide Diffs")
 
190
        view_menu_wide_diffs.set_active(False)
 
191
        if self.config.get_user_option('viz-wide-diffs') == 'True':
 
192
            view_menu_wide_diffs.set_active(True)
 
193
        view_menu_wide_diffs.connect('toggled', self._diff_placement_changed)
 
194
 
170
195
        view_menu.add(view_menu_toolbar)
171
196
        view_menu.add(view_menu_compact)
 
197
        view_menu.add(view_menu_diffs)
 
198
        view_menu.add(view_menu_wide_diffs)
172
199
        view_menu.add(gtk.SeparatorMenuItem())
173
200
 
174
201
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
275
302
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
276
303
        align.set_padding(5, 0, 0, 0)
277
304
        align.add(self.treeview)
 
305
        # user-configured size
 
306
        size = self._load_size('viz-graph-size')
 
307
        if size:
 
308
            width, height = size
 
309
            align.set_size_request(width, height)
 
310
        else:
 
311
            (width, height) = self.get_size()
 
312
            align.set_size_request(width, int(height / 2.5))
 
313
        align.connect('size-allocate', self._on_size_allocate, 'viz-graph-size')
278
314
        align.show()
279
315
 
280
316
        return align
302
338
 
303
339
    def construct_bottom(self):
304
340
        """Construct the bottom half of the window."""
 
341
        if self.config.get_user_option('viz-wide-diffs') == 'True':
 
342
            self.diff_paned = gtk.VPaned()
 
343
        else:
 
344
            self.diff_paned = gtk.HPaned()
 
345
        (width, height) = self.get_size()
 
346
        self.diff_paned.set_size_request(20, 20) # shrinkable
 
347
 
305
348
        from bzrlib.plugins.gtk.revisionview import RevisionView
306
349
        self.revisionview = RevisionView(branch=self.branch)
307
 
        (width, height) = self.get_size()
308
 
        self.revisionview.set_size_request(width, int(height / 2.5))
 
350
        self.revisionview.set_size_request(width/3, int(height / 2.5))
 
351
        # user-configured size
 
352
        size = self._load_size('viz-revisionview-size')
 
353
        if size:
 
354
            width, height = size
 
355
            self.revisionview.set_size_request(width, height)
 
356
        self.revisionview.connect('size-allocate', self._on_size_allocate, 'viz-revisionview-size')
309
357
        self.revisionview.show()
310
358
        self.revisionview.set_show_callback(self._show_clicked_cb)
311
359
        self.revisionview.connect('notify::revision', self._go_clicked_cb)
312
360
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
313
 
        return self.revisionview
 
361
        self.diff_paned.pack1(self.revisionview)
 
362
 
 
363
        from bzrlib.plugins.gtk.diff import DiffWidget
 
364
        self.diff = DiffWidget()
 
365
        self.diff_paned.pack2(self.diff)
 
366
 
 
367
        self.diff_paned.show_all()
 
368
        if self.config.get_user_option('viz-show-diffs') != 'True':
 
369
            self.diff.hide()
 
370
 
 
371
        return self.diff_paned
314
372
 
315
373
    def _tag_selected_cb(self, menuitem, revid):
316
374
        self.treeview.set_revision_id(revid)
367
425
 
368
426
            self.revisionview.set_revision(revision)
369
427
            self.revisionview.set_children(children)
370
 
    
 
428
 
 
429
            self.update_diff_panel(revision, parents)
 
430
 
371
431
    def _tree_revision_activated(self, widget, path, col):
372
432
        # TODO: more than one parent
373
433
        """Callback for when a treeview row gets activated."""
439
499
 
440
500
    def _toolbar_visibility_changed(self, col):
441
501
        if col.get_active():
442
 
            self.toolbar.show() 
 
502
            self.toolbar.show()
443
503
        else:
444
504
            self.toolbar.hide()
 
505
        self.config.set_user_option('viz-toolbar-visible', col.get_active())
 
506
 
 
507
    def _make_diff_nonzero_size(self):
 
508
        """make sure the diff isn't zero-width or zero-height"""
 
509
        alloc = self.diff.get_allocation()
 
510
        if (alloc.width < 10) or (alloc.height < 10):
 
511
            width, height = self.get_size()
 
512
            self.revisionview.set_size_request(width/3, int(height / 2.5))
 
513
 
 
514
    def _diff_visibility_changed(self, col):
 
515
        """Hide or show the diff panel."""
 
516
        if col.get_active():
 
517
            self.diff.show()
 
518
            self._make_diff_nonzero_size()
 
519
        else:
 
520
            self.diff.hide()
 
521
        self.config.set_user_option('viz-show-diffs', str(col.get_active()))
 
522
        self.update_diff_panel()
 
523
 
 
524
    def _diff_placement_changed(self, col):
 
525
        """Toggle the diff panel's position."""
 
526
        self.config.set_user_option('viz-wide-diffs', str(col.get_active()))
 
527
 
 
528
        old = self.paned.get_child2()
 
529
        self.paned.remove(old)
 
530
        self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
 
531
        self._make_diff_nonzero_size()
 
532
 
 
533
        self.treeview.emit('revision-selected')
445
534
 
446
535
    def _show_about_cb(self, w):
447
536
        dialog = AboutDialog()
473
562
 
474
563
        self.go_menu_tags.show_all()
475
564
 
 
565
    def _load_size(self, name):
 
566
        """Read and parse 'name' from self.config.
 
567
        The value is a string, formatted as WIDTHxHEIGHT
 
568
        Returns None, or (width, height)
 
569
        """
 
570
        size = self.config.get_user_option(name)
 
571
        if size:
 
572
            width, height = [int(num) for num in size.split('x')]
 
573
            # avoid writing config every time we start
 
574
            self._sizes[name] = (width, height)
 
575
            return width, height
 
576
        return None
 
577
 
 
578
    def _on_size_allocate(self, widget, allocation, name):
 
579
        """When window has been resized, save the new size."""
 
580
        width, height = 0, 0
 
581
        if name in self._sizes:
 
582
            width, height = self._sizes[name]
 
583
 
 
584
        size_changed = (width != allocation.width) or \
 
585
                (height != allocation.height)
 
586
 
 
587
        if size_changed:
 
588
            width, height = allocation.width, allocation.height
 
589
            self._sizes[name] = (width, height)
 
590
            value = '%sx%s' % (width, height)
 
591
            self.config.set_user_option(name, value)
 
592
 
476
593
    def show_diff(self, revid=None, parentid=None):
477
594
        """Open a new window to show a diff between the given revisions."""
478
595
        from bzrlib.plugins.gtk.diff import DiffWindow
488
605
        window.set_diff(description, rev_tree, parent_tree)
489
606
        window.show()
490
607
 
491
 
 
 
608
    def update_diff_panel(self, revision=None, parents=None):
 
609
        """Show the current revision in the diff panel."""
 
610
        if self.config.get_user_option('viz-show-diffs') != 'True':
 
611
            return
 
612
 
 
613
        if not revision: # default to selected row
 
614
            revision = self.treeview.get_revision()
 
615
        if (not revision) or (revision == NULL_REVISION):
 
616
            return
 
617
 
 
618
        if not parents: # default to selected row's parents
 
619
            parents  = self.treeview.get_parents()
 
620
        if len(parents) == 0:
 
621
            parent_id = None
 
622
        else:
 
623
            parent_id = parents[0]
 
624
 
 
625
        rev_tree    = self.branch.repository.revision_tree(revision.revision_id)
 
626
        parent_tree = self.branch.repository.revision_tree(parent_id)
 
627
 
 
628
        self.diff.set_diff(rev_tree, parent_tree)
 
629
        self.diff.show_all()