Sigh.  I forgot to commit NEWS before sending.  This is the same 
as before, except with a change summary in NEWS.

This patch does the following:

  - Added a diff panel to 'bzr vis' in the lower-right corner.
  - Made 'bzr vis' remember whether the toolbar is visible.
    (was a test while figuring out how to do the same for the 
    diff panel)
  - Removed some redundant redrawing.
  - Made DiffWidget.set_diff() work more than once.

I plan on making it remember the window and panel sizes too, but 
that's for later.


-- Scott
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [EMAIL PROTECTED]
# target_branch: ../trunk
# testament_sha1: 84eee17d7b9e9ea640bb1efe3ace42d6a08ae870
# timestamp: 2008-07-10 02:01:26 -0600
# source_branch: lp:~toykeeper/bzr-gtk/vis-enhancements
# base_revision_id: [EMAIL PROTECTED]
# 
# Begin patch
=== modified file 'NEWS'
--- NEWS	2008-07-01 21:56:25 +0000
+++ NEWS	2008-07-10 07:58:40 +0000
@@ -11,6 +11,10 @@
 
   * Add "Send Merge Directive" button in bzr viz. (Jelmer Vernooij)
 
+  * Added an optional diff panel to bzr vis.  (Scott Scriven)
+
+  * Made bzr vis remember whether the toolbar is visible.  (Scott Scriven)
+
  BUG FIXES
 
   * Replace _() calls by _i18n() calls. (Vincent Ladeuil, #187283)
@@ -30,6 +34,8 @@
 
   * List network drives in Olive. (Kevin Light, #244308)
 
+  * Removed some redundant screen redrawing in bzr vis.  (Scott Scriven)
+
  CHANGES
 
   * Moved notify icon code to separate script. (Jelmer Vernooij)

=== modified file 'branchview/treeview.py'
--- branchview/treeview.py	2008-06-30 20:11:24 +0000
+++ branchview/treeview.py	2008-07-10 06:23:54 +0000
@@ -325,6 +325,7 @@
         if set_tooltip is not None:
             set_tooltip(treemodel.MESSAGE)
 
+        self._prev_cursor_path = None
         self.treeview.connect("cursor-changed",
                 self._on_selection_changed)
 
@@ -400,7 +401,8 @@
     def _on_selection_changed(self, treeview):
         """callback for when the treeview changes."""
         (path, focus) = treeview.get_cursor()
-        if path is not None:
+        if (path is not None) and (path != self._prev_cursor_path):
+            self._prev_cursor_path = path # avoid emitting twice per click
             self.iter = self.model.get_iter(path)
             self.emit('revision-selected')
 

=== modified file 'diff.py'
--- diff.py	2008-05-22 02:33:40 +0000
+++ diff.py	2008-07-10 07:33:13 +0000
@@ -330,9 +330,10 @@
         # text view
 
     def set_diff_text_sections(self, sections):
-        self.diff_view = DiffFileView()
+        if not hasattr(self, 'diff_view'):
+            self.diff_view = DiffFileView()
+            self.pack2(self.diff_view)
         self.diff_view.show()
-        self.pack2(self.diff_view)
         for oldname, newname, patch in sections:
             self.diff_view._diffs[newname] = str(patch)
             if newname is None:
@@ -346,8 +347,9 @@
         Compares the two trees and populates the window with the
         differences.
         """
-        self.diff_view = DiffView()
-        self.pack2(self.diff_view)
+        if not hasattr(self, 'diff_view'):
+            self.diff_view = DiffView()
+            self.pack2(self.diff_view)
         self.diff_view.show()
         self.diff_view.set_trees(rev_tree, parent_tree)
         self.rev_tree = rev_tree
@@ -380,6 +382,7 @@
                 self.model.append(titer, [ path, path ])
 
         self.treeview.expand_all()
+        self.diff_view.show_diff(None)
 
     def set_file(self, file_path):
         """Select the current file to display"""

=== modified file 'viz/branchwin.py'
--- viz/branchwin.py	2008-07-01 21:54:21 +0000
+++ viz/branchwin.py	2008-07-10 07:33:13 +0000
@@ -108,9 +108,11 @@
         self.paned.pack2(self.construct_bottom(), resize=False, shrink=True)
         self.paned.show()
 
-        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
-        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
-        
+        nav = self.construct_navigation()
+        menubar = self.construct_menubar()
+        vbox.pack_start(menubar, expand=False, fill=True)
+        vbox.pack_start(nav, expand=False, fill=True)
+
         vbox.pack_start(self.paned, expand=True, fill=True)
         vbox.set_focus_child(self.paned)
 
@@ -161,14 +163,24 @@
 
         view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
         view_menu_toolbar.set_active(True)
+        if self.config.get_user_option('viz-toolbar-visible') == 'False':
+            view_menu_toolbar.set_active(False)
+            self.toolbar.hide()
         view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
 
         view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
         view_menu_compact.set_active(self.compact_view)
         view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
 
+        view_menu_diffs = gtk.CheckMenuItem("Show Diffs")
+        view_menu_diffs.set_active(True)
+        if self.config.get_user_option('viz-show-diffs') == 'False':
+            view_menu_diffs.set_active(False)
+        view_menu_diffs.connect('toggled', self._diff_visibility_changed)
+
         view_menu.add(view_menu_toolbar)
         view_menu.add(view_menu_compact)
+        view_menu.add(view_menu_diffs)
         view_menu.add(gtk.SeparatorMenuItem())
 
         self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
@@ -302,15 +314,28 @@
 
     def construct_bottom(self):
         """Construct the bottom half of the window."""
+        self.bottom_hpaned = gtk.HPaned()
+        (width, height) = self.get_size()
+        self.bottom_hpaned.set_size_request(width, int(height / 2.5))
+
         from bzrlib.plugins.gtk.revisionview import RevisionView
         self.revisionview = RevisionView(branch=self.branch)
-        (width, height) = self.get_size()
-        self.revisionview.set_size_request(width, int(height / 2.5))
+        self.revisionview.set_size_request(width/3, int(height / 2.5))
         self.revisionview.show()
         self.revisionview.set_show_callback(self._show_clicked_cb)
         self.revisionview.connect('notify::revision', self._go_clicked_cb)
         self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
-        return self.revisionview
+        self.bottom_hpaned.pack1(self.revisionview)
+
+        from bzrlib.plugins.gtk.diff import DiffWidget
+        self.diff = DiffWidget()
+        self.bottom_hpaned.pack2(self.diff)
+
+        self.bottom_hpaned.show_all()
+        if self.config.get_user_option('viz-show-diffs') == 'False':
+            self.diff.hide()
+
+        return self.bottom_hpaned
 
     def _tag_selected_cb(self, menuitem, revid):
         self.treeview.set_revision_id(revid)
@@ -367,7 +392,9 @@
 
             self.revisionview.set_revision(revision)
             self.revisionview.set_children(children)
-    
+
+            self.update_diff_panel(revision, parents)
+
     def _tree_revision_activated(self, widget, path, col):
         # TODO: more than one parent
         """Callback for when a treeview row gets activated."""
@@ -439,9 +466,18 @@
 
     def _toolbar_visibility_changed(self, col):
         if col.get_active():
-            self.toolbar.show() 
+            self.toolbar.show()
         else:
             self.toolbar.hide()
+        self.config.set_user_option('viz-toolbar-visible', col.get_active())
+
+    def _diff_visibility_changed(self, col):
+        if col.get_active():
+            self.diff.show()
+        else:
+            self.diff.hide()
+        self.config.set_user_option('viz-show-diffs', str(col.get_active()))
+        self.update_diff_panel()
 
     def _show_about_cb(self, w):
         dialog = AboutDialog()
@@ -489,3 +525,25 @@
         window.show()
 
 
+    def update_diff_panel(self, revision=None, parents=None):
+        """Show the current revision in the diff panel."""
+        if self.config.get_user_option('viz-show-diffs') == 'False':
+            return
+
+        if not revision: # default to selected row
+            revision = self.treeview.get_revision()
+        if (not revision) or (revision == NULL_REVISION):
+            return
+
+        if not parents: # default to selected row's parents
+            parents  = self.treeview.get_parents()
+        if len(parents) == 0:
+            parent_id = None
+        else:
+            parent_id = parents[0]
+
+        rev_tree    = self.branch.repository.revision_tree(revision.revision_id)
+        parent_tree = self.branch.repository.revision_tree(parent_id)
+
+        self.diff.set_diff(rev_tree, parent_tree)
+        self.diff.show_all()

# Begin bundle
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
wu5IpwoSCqBYSeA=
-- 
bzr-gtk mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.canonical.com/mailman/listinfo/bzr-gtk

Reply via email to