Merge lp:~jelmer/bzr-gtk/vertical-layout into lp:bzr-gtk/gtk2

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: 719
Merged at revision: 731
Proposed branch: lp:~jelmer/bzr-gtk/vertical-layout
Merge into: lp:bzr-gtk/gtk2
Diff against target: 301 lines (+90/-33)
3 files modified
NEWS (+5/-0)
branchview/treeview.py (+14/-5)
viz/branchwin.py (+71/-28)
To merge this branch: bzr merge lp:~jelmer/bzr-gtk/vertical-layout
Reviewer Review Type Date Requested Status
John A Meinel Pending
Review via email: mp+57801@code.launchpad.net

This proposal supersedes a proposal from 2011-02-19.

Description of the change

Patch from Ximin Luo to allow using bzr viz in "widescreen mode" where the revision details are shown next to the graph.

https://bugs.launchpad.net/bzr-gtk/+bug/649273/+attachment/1645811/+files/bzr-gtk_vertical.png

To post a comment you must log in.
Revision history for this message
John A Meinel (jameinel) wrote : Posted in a previous version of this proposal

seems fine to me. I'm not 100% sure what to look for (other than noticing that there aren't any tests :).

When I tried this, setting the side-by-side layout did move the objects. However it caused it to stop updating the Revision text when selecting a revision. So i'm pretty sure there is a bug somewhere, where moving the items is causing it to lose linkage to the contents.

review: Needs Fixing
Revision history for this message
Jelmer Vernooij (jelmer) wrote : Posted in a previous version of this proposal

I've reproduced these issues here, they should now be fixed.

Revision history for this message
Jelmer Vernooij (jelmer) wrote :

This works happily here now so I'm going to merge it; I'd be happy to fix any other issues that come up.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'NEWS'
2--- NEWS 2011-03-23 09:49:44 +0000
3+++ NEWS 2011-04-15 01:12:41 +0000
4@@ -41,6 +41,11 @@
5
6 * Add lock dialog. (Daniel Schierbeck, #93652)
7
8+ FEATURES
9+
10+ * Add option to use "bzr viz" with a vertical layout.
11+ (Ximin Luo, #649273)
12+
13 0.99.1 2010-08-26
14
15 BUG FIXES
16
17=== modified file 'branchview/treeview.py'
18--- branchview/treeview.py 2011-03-23 09:49:44 +0000
19+++ branchview/treeview.py 2011-04-15 01:12:41 +0000
20@@ -131,6 +131,7 @@
21 self.maxnum = maxnum
22 self.compact = compact
23
24+ self.model = treemodel.TreeModel(self.branch, [])
25 gobject.idle_add(self.populate)
26
27 self.connect("destroy", self._on_destroy)
28@@ -155,15 +156,23 @@
29 elif property.name == 'branch':
30 return self.branch
31 elif property.name == 'revision':
32+ if self.path is None:
33+ return None
34 return self.model.get_value(self.model.get_iter(self.path),
35 treemodel.REVISION)
36 elif property.name == 'revision-number':
37+ if self.path is None:
38+ return None
39 return self.model.get_value(self.model.get_iter(self.path),
40 treemodel.REVNO)
41 elif property.name == 'children':
42+ if self.path is None:
43+ return None
44 return self.model.get_value(self.model.get_iter(self.path),
45 treemodel.CHILDREN)
46 elif property.name == 'parents':
47+ if self.path is None:
48+ return None
49 return self.model.get_value(self.model.get_iter(self.path),
50 treemodel.PARENTS)
51 else:
52@@ -310,7 +319,7 @@
53 self.mainline_only,
54 self.progress_bar)
55
56- self.model = treemodel.TreeModel(self.branch, linegraphdata)
57+ self.model.line_graph_data = linegraphdata
58 self.graph_cell.columns_len = columns_len
59 width = self.graph_cell.get_size(self.treeview)[2]
60 if width > 500:
61@@ -370,7 +379,7 @@
62 cell.set_property("width-chars", 15)
63 cell.set_property("ellipsize", pango.ELLIPSIZE_END)
64 self.revno_column = gtk.TreeViewColumn("Revision No")
65- self.revno_column.set_resizable(False)
66+ self.revno_column.set_resizable(True)
67 self.revno_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
68 self.revno_column.set_fixed_width(cell.get_size(self.treeview)[2])
69 self.revno_column.pack_start(cell, expand=True)
70@@ -379,7 +388,7 @@
71
72 self.graph_cell = CellRendererGraph()
73 self.graph_column = gtk.TreeViewColumn()
74- self.graph_column.set_resizable(False)
75+ self.graph_column.set_resizable(True)
76 self.graph_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
77 self.graph_column.pack_start(self.graph_cell, expand=True)
78 self.graph_column.add_attribute(self.graph_cell, "node", treemodel.NODE)
79@@ -392,7 +401,7 @@
80 cell.set_property("width-chars", 65)
81 cell.set_property("ellipsize", pango.ELLIPSIZE_END)
82 self.summary_column = gtk.TreeViewColumn("Summary")
83- self.summary_column.set_resizable(False)
84+ self.summary_column.set_resizable(True)
85 self.summary_column.set_expand(True)
86 self.summary_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
87 self.summary_column.set_fixed_width(cell.get_size(self.treeview)[2])
88@@ -416,7 +425,7 @@
89 cell.set_property("ellipsize", pango.ELLIPSIZE_END)
90 self.date_column = gtk.TreeViewColumn("Date")
91 self.date_column.set_visible(False)
92- self.date_column.set_resizable(False)
93+ self.date_column.set_resizable(True)
94 self.date_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
95 self.date_column.set_fixed_width(130)
96 self.date_column.pack_start(cell, expand=True)
97
98=== modified file 'viz/branchwin.py'
99--- viz/branchwin.py 2011-03-14 20:12:19 +0000
100+++ viz/branchwin.py 2011-04-15 01:12:41 +0000
101@@ -99,7 +99,7 @@
102 self.refresh_action.connect("activate", self._refresh_clicked)
103 self.refresh_action.connect_accelerator()
104
105- self.construct()
106+ self.vbox = self.construct()
107
108 def _save_size_on_destroy(self, widget, config_name):
109 """Creates a hook that saves the size of widget to config option
110@@ -118,27 +118,34 @@
111 vbox = gtk.VBox(spacing=0)
112 self.add(vbox)
113
114- self.paned = gtk.VPaned()
115- self.paned.pack1(self.construct_top(), resize=False, shrink=True)
116- self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
117- self.paned.show()
118-
119+ # order is important here
120+ paned = self.construct_paned()
121 nav = self.construct_navigation()
122 menubar = self.construct_menubar()
123+
124 vbox.pack_start(menubar, expand=False, fill=True)
125 vbox.pack_start(nav, expand=False, fill=True)
126-
127- vbox.pack_start(self.paned, expand=True, fill=True)
128- vbox.set_focus_child(self.paned)
129-
130- self.treeview.connect('revision-selected',
131- self._treeselection_changed_cb)
132- self.treeview.connect('revision-activated',
133- self._tree_revision_activated)
134-
135- self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
136+ vbox.pack_start(paned, expand=True, fill=True)
137+ vbox.set_focus_child(paned)
138+
139+
140 vbox.show()
141
142+ return vbox
143+
144+ def construct_paned(self):
145+ """Construct the main HPaned/VPaned contents."""
146+ if self.config.get_user_option('viz-vertical') == 'True':
147+ self.paned = gtk.HPaned()
148+ else:
149+ self.paned = gtk.VPaned()
150+
151+ self.paned.pack1(self.construct_top(), resize=False, shrink=True)
152+ self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
153+ self.paned.show()
154+
155+ return self.paned
156+
157 def construct_menubar(self):
158 menubar = gtk.MenuBar()
159
160@@ -190,6 +197,12 @@
161 view_menu_compact.set_active(self.compact_view)
162 view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
163
164+ view_menu_vertical = gtk.CheckMenuItem("Side-by-side Layout")
165+ view_menu_vertical.set_active(False)
166+ if self.config.get_user_option('viz-vertical') == 'True':
167+ view_menu_vertical.set_active(True)
168+ view_menu_vertical.connect('toggled', self._vertical_layout)
169+
170 view_menu_diffs = gtk.CheckMenuItem("Show Diffs")
171 view_menu_diffs.set_active(False)
172 if self.config.get_user_option('viz-show-diffs') == 'True':
173@@ -210,6 +223,7 @@
174
175 view_menu.add(view_menu_toolbar)
176 view_menu.add(view_menu_compact)
177+ view_menu.add(view_menu_vertical)
178 view_menu.add(gtk.SeparatorMenuItem())
179 view_menu.add(view_menu_diffs)
180 view_menu.add(view_menu_wide_diffs)
181@@ -249,7 +263,8 @@
182 go_menu.add(gtk.SeparatorMenuItem())
183 go_menu.add(self.go_menu_tags)
184
185- self.revision_menu = RevisionMenu(self.branch.repository, [], self.branch, parent=self)
186+ self.revision_menu = RevisionMenu(self.branch.repository, [],
187+ self.branch, parent=self)
188 revision_menuitem = gtk.MenuItem("_Revision")
189 revision_menuitem.set_submenu(self.revision_menu)
190
191@@ -279,7 +294,8 @@
192 help_menuitem = gtk.MenuItem("_Help")
193 help_menuitem.set_submenu(help_menu)
194
195- help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
196+ help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT,
197+ self.accel_group)
198 help_about_menuitem.connect('activate', self._about_dialog_cb)
199
200 help_menu.add(help_about_menuitem)
201@@ -299,12 +315,14 @@
202 """Construct the top-half of the window."""
203 # FIXME: Make broken_line_length configurable
204
205- self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
206+ self.treeview = TreeView(self.branch, self.start_revs, self.maxnum,
207+ self.compact_view)
208
209 for col in ["revno", "date"]:
210 option = self.config.get_user_option(col + '-column-visible')
211 if option is not None:
212- self.treeview.set_property(col + '-column-visible', option == 'True')
213+ self.treeview.set_property(col + '-column-visible',
214+ option == 'True')
215 else:
216 self.treeview.set_property(col + '-column-visible', False)
217
218@@ -368,7 +386,12 @@
219 self.revisionview.show()
220 self.revisionview.set_show_callback(self._show_clicked_cb)
221 self.revisionview.connect('notify::revision', self._go_clicked_cb)
222- self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
223+ self.treeview.connect('tag-added',
224+ lambda w, t, r: self.revisionview.update_tags())
225+ self.treeview.connect('revision-selected',
226+ self._treeselection_changed_cb)
227+ self.treeview.connect('revision-activated',
228+ self._tree_revision_activated)
229 self.diff_paned.pack1(self.revisionview)
230
231 from bzrlib.plugins.gtk.diff import DiffWidget
232@@ -390,9 +413,8 @@
233 parents = self.treeview.get_parents()
234 children = self.treeview.get_children()
235
236- self.revision_menu.set_revision_ids([revision.revision_id])
237-
238- if revision and revision != NULL_REVISION:
239+ if revision and revision.revision_id != NULL_REVISION:
240+ self.revision_menu.set_revision_ids([revision.revision_id])
241 prev_menu = gtk.Menu()
242 if len(parents) > 0:
243 self.prev_rev_action.set_sensitive(True)
244@@ -400,7 +422,7 @@
245 if parent_id and parent_id != NULL_REVISION:
246 parent = self.branch.repository.get_revision(parent_id)
247 try:
248- str = ' (' + parent.properties['branch-nick'] + ')'
249+ str = ' (%s)' % parent.properties['branch-nick']
250 except KeyError:
251 str = ""
252
253@@ -421,7 +443,7 @@
254 for child_id in children:
255 child = self.branch.repository.get_revision(child_id)
256 try:
257- str = ' (' + child.properties['branch-nick'] + ')'
258+ str = ' (%s)' % child.properties['branch-nick']
259 except KeyError:
260 str = ""
261
262@@ -492,9 +514,11 @@
263 _mod_index.index_url(self.branch.base)
264
265 def _branch_search_cb(self, w):
266- from bzrlib.plugins.search import index as _mod_index
267+ from bzrlib.plugins.search import (
268+ index as _mod_index,
269+ errors as search_errors,
270+ )
271 from bzrlib.plugins.gtk.search import SearchDialog
272- from bzrlib.plugins.search import errors as search_errors
273
274 try:
275 index = _mod_index.open_index_url(self.branch.base)
276@@ -532,6 +556,25 @@
277 self.toolbar.hide()
278 self.config.set_user_option('viz-toolbar-visible', col.get_active())
279
280+ def _vertical_layout(self, col):
281+ """Toggle the layout vertical/horizontal"""
282+ self.config.set_user_option('viz-vertical', str(col.get_active()))
283+
284+ old = self.paned
285+ self.vbox.remove(old)
286+ self.vbox.pack_start(self.construct_paned(), expand=True, fill=True)
287+ self._make_diff_paned_nonzero_size()
288+ self._make_diff_nonzero_size()
289+
290+ self.treeview.emit('revision-selected')
291+
292+ def _make_diff_paned_nonzero_size(self):
293+ """make sure the diff/revision pane isn't zero-width or zero-height"""
294+ alloc = self.diff_paned.get_allocation()
295+ if (alloc.width < 10) or (alloc.height < 10):
296+ width, height = self.get_size()
297+ self.diff_paned.set_size_request(width/3, int(height / 2.5))
298+
299 def _make_diff_nonzero_size(self):
300 """make sure the diff isn't zero-width or zero-height"""
301 alloc = self.diff.get_allocation()

Subscribers

People subscribed via source and target branches

to all changes: