/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
# -*- coding: UTF-8 -*-
2
"""Branch window.
3
4
This module contains the code to manage the branch information window,
5
which contains both the revision graph and details panes.
6
"""
7
8
__copyright__ = "Copyright © 2005 Canonical Ltd."
9
__author__    = "Scott James Remnant <scott@ubuntu.com>"
10
11
12
import gtk
13
import gobject
14
import pango
15
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
16
from bzrlib.plugins.gtk.window import Window
365 by Daniel Schierbeck
Fixed locks and made tagging work.
17
from bzrlib.plugins.gtk.tags import AddTagDialog
338 by Daniel Schierbeck
Added Preferences menu item.
18
from bzrlib.plugins.gtk.preferences import PreferencesWindow
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
19
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
443 by Szilveszter Farkas (Phanatic)
Trivial fix for #149061 (be able to show the diff for revision 1).
20
from bzrlib.revision import Revision, NULL_REVISION
361 by Daniel Schierbeck
Added branch settings menu item.
21
from bzrlib.config import BranchConfig
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
22
from bzrlib.config import GlobalConfig
1 by Scott James Remnant
Commit the first version of bzrk.
23
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
24
class BranchWindow(Window):
1 by Scott James Remnant
Commit the first version of bzrk.
25
    """Branch window.
26
27
    This object represents and manages a single window containing information
28
    for a particular branch.
29
    """
30
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
31
    def __init__(self, branch, start_revs, maxnum, parent=None):
322 by Jelmer Vernooij
Add docstrings.
32
        """Create a new BranchWindow.
33
34
        :param branch: Branch object for branch to show.
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
35
        :param start_revs: Revision ids of top revisions.
322 by Jelmer Vernooij
Add docstrings.
36
        :param maxnum: Maximum number of revisions to display, 
37
                       None for no limit.
38
        """
39
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
40
        Window.__init__(self, parent=parent)
1 by Scott James Remnant
Commit the first version of bzrk.
41
        self.set_border_width(0)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
42
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
43
        self.branch      = branch
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
44
        self.start_revs  = start_revs
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
45
        self.maxnum      = maxnum
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
46
        self.config      = GlobalConfig()
47
48
        if self.config.get_user_option('viz-compact-view') == 'yes':
49
            self.compact_view = True
50
        else:
51
            self.compact_view = False
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
52
53
        self.set_title(branch.nick + " - revision history")
1 by Scott James Remnant
Commit the first version of bzrk.
54
55
        # Use three-quarters of the screen by default
56
        screen = self.get_screen()
4 by Scott James Remnant
Use the size of the first monitor rather than the entire screen
57
        monitor = screen.get_monitor_geometry(0)
58
        width = int(monitor.width * 0.75)
59
        height = int(monitor.height * 0.75)
1 by Scott James Remnant
Commit the first version of bzrk.
60
        self.set_default_size(width, height)
61
62
        # FIXME AndyFitz!
63
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
64
        self.set_icon(icon)
65
384 by Daniel Schierbeck
Added accelerator for Next Revision action.
66
        gtk.accel_map_add_entry("<viz>/Go/Next Revision", gtk.keysyms.Up, gtk.gdk.MOD1_MASK)
383 by Daniel Schierbeck
Switched to using symbolic names for keyvals.
67
        gtk.accel_map_add_entry("<viz>/Go/Previous Revision", gtk.keysyms.Down, gtk.gdk.MOD1_MASK)
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
68
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
69
        self.accel_group = gtk.AccelGroup()
70
        self.add_accel_group(self.accel_group)
71
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
72
        gtk.Action.set_tool_item_type(gtk.MenuToolButton)
73
385 by Daniel Schierbeck
Created a single action for Previous Revision.
74
        self.prev_rev_action = gtk.Action("prev-rev", "_Previous Revision", "Go to the previous revision", gtk.STOCK_GO_DOWN)
75
        self.prev_rev_action.set_accel_path("<viz>/Go/Previous Revision")
76
        self.prev_rev_action.set_accel_group(self.accel_group)
77
        self.prev_rev_action.connect("activate", self._back_clicked_cb)
78
        self.prev_rev_action.connect_accelerator()
79
386 by Daniel Schierbeck
Created a single action for Next Revision.
80
        self.next_rev_action = gtk.Action("next-rev", "_Next Revision", "Go to the next revision", gtk.STOCK_GO_UP)
81
        self.next_rev_action.set_accel_path("<viz>/Go/Next Revision")
82
        self.next_rev_action.set_accel_group(self.accel_group)
83
        self.next_rev_action.connect("activate", self._fwd_clicked_cb)
84
        self.next_rev_action.connect_accelerator()
85
1 by Scott James Remnant
Commit the first version of bzrk.
86
        self.construct()
87
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
88
    def set_revision(self, revid):
89
        self.treeview.set_revision_id(revid)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
90
1 by Scott James Remnant
Commit the first version of bzrk.
91
    def construct(self):
92
        """Construct the window contents."""
331 by Daniel Schierbeck
Added basic menu bar.
93
        vbox = gtk.VBox(spacing=0)
44 by David Allouche
reorganise branch window
94
        self.add(vbox)
95
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
96
        self.paned = gtk.VPaned()
97
        self.paned.pack1(self.construct_top(), resize=True, shrink=False)
98
        self.paned.pack2(self.construct_bottom(), resize=False, shrink=True)
99
        self.paned.show()
358 by Daniel Schierbeck
Generalized the hiding/showing code.
100
331 by Daniel Schierbeck
Added basic menu bar.
101
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
44 by David Allouche
reorganise branch window
102
        vbox.pack_start(self.construct_navigation(), expand=False, fill=True)
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
103
        
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
104
        vbox.pack_start(self.paned, expand=True, fill=True)
105
        vbox.set_focus_child(self.paned)
44 by David Allouche
reorganise branch window
106
107
        vbox.show()
331 by Daniel Schierbeck
Added basic menu bar.
108
109
    def construct_menubar(self):
110
        menubar = gtk.MenuBar()
111
112
        file_menu = gtk.Menu()
334 by Daniel Schierbeck
Added icons to menus.
113
        file_menuitem = gtk.MenuItem("_File")
331 by Daniel Schierbeck
Added basic menu bar.
114
        file_menuitem.set_submenu(file_menu)
115
362 by Daniel Schierbeck
Added accel group to File -> Close menu item.
116
        file_menu_close = gtk.ImageMenuItem(gtk.STOCK_CLOSE, self.accel_group)
331 by Daniel Schierbeck
Added basic menu bar.
117
        file_menu_close.connect('activate', lambda x: self.destroy())
118
        
363 by Daniel Schierbeck
Added File -> Quit menu item.
119
        file_menu_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.accel_group)
120
        file_menu_quit.connect('activate', lambda x: gtk.main_quit())
121
        
408 by Daniel Schierbeck
Made the close menu item actually appear when the viz is opened from another window.
122
        if self._parent is not None:
406 by Daniel Schierbeck
Made the viz show the close menu item only if opened from another window.
123
            file_menu.add(file_menu_close)
363 by Daniel Schierbeck
Added File -> Quit menu item.
124
        file_menu.add(file_menu_quit)
331 by Daniel Schierbeck
Added basic menu bar.
125
338 by Daniel Schierbeck
Added Preferences menu item.
126
        edit_menu = gtk.Menu()
127
        edit_menuitem = gtk.MenuItem("_Edit")
128
        edit_menuitem.set_submenu(edit_menu)
129
340 by Daniel Schierbeck
Added edit->find menu item stub.
130
        edit_menu_find = gtk.ImageMenuItem(gtk.STOCK_FIND)
131
361 by Daniel Schierbeck
Added branch settings menu item.
132
        edit_menu_branchopts = gtk.MenuItem("Branch Settings")
133
        edit_menu_branchopts.connect('activate', lambda x: PreferencesWindow(self.branch.get_config()).show())
134
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
135
        edit_menu_globopts = gtk.MenuItem("Global Settings")
136
        edit_menu_globopts.connect('activate', lambda x: PreferencesWindow().show())
338 by Daniel Schierbeck
Added Preferences menu item.
137
340 by Daniel Schierbeck
Added edit->find menu item stub.
138
        edit_menu.add(edit_menu_find)
361 by Daniel Schierbeck
Added branch settings menu item.
139
        edit_menu.add(edit_menu_branchopts)
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
140
        edit_menu.add(edit_menu_globopts)
338 by Daniel Schierbeck
Added Preferences menu item.
141
348 by Daniel Schierbeck
Added toggle item for revision number column.
142
        view_menu = gtk.Menu()
143
        view_menuitem = gtk.MenuItem("_View")
144
        view_menuitem.set_submenu(view_menu)
145
351 by Daniel Schierbeck
Added option to hide the toolbar.
146
        view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
147
        view_menu_toolbar.set_active(True)
148
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
149
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
150
        view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
151
        view_menu_compact.set_active(self.compact_view)
152
        view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
153
351 by Daniel Schierbeck
Added option to hide the toolbar.
154
        view_menu.add(view_menu_toolbar)
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
155
        view_menu.add(view_menu_compact)
351 by Daniel Schierbeck
Added option to hide the toolbar.
156
        view_menu.add(gtk.SeparatorMenuItem())
358 by Daniel Schierbeck
Generalized the hiding/showing code.
157
452.4.2 by Jelmer Vernooij
Hide revision number column if more than one branch was specified.
158
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
159
        self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
160
161
        # Revision numbers are pointless if there are multiple branches
162
        if len(self.start_revs) > 1:
163
            self.mnu_show_revno_column.set_sensitive(False)
164
            self.treeview.set_property('revno-column-visible', False)
165
166
        for (col, name) in [(self.mnu_show_revno_column, "revno"), 
167
                            (self.mnu_show_date_column, "date")]:
358 by Daniel Schierbeck
Generalized the hiding/showing code.
168
            col.set_active(self.treeview.get_property(name + "-column-visible"))
169
            col.connect('toggled', self._col_visibility_changed, name)
170
            view_menu.add(col)
348 by Daniel Schierbeck
Added toggle item for revision number column.
171
331 by Daniel Schierbeck
Added basic menu bar.
172
        go_menu = gtk.Menu()
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
173
        go_menu.set_accel_group(self.accel_group)
334 by Daniel Schierbeck
Added icons to menus.
174
        go_menuitem = gtk.MenuItem("_Go")
331 by Daniel Schierbeck
Added basic menu bar.
175
        go_menuitem.set_submenu(go_menu)
176
        
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
177
        go_menu_next = self.next_rev_action.create_menu_item()
178
        go_menu_prev = self.prev_rev_action.create_menu_item()
334 by Daniel Schierbeck
Added icons to menus.
179
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
180
        self.go_menu_tags = gtk.MenuItem("_Tags")
181
        self._update_tags()
399 by Daniel Schierbeck
Made tags menu insensitive when there are no tags to display.
182
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
183
        go_menu.add(go_menu_next)
184
        go_menu.add(go_menu_prev)
334 by Daniel Schierbeck
Added icons to menus.
185
        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.
186
        go_menu.add(self.go_menu_tags)
334 by Daniel Schierbeck
Added icons to menus.
187
335 by Daniel Schierbeck
Added Revision menu.
188
        revision_menu = gtk.Menu()
189
        revision_menuitem = gtk.MenuItem("_Revision")
190
        revision_menuitem.set_submenu(revision_menu)
191
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
192
        revision_menu_diff = gtk.MenuItem("View Changes")
193
        revision_menu_diff.connect('activate', 
194
                lambda w: self.treeview.show_diff())
195
365 by Daniel Schierbeck
Fixed locks and made tagging work.
196
        revision_menu_tag = gtk.MenuItem("Tag Revision")
197
        revision_menu_tag.connect('activate', self._tag_revision_cb)
198
199
        revision_menu.add(revision_menu_tag)
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
200
        revision_menu.add(revision_menu_diff)
335 by Daniel Schierbeck
Added Revision menu.
201
334 by Daniel Schierbeck
Added icons to menus.
202
        branch_menu = gtk.Menu()
203
        branch_menuitem = gtk.MenuItem("_Branch")
204
        branch_menuitem.set_submenu(branch_menu)
205
336 by Daniel Schierbeck
Changed wording to comply with HIG guidelines.
206
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
207
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
208
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
209
        help_menu = gtk.Menu()
210
        help_menuitem = gtk.MenuItem("_Help")
211
        help_menuitem.set_submenu(help_menu)
212
213
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
214
        help_about_menuitem.connect('activate', self._about_dialog_cb)
215
216
        help_menu.add(help_about_menuitem)
217
331 by Daniel Schierbeck
Added basic menu bar.
218
        menubar.add(file_menuitem)
338 by Daniel Schierbeck
Added Preferences menu item.
219
        menubar.add(edit_menuitem)
348 by Daniel Schierbeck
Added toggle item for revision number column.
220
        menubar.add(view_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
221
        menubar.add(go_menuitem)
335 by Daniel Schierbeck
Added Revision menu.
222
        menubar.add(revision_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
223
        menubar.add(branch_menuitem)
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
224
        menubar.add(help_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
225
        menubar.show_all()
226
227
        return menubar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
228
229
    def construct_top(self):
230
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
231
        # FIXME: Make broken_line_length configurable
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
232
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
233
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
234
373 by Daniel Schierbeck
Made column display options persisted.
235
        self.treeview.connect('revision-selected',
303 by Daniel Schierbeck
Made basic signaling work.
236
                self._treeselection_changed_cb)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
237
        self.treeview.connect('revision-activated',
238
                self._tree_revision_activated)
303 by Daniel Schierbeck
Made basic signaling work.
239
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
240
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
241
373 by Daniel Schierbeck
Made column display options persisted.
242
        for col in ["revno", "date"]:
243
            option = self.config.get_user_option(col + '-column-visible')
244
            if option is not None:
245
                self.treeview.set_property(col + '-column-visible', option == 'True')
246
452.4.2 by Jelmer Vernooij
Hide revision number column if more than one branch was specified.
247
        self.treeview.set_property(col + '-column-visible', False)
1 by Scott James Remnant
Commit the first version of bzrk.
248
        self.treeview.show()
249
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
250
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
251
        align.set_padding(5, 0, 0, 0)
252
        align.add(self.treeview)
253
        align.show()
254
255
        return align
44 by David Allouche
reorganise branch window
256
257
    def construct_navigation(self):
258
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
259
        self.toolbar = gtk.Toolbar()
260
        self.toolbar.set_style(gtk.TOOLBAR_BOTH_HORIZ)
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
261
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
262
        self.prev_button = self.prev_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
263
        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
264
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
265
        self.next_button = self.next_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
266
        self.toolbar.insert(self.next_button, -1)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
267
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
268
        self.toolbar.insert(gtk.SeparatorToolItem(), -1)
269
270
        refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
404 by Daniel Schierbeck
Made the refresh use proper locking.
271
        refresh_button.connect('clicked', self._refresh_clicked)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
272
        self.toolbar.insert(refresh_button, -1)
273
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
274
        self.toolbar.show_all()
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
275
276
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
277
278
    def construct_bottom(self):
279
        """Construct the bottom half of the window."""
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
280
        from bzrlib.plugins.gtk.revisionview import RevisionView
412.1.2 by Daniel Schierbeck
Moved retrieval of tags into the revisionview itself.
281
        self.revisionview = RevisionView(branch=self.branch)
44 by David Allouche
reorganise branch window
282
        (width, height) = self.get_size()
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
283
        self.revisionview.set_size_request(width, int(height / 2.5))
284
        self.revisionview.show()
285
        self.revisionview.set_show_callback(self._show_clicked_cb)
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
286
        self.revisionview.connect('notify::revision', self._go_clicked_cb)
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
287
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
288
        return self.revisionview
332 by Daniel Schierbeck
Made tag selection work.
289
290
    def _tag_selected_cb(self, menuitem, revid):
356 by Daniel Schierbeck
Made revision a property on TreeView.
291
        self.treeview.set_revision_id(revid)
341 by Daniel Schierbeck
Merged with trunk.
292
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)
293
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
294
        """callback for when the treeview changes."""
295
        revision = self.treeview.get_revision()
296
        parents  = self.treeview.get_parents()
297
        children = self.treeview.get_children()
298
299
        if revision is not None:
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
300
            prev_menu = gtk.Menu()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
301
            if len(parents) > 0:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
302
                self.prev_rev_action.set_sensitive(True)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
303
                for parent_id in parents:
304
                    parent = self.branch.repository.get_revision(parent_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
305
                    try:
306
                        str = ' (' + parent.properties['branch-nick'] + ')'
307
                    except KeyError:
308
                        str = ""
309
310
                    item = gtk.MenuItem(parent.message.split("\n")[0] + str)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
311
                    item.connect('activate', self._set_revision_cb, parent_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
312
                    prev_menu.add(item)
313
                prev_menu.show_all()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
314
            else:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
315
                self.prev_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
316
                prev_menu.hide()
317
318
            self.prev_button.set_menu(prev_menu)
319
320
            next_menu = gtk.Menu()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
321
            if len(children) > 0:
386 by Daniel Schierbeck
Created a single action for Next Revision.
322
                self.next_rev_action.set_sensitive(True)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
323
                for child_id in children:
324
                    child = self.branch.repository.get_revision(child_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
325
                    try:
326
                        str = ' (' + child.properties['branch-nick'] + ')'
327
                    except KeyError:
328
                        str = ""
329
330
                    item = gtk.MenuItem(child.message.split("\n")[0] + str)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
331
                    item.connect('activate', self._set_revision_cb, child_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
332
                    next_menu.add(item)
333
                next_menu.show_all()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
334
            else:
386 by Daniel Schierbeck
Created a single action for Next Revision.
335
                self.next_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
336
                next_menu.hide()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
337
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
338
            self.next_button.set_menu(next_menu)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
339
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
340
            self.revisionview.set_revision(revision)
341
            self.revisionview.set_children(children)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
342
    
343
    def _tree_revision_activated(self, widget, path, col):
344
        # TODO: more than one parent
345
        """Callback for when a treeview row gets activated."""
346
        revision = self.treeview.get_revision()
347
        parents  = self.treeview.get_parents()
348
349
        if len(parents) == 0:
350
            parent_id = None
351
        else:
352
            parent_id = parents[0]
353
354
        self.show_diff(revision.revision_id, parent_id)
355
        self.treeview.grab_focus()
356
    
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
357
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
358
    def _back_clicked_cb(self, *args):
359
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
360
        self.treeview.back()
361
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
362
    def _fwd_clicked_cb(self, *args):
363
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
364
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
365
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
366
    def _go_clicked_cb(self, w, p):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
367
        """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().
368
        if self.revisionview.get_revision() is not None:
369
            self.treeview.set_revision(self.revisionview.get_revision())
152 by Jelmer Vernooij
Cleanup some more code.
370
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
371
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
372
        """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.
373
        self.show_diff(revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
374
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
375
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
376
    def _set_revision_cb(self, w, revision_id):
356 by Daniel Schierbeck
Made revision a property on TreeView.
377
        self.treeview.set_revision_id(revision_id)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
378
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
379
    def _brokenlines_toggled_cb(self, button):
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
380
        self.compact_view = button.get_active()
381
382
        if self.compact_view:
383
            option = 'yes'
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
384
        else:
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
385
            option = 'no'
386
387
        self.config.set_user_option('viz-compact-view', option)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
388
        self.treeview.set_property('compact', self.compact_view)
389
        self.treeview.refresh()
368 by Daniel Schierbeck
Merged with mainline.
390
365 by Daniel Schierbeck
Fixed locks and made tagging work.
391
    def _tag_revision_cb(self, w):
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
392
        try:
393
            self.treeview.set_sensitive(False)
394
            dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
395
            response = dialog.run()
396
            if response != gtk.RESPONSE_NONE:
397
                dialog.hide()
365 by Daniel Schierbeck
Fixed locks and made tagging work.
398
            
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
399
                if response == gtk.RESPONSE_OK:
423.7.7 by Daniel Schierbeck
Simplified Go->Tag Revision menu item in the viz.
400
                    self.treeview.add_tag(dialog.tagname, dialog._revid)
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
401
                
402
                dialog.destroy()
403
404
        finally:
405
            self.treeview.set_sensitive(True)
365 by Daniel Schierbeck
Fixed locks and made tagging work.
406
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
407
    def _about_dialog_cb(self, w):
408
        from bzrlib.plugins.gtk.about import AboutDialog
409
410
        AboutDialog().run()
411
348 by Daniel Schierbeck
Added toggle item for revision number column.
412
    def _col_visibility_changed(self, col, property):
373 by Daniel Schierbeck
Made column display options persisted.
413
        self.config.set_user_option(property + '-column-visible', col.get_active())
348 by Daniel Schierbeck
Added toggle item for revision number column.
414
        self.treeview.set_property(property + '-column-visible', col.get_active())
351 by Daniel Schierbeck
Added option to hide the toolbar.
415
416
    def _toolbar_visibility_changed(self, col):
417
        if col.get_active():
418
            self.toolbar.show() 
419
        else:
420
            self.toolbar.hide()
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
421
422
    def _show_about_cb(self, w):
423
        dialog = AboutDialog()
424
        dialog.connect('response', lambda d,r: d.destroy())
425
        dialog.run()
404 by Daniel Schierbeck
Made the refresh use proper locking.
426
427
    def _refresh_clicked(self, w):
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
428
        self.treeview.refresh()
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
429
430
    def _update_tags(self):
431
        menu = gtk.Menu()
432
433
        if self.branch.supports_tags():
434
            tags = self.branch.tags.get_tag_dict().items()
435
            tags.sort()
436
            tags.reverse()
437
            for tag, revid in tags:
452.1.1 by Daniel Schierbeck
Disabled the use of mnemonics in tag menu items.
438
                tag_item = gtk.MenuItem(tag, use_underline=False)
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
439
                tag_item.connect('activate', self._tag_selected_cb, revid)
440
                menu.add(tag_item)
441
            self.go_menu_tags.set_submenu(menu)
442
443
            self.go_menu_tags.set_sensitive(len(tags) != 0)
444
        else:
445
            self.go_menu_tags.set_sensitive(False)
446
447
        self.go_menu_tags.show_all()
448
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
449
    def show_diff(self, revid=None, parentid=None):
450
        """Open a new window to show a diff between the given revisions."""
451
        from bzrlib.plugins.gtk.diff import DiffWindow
452
        window = DiffWindow(parent=self)
453
454
        if parentid is None:
455
            parentid = NULL_REVISION
456
457
        rev_tree    = self.branch.repository.revision_tree(revid)
458
        parent_tree = self.branch.repository.revision_tree(parentid)
459
460
        description = revid + " - " + self.branch.nick
461
        window.set_diff(description, rev_tree, parent_tree)
462
        window.show()
463
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
464