/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
1 by Scott James Remnant
Commit the first version of bzrk.
1
"""Branch window.
2
3
This module contains the code to manage the branch information window,
4
which contains both the revision graph and details panes.
5
"""
6
671.2.1 by Vincent Ladeuil
Ensure compatibility with PyGtk-2.8.
7
__copyright__ = "Copyright (c) 2005 Canonical Ltd."
1 by Scott James Remnant
Commit the first version of bzrk.
8
__author__    = "Scott James Remnant <scott@ubuntu.com>"
9
10
11
import gtk
12
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
13
from bzrlib.plugins.gtk import icon_path
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
14
from bzrlib.plugins.gtk.branchview import TreeView
338 by Daniel Schierbeck
Added Preferences menu item.
15
from bzrlib.plugins.gtk.preferences import PreferencesWindow
523.3.2 by Jelmer Vernooij
Share same menu for context menu and main menu.
16
from bzrlib.plugins.gtk.revisionmenu import RevisionMenu
17
from bzrlib.plugins.gtk.window import Window
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
18
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
19
from bzrlib.config import GlobalConfig
20
from bzrlib.revision import NULL_REVISION
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
21
from bzrlib.trace import mutter
1 by Scott James Remnant
Commit the first version of bzrk.
22
724 by Jelmer Vernooij
Fix formatting, imports.
23
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
24
class BranchWindow(Window):
1 by Scott James Remnant
Commit the first version of bzrk.
25
    """Branch window.
26
27
    This object represents and manages a single window containing information
28
    for a particular branch.
29
    """
30
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
31
    def __init__(self, branch, start_revs, maxnum, parent=None):
322 by Jelmer Vernooij
Add docstrings.
32
        """Create a new BranchWindow.
33
34
        :param branch: Branch object for branch to show.
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
35
        :param start_revs: Revision ids of top revisions.
322 by Jelmer Vernooij
Add docstrings.
36
        :param maxnum: Maximum number of revisions to display, 
37
                       None for no limit.
38
        """
39
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
40
        Window.__init__(self, parent=parent)
1 by Scott James Remnant
Commit the first version of bzrk.
41
        self.set_border_width(0)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
42
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
43
        self.branch      = branch
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
44
        self.start_revs  = start_revs
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
45
        self.maxnum      = maxnum
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
46
        self.config      = GlobalConfig()
47
48
        if self.config.get_user_option('viz-compact-view') == 'yes':
49
            self.compact_view = True
50
        else:
51
            self.compact_view = False
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
52
630 by Jelmer Vernooij
Use _get_nick(local=True) rather than .nick to get at a branches' nick, since
53
        self.set_title(branch._get_nick(local=True) + " - revision history")
1 by Scott James Remnant
Commit the first version of bzrk.
54
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
55
        # user-configured window size
531.7.10 by Scott Scriven
Simplified size-loading code. No longer saves identical config every time vis runs.
56
        size = self._load_size('viz-window-size')
57
        if size:
58
            width, height = size
555.2.1 by Jasper Groenewegen
Modify DiffWidget to include a checkbutton to wrap long lines in the diff view
59
        else:
60
            # Use three-quarters of the screen by default
61
            screen = self.get_screen()
62
            monitor = screen.get_monitor_geometry(0)
63
            width = int(monitor.width * 0.75)
64
            height = int(monitor.height * 0.75)
1 by Scott James Remnant
Commit the first version of bzrk.
65
        self.set_default_size(width, height)
531.7.8 by Scott Scriven
Made viz window shrinkable.
66
        self.set_size_request(width/3, height/3)
625.1.8 by Torsten Landschoff
Save widget sizes only when closing the BranchWindow.
67
        self._save_size_on_destroy(self, 'viz-window-size')
1 by Scott James Remnant
Commit the first version of bzrk.
68
69
        # FIXME AndyFitz!
70
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
71
        self.set_icon(icon)
72
384 by Daniel Schierbeck
Added accelerator for Next Revision action.
73
        gtk.accel_map_add_entry("<viz>/Go/Next Revision", gtk.keysyms.Up, gtk.gdk.MOD1_MASK)
383 by Daniel Schierbeck
Switched to using symbolic names for keyvals.
74
        gtk.accel_map_add_entry("<viz>/Go/Previous Revision", gtk.keysyms.Down, gtk.gdk.MOD1_MASK)
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
75
        gtk.accel_map_add_entry("<viz>/View/Refresh", gtk.keysyms.F5, 0)
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
76
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
77
        self.accel_group = gtk.AccelGroup()
78
        self.add_accel_group(self.accel_group)
79
671.2.1 by Vincent Ladeuil
Ensure compatibility with PyGtk-2.8.
80
        if getattr(gtk.Action, 'set_tool_item_type', None) is not None:
81
            # Not available before PyGtk-2.10
82
            gtk.Action.set_tool_item_type(gtk.MenuToolButton)
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
83
385 by Daniel Schierbeck
Created a single action for Previous Revision.
84
        self.prev_rev_action = gtk.Action("prev-rev", "_Previous Revision", "Go to the previous revision", gtk.STOCK_GO_DOWN)
85
        self.prev_rev_action.set_accel_path("<viz>/Go/Previous Revision")
86
        self.prev_rev_action.set_accel_group(self.accel_group)
87
        self.prev_rev_action.connect("activate", self._back_clicked_cb)
88
        self.prev_rev_action.connect_accelerator()
89
386 by Daniel Schierbeck
Created a single action for Next Revision.
90
        self.next_rev_action = gtk.Action("next-rev", "_Next Revision", "Go to the next revision", gtk.STOCK_GO_UP)
91
        self.next_rev_action.set_accel_path("<viz>/Go/Next Revision")
92
        self.next_rev_action.set_accel_group(self.accel_group)
93
        self.next_rev_action.connect("activate", self._fwd_clicked_cb)
94
        self.next_rev_action.connect_accelerator()
95
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
96
        self.refresh_action = gtk.Action("refresh", "_Refresh", "Refresh view", gtk.STOCK_REFRESH)
97
        self.refresh_action.set_accel_path("<viz>/View/Refresh")
98
        self.refresh_action.set_accel_group(self.accel_group)
99
        self.refresh_action.connect("activate", self._refresh_clicked)
100
        self.refresh_action.connect_accelerator()
101
713.2.1 by Ximin Luo
Add option to use 'bzr viz' with a vertical layout.
102
        self.vbox = self.construct()
1 by Scott James Remnant
Commit the first version of bzrk.
103
625.1.8 by Torsten Landschoff
Save widget sizes only when closing the BranchWindow.
104
    def _save_size_on_destroy(self, widget, config_name):
105
        """Creates a hook that saves the size of widget to config option 
106
           config_name when the window is destroyed/closed."""
107
        def save_size(src):
108
            width, height = widget.allocation.width, widget.allocation.height
109
            value = '%sx%s' % (width, height)
110
            self.config.set_user_option(config_name, value)
111
        self.connect("destroy", save_size)
112
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
113
    def set_revision(self, revid):
114
        self.treeview.set_revision_id(revid)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
115
1 by Scott James Remnant
Commit the first version of bzrk.
116
    def construct(self):
117
        """Construct the window contents."""
331 by Daniel Schierbeck
Added basic menu bar.
118
        vbox = gtk.VBox(spacing=0)
44 by David Allouche
reorganise branch window
119
        self.add(vbox)
120
713.2.1 by Ximin Luo
Add option to use 'bzr viz' with a vertical layout.
121
        # order is important here
122
        paned = self.construct_paned()
531.7.2 by Scott Scriven
Made 'vis' save/load visibility of its toolbar.
123
        nav = self.construct_navigation()
124
        menubar = self.construct_menubar()
713.2.1 by Ximin Luo
Add option to use 'bzr viz' with a vertical layout.
125
531.7.2 by Scott Scriven
Made 'vis' save/load visibility of its toolbar.
126
        vbox.pack_start(menubar, expand=False, fill=True)
127
        vbox.pack_start(nav, expand=False, fill=True)
713.2.1 by Ximin Luo
Add option to use 'bzr viz' with a vertical layout.
128
        vbox.pack_start(paned, expand=True, fill=True)
129
        vbox.set_focus_child(paned)
44 by David Allouche
reorganise branch window
130
624 by Jelmer Vernooij
Delay registration of signals to prevent problems when signal handlers use not yet constructed widgets.
131
        self.treeview.connect('revision-selected',
132
                self._treeselection_changed_cb)
133
        self.treeview.connect('revision-activated',
134
                self._tree_revision_activated)
135
136
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
44 by David Allouche
reorganise branch window
137
        vbox.show()
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
138
713.2.1 by Ximin Luo
Add option to use 'bzr viz' with a vertical layout.
139
        return vbox
140
141
    def construct_paned(self):
142
        """Construct the main HPaned/VPaned contents."""
143
        if self.config.get_user_option('viz-vertical') == 'True':
144
            self.paned = gtk.HPaned()
145
        else:
146
            self.paned = gtk.VPaned()
147
148
        self.paned.pack1(self.construct_top(), resize=False, shrink=True)
149
        self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
150
        self.paned.show()
151
152
        return self.paned
153
331 by Daniel Schierbeck
Added basic menu bar.
154
    def construct_menubar(self):
155
        menubar = gtk.MenuBar()
156
157
        file_menu = gtk.Menu()
334 by Daniel Schierbeck
Added icons to menus.
158
        file_menuitem = gtk.MenuItem("_File")
331 by Daniel Schierbeck
Added basic menu bar.
159
        file_menuitem.set_submenu(file_menu)
160
362 by Daniel Schierbeck
Added accel group to File -> Close menu item.
161
        file_menu_close = gtk.ImageMenuItem(gtk.STOCK_CLOSE, self.accel_group)
331 by Daniel Schierbeck
Added basic menu bar.
162
        file_menu_close.connect('activate', lambda x: self.destroy())
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
163
363 by Daniel Schierbeck
Added File -> Quit menu item.
164
        file_menu_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.accel_group)
165
        file_menu_quit.connect('activate', lambda x: gtk.main_quit())
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
166
408 by Daniel Schierbeck
Made the close menu item actually appear when the viz is opened from another window.
167
        if self._parent is not None:
406 by Daniel Schierbeck
Made the viz show the close menu item only if opened from another window.
168
            file_menu.add(file_menu_close)
363 by Daniel Schierbeck
Added File -> Quit menu item.
169
        file_menu.add(file_menu_quit)
331 by Daniel Schierbeck
Added basic menu bar.
170
338 by Daniel Schierbeck
Added Preferences menu item.
171
        edit_menu = gtk.Menu()
172
        edit_menuitem = gtk.MenuItem("_Edit")
173
        edit_menuitem.set_submenu(edit_menu)
174
361 by Daniel Schierbeck
Added branch settings menu item.
175
        edit_menu_branchopts = gtk.MenuItem("Branch Settings")
176
        edit_menu_branchopts.connect('activate', lambda x: PreferencesWindow(self.branch.get_config()).show())
177
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
178
        edit_menu_globopts = gtk.MenuItem("Global Settings")
179
        edit_menu_globopts.connect('activate', lambda x: PreferencesWindow().show())
338 by Daniel Schierbeck
Added Preferences menu item.
180
361 by Daniel Schierbeck
Added branch settings menu item.
181
        edit_menu.add(edit_menu_branchopts)
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
182
        edit_menu.add(edit_menu_globopts)
338 by Daniel Schierbeck
Added Preferences menu item.
183
348 by Daniel Schierbeck
Added toggle item for revision number column.
184
        view_menu = gtk.Menu()
185
        view_menuitem = gtk.MenuItem("_View")
186
        view_menuitem.set_submenu(view_menu)
187
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
188
        view_menu_refresh = self.refresh_action.create_menu_item()
189
        view_menu_refresh.connect('activate', self._refresh_clicked)
190
191
        view_menu.add(view_menu_refresh)
192
        view_menu.add(gtk.SeparatorMenuItem())
193
351 by Daniel Schierbeck
Added option to hide the toolbar.
194
        view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
195
        view_menu_toolbar.set_active(True)
531.7.2 by Scott Scriven
Made 'vis' save/load visibility of its toolbar.
196
        if self.config.get_user_option('viz-toolbar-visible') == 'False':
197
            view_menu_toolbar.set_active(False)
198
            self.toolbar.hide()
351 by Daniel Schierbeck
Added option to hide the toolbar.
199
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
200
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
201
        view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
202
        view_menu_compact.set_active(self.compact_view)
203
        view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
204
713.2.1 by Ximin Luo
Add option to use 'bzr viz' with a vertical layout.
205
        view_menu_vertical = gtk.CheckMenuItem("Side-by-side Layout")
206
        view_menu_vertical.set_active(False)
207
        if self.config.get_user_option('viz-vertical') == 'True':
208
            view_menu_vertical.set_active(True)
209
        view_menu_vertical.connect('toggled', self._vertical_layout)
210
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
211
        view_menu_diffs = gtk.CheckMenuItem("Show Diffs")
531.7.12 by Scott Scriven
Made diff panel default to off.
212
        view_menu_diffs.set_active(False)
213
        if self.config.get_user_option('viz-show-diffs') == 'True':
214
            view_menu_diffs.set_active(True)
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
215
        view_menu_diffs.connect('toggled', self._diff_visibility_changed)
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
216
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
217
        view_menu_wide_diffs = gtk.CheckMenuItem("Wide Diffs")
218
        view_menu_wide_diffs.set_active(False)
219
        if self.config.get_user_option('viz-wide-diffs') == 'True':
220
            view_menu_wide_diffs.set_active(True)
221
        view_menu_wide_diffs.connect('toggled', self._diff_placement_changed)
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
222
571 by Jasper Groenewegen
Merge addition of word wrap control to gdiff and visualise windows
223
        view_menu_wrap_diffs = gtk.CheckMenuItem("Wrap _Long Lines in Diffs")
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
224
        view_menu_wrap_diffs.set_active(False)
225
        if self.config.get_user_option('viz-wrap-diffs') == 'True':
226
            view_menu_wrap_diffs.set_active(True)
227
        view_menu_wrap_diffs.connect('toggled', self._diff_wrap_changed)
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
228
351 by Daniel Schierbeck
Added option to hide the toolbar.
229
        view_menu.add(view_menu_toolbar)
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
230
        view_menu.add(view_menu_compact)
713.2.1 by Ximin Luo
Add option to use 'bzr viz' with a vertical layout.
231
        view_menu.add(view_menu_vertical)
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
232
        view_menu.add(gtk.SeparatorMenuItem())
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
233
        view_menu.add(view_menu_diffs)
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
234
        view_menu.add(view_menu_wide_diffs)
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
235
        view_menu.add(view_menu_wrap_diffs)
351 by Daniel Schierbeck
Added option to hide the toolbar.
236
        view_menu.add(gtk.SeparatorMenuItem())
358 by Daniel Schierbeck
Generalized the hiding/showing code.
237
452.4.2 by Jelmer Vernooij
Hide revision number column if more than one branch was specified.
238
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
239
        self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
240
241
        # Revision numbers are pointless if there are multiple branches
242
        if len(self.start_revs) > 1:
243
            self.mnu_show_revno_column.set_sensitive(False)
244
            self.treeview.set_property('revno-column-visible', False)
245
246
        for (col, name) in [(self.mnu_show_revno_column, "revno"), 
247
                            (self.mnu_show_date_column, "date")]:
358 by Daniel Schierbeck
Generalized the hiding/showing code.
248
            col.set_active(self.treeview.get_property(name + "-column-visible"))
249
            col.connect('toggled', self._col_visibility_changed, name)
250
            view_menu.add(col)
348 by Daniel Schierbeck
Added toggle item for revision number column.
251
331 by Daniel Schierbeck
Added basic menu bar.
252
        go_menu = gtk.Menu()
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
253
        go_menu.set_accel_group(self.accel_group)
334 by Daniel Schierbeck
Added icons to menus.
254
        go_menuitem = gtk.MenuItem("_Go")
331 by Daniel Schierbeck
Added basic menu bar.
255
        go_menuitem.set_submenu(go_menu)
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
256
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
257
        go_menu_next = self.next_rev_action.create_menu_item()
258
        go_menu_prev = self.prev_rev_action.create_menu_item()
334 by Daniel Schierbeck
Added icons to menus.
259
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
260
        tag_image = gtk.Image()
261
        tag_image.set_from_file(icon_path("tag-16.png"))
262
        self.go_menu_tags = gtk.ImageMenuItem("_Tags")
263
        self.go_menu_tags.set_image(tag_image)
587 by Jelmer Vernooij
Avoid determining tags until tags widget has been added.
264
        self.treeview.connect('refreshed', lambda w: self._update_tags())
399 by Daniel Schierbeck
Made tags menu insensitive when there are no tags to display.
265
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
266
        go_menu.add(go_menu_next)
267
        go_menu.add(go_menu_prev)
334 by Daniel Schierbeck
Added icons to menus.
268
        go_menu.add(gtk.SeparatorMenuItem())
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
269
        go_menu.add(self.go_menu_tags)
334 by Daniel Schierbeck
Added icons to menus.
270
523.3.2 by Jelmer Vernooij
Share same menu for context menu and main menu.
271
        self.revision_menu = RevisionMenu(self.branch.repository, [], self.branch, parent=self)
335 by Daniel Schierbeck
Added Revision menu.
272
        revision_menuitem = gtk.MenuItem("_Revision")
523.3.2 by Jelmer Vernooij
Share same menu for context menu and main menu.
273
        revision_menuitem.set_submenu(self.revision_menu)
335 by Daniel Schierbeck
Added Revision menu.
274
334 by Daniel Schierbeck
Added icons to menus.
275
        branch_menu = gtk.Menu()
276
        branch_menuitem = gtk.MenuItem("_Branch")
277
        branch_menuitem.set_submenu(branch_menu)
278
336 by Daniel Schierbeck
Changed wording to comply with HIG guidelines.
279
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
280
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
281
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
282
        try:
283
            from bzrlib.plugins import search
284
        except ImportError:
285
            mutter("Didn't find search plugin")
286
        else:
526 by Jelmer Vernooij
Switch to found revision when clicking ok in search window.
287
            branch_menu.add(gtk.SeparatorMenuItem())
288
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
289
            branch_index_menuitem = gtk.MenuItem("_Index")
290
            branch_index_menuitem.connect('activate', self._branch_index_cb)
291
            branch_menu.add(branch_index_menuitem)
292
524 by Jelmer Vernooij
Add search dialog.
293
            branch_search_menuitem = gtk.MenuItem("_Search")
294
            branch_search_menuitem.connect('activate', self._branch_search_cb)
295
            branch_menu.add(branch_search_menuitem)
296
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
297
        help_menu = gtk.Menu()
298
        help_menuitem = gtk.MenuItem("_Help")
299
        help_menuitem.set_submenu(help_menu)
300
301
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
302
        help_about_menuitem.connect('activate', self._about_dialog_cb)
303
304
        help_menu.add(help_about_menuitem)
305
331 by Daniel Schierbeck
Added basic menu bar.
306
        menubar.add(file_menuitem)
338 by Daniel Schierbeck
Added Preferences menu item.
307
        menubar.add(edit_menuitem)
348 by Daniel Schierbeck
Added toggle item for revision number column.
308
        menubar.add(view_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
309
        menubar.add(go_menuitem)
335 by Daniel Schierbeck
Added Revision menu.
310
        menubar.add(revision_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
311
        menubar.add(branch_menuitem)
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
312
        menubar.add(help_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
313
        menubar.show_all()
314
315
        return menubar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
316
317
    def construct_top(self):
318
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
319
        # FIXME: Make broken_line_length configurable
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
320
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
321
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
322
373 by Daniel Schierbeck
Made column display options persisted.
323
        for col in ["revno", "date"]:
324
            option = self.config.get_user_option(col + '-column-visible')
325
            if option is not None:
326
                self.treeview.set_property(col + '-column-visible', option == 'True')
464.1.1 by Adrian Wilkins
Fixed column visibility properties not loading
327
            else:
328
                self.treeview.set_property(col + '-column-visible', False)
373 by Daniel Schierbeck
Made column display options persisted.
329
1 by Scott James Remnant
Commit the first version of bzrk.
330
        self.treeview.show()
331
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
332
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
333
        align.set_padding(5, 0, 0, 0)
334
        align.add(self.treeview)
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
335
        # user-configured size
531.7.10 by Scott Scriven
Simplified size-loading code. No longer saves identical config every time vis runs.
336
        size = self._load_size('viz-graph-size')
337
        if size:
338
            width, height = size
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
339
            align.set_size_request(width, height)
340
        else:
341
            (width, height) = self.get_size()
342
            align.set_size_request(width, int(height / 2.5))
625.1.8 by Torsten Landschoff
Save widget sizes only when closing the BranchWindow.
343
        self._save_size_on_destroy(align, 'viz-graph-size')
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
344
        align.show()
345
346
        return align
44 by David Allouche
reorganise branch window
347
348
    def construct_navigation(self):
349
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
350
        self.toolbar = gtk.Toolbar()
351
        self.toolbar.set_style(gtk.TOOLBAR_BOTH_HORIZ)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
352
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
353
        self.prev_button = self.prev_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
354
        self.toolbar.insert(self.prev_button, -1)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
355
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
356
        self.next_button = self.next_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
357
        self.toolbar.insert(self.next_button, -1)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
358
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
359
        self.toolbar.insert(gtk.SeparatorToolItem(), -1)
360
361
        refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
404 by Daniel Schierbeck
Made the refresh use proper locking.
362
        refresh_button.connect('clicked', self._refresh_clicked)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
363
        self.toolbar.insert(refresh_button, -1)
364
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
365
        self.toolbar.show_all()
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
366
367
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
368
369
    def construct_bottom(self):
370
        """Construct the bottom half of the window."""
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
371
        if self.config.get_user_option('viz-wide-diffs') == 'True':
372
            self.diff_paned = gtk.VPaned()
373
        else:
374
            self.diff_paned = gtk.HPaned()
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
375
        (width, height) = self.get_size()
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
376
        self.diff_paned.set_size_request(20, 20) # shrinkable
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
377
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
378
        from bzrlib.plugins.gtk.revisionview import RevisionView
412.1.2 by Daniel Schierbeck
Moved retrieval of tags into the revisionview itself.
379
        self.revisionview = RevisionView(branch=self.branch)
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
380
        self.revisionview.set_size_request(width/3, int(height / 2.5))
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
381
        # user-configured size
531.7.10 by Scott Scriven
Simplified size-loading code. No longer saves identical config every time vis runs.
382
        size = self._load_size('viz-revisionview-size')
383
        if size:
384
            width, height = size
531.7.9 by Scott Scriven
Made vis remember window and panel sizes.
385
            self.revisionview.set_size_request(width, height)
625.1.8 by Torsten Landschoff
Save widget sizes only when closing the BranchWindow.
386
        self._save_size_on_destroy(self.revisionview, 'viz-revisionview-size')
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
387
        self.revisionview.show()
388
        self.revisionview.set_show_callback(self._show_clicked_cb)
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
389
        self.revisionview.connect('notify::revision', self._go_clicked_cb)
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
390
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
391
        self.diff_paned.pack1(self.revisionview)
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
392
393
        from bzrlib.plugins.gtk.diff import DiffWidget
394
        self.diff = DiffWidget()
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
395
        self.diff_paned.pack2(self.diff)
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
396
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
397
        self.diff_paned.show_all()
531.7.12 by Scott Scriven
Made diff panel default to off.
398
        if self.config.get_user_option('viz-show-diffs') != 'True':
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
399
            self.diff.hide()
400
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
401
        return self.diff_paned
332 by Daniel Schierbeck
Made tag selection work.
402
403
    def _tag_selected_cb(self, menuitem, revid):
356 by Daniel Schierbeck
Made revision a property on TreeView.
404
        self.treeview.set_revision_id(revid)
341 by Daniel Schierbeck
Merged with trunk.
405
280.1.2 by Daniel Schierbeck
Switched to handle the 'changed' signal from the treeview's treeselection instead of the 'cursor-changed' signal from the treeview itself, allowing more flexibility (particularly the ability to handle programmatic selections)
406
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
407
        """callback for when the treeview changes."""
408
        revision = self.treeview.get_revision()
409
        parents  = self.treeview.get_parents()
410
        children = self.treeview.get_children()
411
523.3.2 by Jelmer Vernooij
Share same menu for context menu and main menu.
412
        self.revision_menu.set_revision_ids([revision.revision_id])
413
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
414
        if revision and revision != NULL_REVISION:
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
415
            prev_menu = gtk.Menu()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
416
            if len(parents) > 0:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
417
                self.prev_rev_action.set_sensitive(True)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
418
                for parent_id in parents:
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
419
                    if parent_id and parent_id != NULL_REVISION:
420
                        parent = self.branch.repository.get_revision(parent_id)
421
                        try:
422
                            str = ' (' + parent.properties['branch-nick'] + ')'
423
                        except KeyError:
424
                            str = ""
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
425
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
426
                        item = gtk.MenuItem(parent.message.split("\n")[0] + str)
427
                        item.connect('activate', self._set_revision_cb, parent_id)
428
                        prev_menu.add(item)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
429
                prev_menu.show_all()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
430
            else:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
431
                self.prev_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
432
                prev_menu.hide()
433
671.1.2 by David Roberts
Further consequential changes for PyGtk-2.8
434
            if getattr(self.prev_button, 'set_menu', None) is not None:
724 by Jelmer Vernooij
Fix formatting, imports.
435
                self.prev_button.set_menu(prev_menu)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
436
437
            next_menu = gtk.Menu()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
438
            if len(children) > 0:
386 by Daniel Schierbeck
Created a single action for Next Revision.
439
                self.next_rev_action.set_sensitive(True)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
440
                for child_id in children:
441
                    child = self.branch.repository.get_revision(child_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
442
                    try:
443
                        str = ' (' + child.properties['branch-nick'] + ')'
444
                    except KeyError:
445
                        str = ""
446
447
                    item = gtk.MenuItem(child.message.split("\n")[0] + str)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
448
                    item.connect('activate', self._set_revision_cb, child_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
449
                    next_menu.add(item)
450
                next_menu.show_all()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
451
            else:
386 by Daniel Schierbeck
Created a single action for Next Revision.
452
                self.next_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
453
                next_menu.hide()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
454
671.1.2 by David Roberts
Further consequential changes for PyGtk-2.8
455
            if getattr(self.next_button, 'set_menu', None) is not None:
724 by Jelmer Vernooij
Fix formatting, imports.
456
                self.next_button.set_menu(next_menu)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
457
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
458
            self.revisionview.set_revision(revision)
459
            self.revisionview.set_children(children)
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
460
            self.update_diff_panel(revision, parents)
531.7.1 by Scott Scriven
Added a diff panel to otherwise-blank area in 'bzr vis'.
461
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
462
    def _tree_revision_activated(self, widget, path, col):
463
        # TODO: more than one parent
464
        """Callback for when a treeview row gets activated."""
465
        revision = self.treeview.get_revision()
466
        parents  = self.treeview.get_parents()
467
468
        if len(parents) == 0:
627 by Jelmer Vernooij
Use NULL_REVISION rather than None.
469
            parent_id = NULL_REVISION
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
470
        else:
471
            parent_id = parents[0]
472
473
        self.show_diff(revision.revision_id, parent_id)
474
        self.treeview.grab_focus()
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
475
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
476
    def _back_clicked_cb(self, *args):
477
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
478
        self.treeview.back()
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
479
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
480
    def _fwd_clicked_cb(self, *args):
481
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
482
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
483
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
484
    def _go_clicked_cb(self, w, p):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
485
        """Callback for when the go button for a parent is clicked."""
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
486
        if self.revisionview.get_revision() is not None:
487
            self.treeview.set_revision(self.revisionview.get_revision())
152 by Jelmer Vernooij
Cleanup some more code.
488
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
489
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
490
        """Callback for when the show button for a parent is clicked."""
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
491
        self.show_diff(revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
492
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
493
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
494
    def _set_revision_cb(self, w, revision_id):
356 by Daniel Schierbeck
Made revision a property on TreeView.
495
        self.treeview.set_revision_id(revision_id)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
496
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
497
    def _brokenlines_toggled_cb(self, button):
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
498
        self.compact_view = button.get_active()
499
500
        if self.compact_view:
501
            option = 'yes'
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
502
        else:
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
503
            option = 'no'
504
505
        self.config.set_user_option('viz-compact-view', option)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
506
        self.treeview.set_property('compact', self.compact_view)
507
        self.treeview.refresh()
368 by Daniel Schierbeck
Merged with mainline.
508
511.6.1 by Jelmer Vernooij
Add Branch/Index option if bzr-search is available.
509
    def _branch_index_cb(self, w):
510
        from bzrlib.plugins.search import index as _mod_index
511
        _mod_index.index_url(self.branch.base)
512
524 by Jelmer Vernooij
Add search dialog.
513
    def _branch_search_cb(self, w):
533.11.1 by Jelmer Vernooij
Ask user whether to index if there is no index present yet.
514
        from bzrlib.plugins.search import index as _mod_index
524 by Jelmer Vernooij
Add search dialog.
515
        from bzrlib.plugins.gtk.search import SearchDialog
533.11.1 by Jelmer Vernooij
Ask user whether to index if there is no index present yet.
516
        from bzrlib.plugins.search import errors as search_errors
517
518
        try:
519
            index = _mod_index.open_index_url(self.branch.base)
520
        except search_errors.NoSearchIndex:
521
            dialog = gtk.MessageDialog(self, type=gtk.MESSAGE_QUESTION, 
522
                buttons=gtk.BUTTONS_OK_CANCEL, 
523
                message_format="This branch has not been indexed yet. "
524
                               "Index now?")
525
            if dialog.run() == gtk.RESPONSE_OK:
553 by Jelmer Vernooij
Merge asking the user whether to create an index.
526
                dialog.destroy()
533.11.1 by Jelmer Vernooij
Ask user whether to index if there is no index present yet.
527
                index = _mod_index.index_url(self.branch.base)
528
            else:
553 by Jelmer Vernooij
Merge asking the user whether to create an index.
529
                dialog.destroy()
533.11.1 by Jelmer Vernooij
Ask user whether to index if there is no index present yet.
530
                return
531
532
        dialog = SearchDialog(index)
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
533
526 by Jelmer Vernooij
Switch to found revision when clicking ok in search window.
534
        if dialog.run() == gtk.RESPONSE_OK:
535
            self.set_revision(dialog.get_revision())
536
537
        dialog.destroy()
524 by Jelmer Vernooij
Add search dialog.
538
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
539
    def _about_dialog_cb(self, w):
540
        from bzrlib.plugins.gtk.about import AboutDialog
541
        AboutDialog().run()
542
348 by Daniel Schierbeck
Added toggle item for revision number column.
543
    def _col_visibility_changed(self, col, property):
373 by Daniel Schierbeck
Made column display options persisted.
544
        self.config.set_user_option(property + '-column-visible', col.get_active())
348 by Daniel Schierbeck
Added toggle item for revision number column.
545
        self.treeview.set_property(property + '-column-visible', col.get_active())
351 by Daniel Schierbeck
Added option to hide the toolbar.
546
547
    def _toolbar_visibility_changed(self, col):
548
        if col.get_active():
531.7.2 by Scott Scriven
Made 'vis' save/load visibility of its toolbar.
549
            self.toolbar.show()
351 by Daniel Schierbeck
Added option to hide the toolbar.
550
        else:
551
            self.toolbar.hide()
531.7.2 by Scott Scriven
Made 'vis' save/load visibility of its toolbar.
552
        self.config.set_user_option('viz-toolbar-visible', col.get_active())
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
553
713.2.1 by Ximin Luo
Add option to use 'bzr viz' with a vertical layout.
554
    def _vertical_layout(self, col):
555
        """Toggle the layout vertical/horizontal"""
556
        self.config.set_user_option('viz-vertical', str(col.get_active()))
557
558
        old = self.paned
559
        self.vbox.remove(old)
560
        self.vbox.pack_start(self.construct_paned(), expand=True, fill=True)
561
        self._make_diff_paned_nonzero_size()
562
        self._make_diff_nonzero_size()
563
564
        self.treeview.emit('revision-selected')
565
566
    def _make_diff_paned_nonzero_size(self):
567
        """make sure the diff/revision pane isn't zero-width or zero-height"""
568
        alloc = self.diff_paned.get_allocation()
569
        if (alloc.width < 10) or (alloc.height < 10):
570
            width, height = self.get_size()
571
            self.diff_paned.set_size_request(width/3, int(height / 2.5))
572
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
573
    def _make_diff_nonzero_size(self):
574
        """make sure the diff isn't zero-width or zero-height"""
575
        alloc = self.diff.get_allocation()
576
        if (alloc.width < 10) or (alloc.height < 10):
577
            width, height = self.get_size()
578
            self.revisionview.set_size_request(width/3, int(height / 2.5))
579
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
580
    def _diff_visibility_changed(self, col):
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
581
        """Hide or show the diff panel."""
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
582
        if col.get_active():
583
            self.diff.show()
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
584
            self._make_diff_nonzero_size()
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
585
        else:
586
            self.diff.hide()
587
        self.config.set_user_option('viz-show-diffs', str(col.get_active()))
588
        self.update_diff_panel()
589
531.7.14 by Scott Scriven
Made diff placement configurable (bottom-right, or bottom full-width).
590
    def _diff_placement_changed(self, col):
591
        """Toggle the diff panel's position."""
592
        self.config.set_user_option('viz-wide-diffs', str(col.get_active()))
593
594
        old = self.paned.get_child2()
595
        self.paned.remove(old)
596
        self.paned.pack2(self.construct_bottom(), resize=True, shrink=False)
597
        self._make_diff_nonzero_size()
598
599
        self.treeview.emit('revision-selected')
713 by Jelmer Vernooij
Remove some unused imports, fix some formatting.
600
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
601
    def _diff_wrap_changed(self, widget):
602
        """Toggle word wrap in the diff widget."""
603
        self.config.set_user_option('viz-wrap-diffs', widget.get_active())
604
        self.diff._on_wraplines_toggled(widget)
404 by Daniel Schierbeck
Made the refresh use proper locking.
605
606
    def _refresh_clicked(self, w):
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
607
        self.treeview.refresh()
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
608
609
    def _update_tags(self):
610
        menu = gtk.Menu()
611
612
        if self.branch.supports_tags():
613
            tags = self.branch.tags.get_tag_dict().items()
576.5.1 by Jelmer Vernooij
Disable the ability to click on tags that are not available in the current view.
614
            tags.sort(reverse=True)
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
615
            for tag, revid in tags:
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
616
                tag_image = gtk.Image()
617
                tag_image.set_from_file(icon_path('tag-16.png'))
618
                tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
619
                tag_item.set_image(tag_image)
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
620
                tag_item.connect('activate', self._tag_selected_cb, revid)
576.5.1 by Jelmer Vernooij
Disable the ability to click on tags that are not available in the current view.
621
                tag_item.set_sensitive(self.treeview.has_revision_id(revid))
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
622
                menu.add(tag_item)
623
            self.go_menu_tags.set_submenu(menu)
624
625
            self.go_menu_tags.set_sensitive(len(tags) != 0)
626
        else:
627
            self.go_menu_tags.set_sensitive(False)
628
629
        self.go_menu_tags.show_all()
630
531.7.10 by Scott Scriven
Simplified size-loading code. No longer saves identical config every time vis runs.
631
    def _load_size(self, name):
632
        """Read and parse 'name' from self.config.
633
        The value is a string, formatted as WIDTHxHEIGHT
634
        Returns None, or (width, height)
635
        """
636
        size = self.config.get_user_option(name)
637
        if size:
638
            width, height = [int(num) for num in size.split('x')]
639
            # avoid writing config every time we start
640
            return width, height
641
        return None
642
627 by Jelmer Vernooij
Use NULL_REVISION rather than None.
643
    def show_diff(self, revid=None, parentid=NULL_REVISION):
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
644
        """Open a new window to show a diff between the given revisions."""
645
        from bzrlib.plugins.gtk.diff import DiffWindow
646
        window = DiffWindow(parent=self)
647
648
        rev_tree    = self.branch.repository.revision_tree(revid)
649
        parent_tree = self.branch.repository.revision_tree(parentid)
650
630 by Jelmer Vernooij
Use _get_nick(local=True) rather than .nick to get at a branches' nick, since
651
        description = revid + " - " + self.branch._get_nick(local=True)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
652
        window.set_diff(description, rev_tree, parent_tree)
653
        window.show()
654
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
655
    def update_diff_panel(self, revision=None, parents=None):
656
        """Show the current revision in the diff panel."""
531.7.12 by Scott Scriven
Made diff panel default to off.
657
        if self.config.get_user_option('viz-show-diffs') != 'True':
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
658
            return
659
660
        if not revision: # default to selected row
661
            revision = self.treeview.get_revision()
627 by Jelmer Vernooij
Use NULL_REVISION rather than None.
662
        if revision == NULL_REVISION:
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
663
            return
664
665
        if not parents: # default to selected row's parents
666
            parents  = self.treeview.get_parents()
667
        if len(parents) == 0:
627 by Jelmer Vernooij
Use NULL_REVISION rather than None.
668
            parent_id = NULL_REVISION
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
669
        else:
670
            parent_id = parents[0]
671
672
        rev_tree    = self.branch.repository.revision_tree(revision.revision_id)
673
        parent_tree = self.branch.repository.revision_tree(parent_id)
531.7.5 by Scott Scriven
Fixed DiffWidget so more than one call to set_diff() will work.
674
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
675
        self.diff.set_diff(rev_tree, parent_tree)
555.2.2 by Jasper Groenewegen
Change from checkbox to menu item in bzr vis, add menu bar + item in gdiff
676
        if self.config.get_user_option('viz-wrap-diffs') == 'True':
677
            self.diff._on_wraplines_toggled(wrap=True)
531.7.3 by Scott Scriven
Added an option to show/hide the diff panel.
678
        self.diff.show_all()