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