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