/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.2.1 by Daniel Schierbeck
Moved branch view to its own package.
19
from bzrlib.plugins.gtk.branchview import TreeView
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
20
from bzrlib.revision import 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
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
31
    def __init__(self, branch, start, maxnum, parent=None):
322 by Jelmer Vernooij
Add docstrings.
32
        """Create a new BranchWindow.
33
34
        :param branch: Branch object for branch to show.
35
        :param start: Revision id of top revision.
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
44
        self.start       = start
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
        vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
104
        
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
105
        vbox.pack_start(self.paned, expand=True, fill=True)
106
        vbox.set_focus_child(self.paned)
44 by David Allouche
reorganise branch window
107
108
        vbox.show()
331 by Daniel Schierbeck
Added basic menu bar.
109
110
    def construct_menubar(self):
111
        menubar = gtk.MenuBar()
112
113
        file_menu = gtk.Menu()
334 by Daniel Schierbeck
Added icons to menus.
114
        file_menuitem = gtk.MenuItem("_File")
331 by Daniel Schierbeck
Added basic menu bar.
115
        file_menuitem.set_submenu(file_menu)
116
362 by Daniel Schierbeck
Added accel group to File -> Close menu item.
117
        file_menu_close = gtk.ImageMenuItem(gtk.STOCK_CLOSE, self.accel_group)
331 by Daniel Schierbeck
Added basic menu bar.
118
        file_menu_close.connect('activate', lambda x: self.destroy())
119
        
363 by Daniel Schierbeck
Added File -> Quit menu item.
120
        file_menu_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.accel_group)
121
        file_menu_quit.connect('activate', lambda x: gtk.main_quit())
122
        
408 by Daniel Schierbeck
Made the close menu item actually appear when the viz is opened from another window.
123
        if self._parent is not None:
406 by Daniel Schierbeck
Made the viz show the close menu item only if opened from another window.
124
            file_menu.add(file_menu_close)
363 by Daniel Schierbeck
Added File -> Quit menu item.
125
        file_menu.add(file_menu_quit)
331 by Daniel Schierbeck
Added basic menu bar.
126
338 by Daniel Schierbeck
Added Preferences menu item.
127
        edit_menu = gtk.Menu()
128
        edit_menuitem = gtk.MenuItem("_Edit")
129
        edit_menuitem.set_submenu(edit_menu)
130
340 by Daniel Schierbeck
Added edit->find menu item stub.
131
        edit_menu_find = gtk.ImageMenuItem(gtk.STOCK_FIND)
132
361 by Daniel Schierbeck
Added branch settings menu item.
133
        edit_menu_branchopts = gtk.MenuItem("Branch Settings")
134
        edit_menu_branchopts.connect('activate', lambda x: PreferencesWindow(self.branch.get_config()).show())
135
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
136
        edit_menu_globopts = gtk.MenuItem("Global Settings")
137
        edit_menu_globopts.connect('activate', lambda x: PreferencesWindow().show())
338 by Daniel Schierbeck
Added Preferences menu item.
138
340 by Daniel Schierbeck
Added edit->find menu item stub.
139
        edit_menu.add(edit_menu_find)
361 by Daniel Schierbeck
Added branch settings menu item.
140
        edit_menu.add(edit_menu_branchopts)
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
141
        edit_menu.add(edit_menu_globopts)
338 by Daniel Schierbeck
Added Preferences menu item.
142
348 by Daniel Schierbeck
Added toggle item for revision number column.
143
        view_menu = gtk.Menu()
144
        view_menuitem = gtk.MenuItem("_View")
145
        view_menuitem.set_submenu(view_menu)
146
351 by Daniel Schierbeck
Added option to hide the toolbar.
147
        view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
148
        view_menu_toolbar.set_active(True)
149
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
150
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
151
        view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
152
        view_menu_compact.set_active(self.compact_view)
153
        view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
154
351 by Daniel Schierbeck
Added option to hide the toolbar.
155
        view_menu.add(view_menu_toolbar)
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
156
        view_menu.add(view_menu_compact)
351 by Daniel Schierbeck
Added option to hide the toolbar.
157
        view_menu.add(gtk.SeparatorMenuItem())
358 by Daniel Schierbeck
Generalized the hiding/showing code.
158
159
        for (label, name) in [("Revision _Number", "revno"), ("_Date", "date")]:
160
            col = gtk.CheckMenuItem("Show " + label + " Column")
161
            col.set_active(self.treeview.get_property(name + "-column-visible"))
162
            col.connect('toggled', self._col_visibility_changed, name)
163
            view_menu.add(col)
348 by Daniel Schierbeck
Added toggle item for revision number column.
164
331 by Daniel Schierbeck
Added basic menu bar.
165
        go_menu = gtk.Menu()
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
166
        go_menu.set_accel_group(self.accel_group)
334 by Daniel Schierbeck
Added icons to menus.
167
        go_menuitem = gtk.MenuItem("_Go")
331 by Daniel Schierbeck
Added basic menu bar.
168
        go_menuitem.set_submenu(go_menu)
169
        
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
170
        go_menu_next = self.next_rev_action.create_menu_item()
171
        go_menu_prev = self.prev_rev_action.create_menu_item()
334 by Daniel Schierbeck
Added icons to menus.
172
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
173
        self.go_menu_tags = gtk.MenuItem("_Tags")
174
        self._update_tags()
399 by Daniel Schierbeck
Made tags menu insensitive when there are no tags to display.
175
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
176
        go_menu.add(go_menu_next)
177
        go_menu.add(go_menu_prev)
334 by Daniel Schierbeck
Added icons to menus.
178
        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.
179
        go_menu.add(self.go_menu_tags)
334 by Daniel Schierbeck
Added icons to menus.
180
335 by Daniel Schierbeck
Added Revision menu.
181
        revision_menu = gtk.Menu()
182
        revision_menuitem = gtk.MenuItem("_Revision")
183
        revision_menuitem.set_submenu(revision_menu)
184
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
185
        revision_menu_diff = gtk.MenuItem("View Changes")
186
        revision_menu_diff.connect('activate', 
187
                lambda w: self.treeview.show_diff())
188
365 by Daniel Schierbeck
Fixed locks and made tagging work.
189
        revision_menu_tag = gtk.MenuItem("Tag Revision")
190
        revision_menu_tag.connect('activate', self._tag_revision_cb)
191
192
        revision_menu.add(revision_menu_tag)
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
193
        revision_menu.add(revision_menu_diff)
335 by Daniel Schierbeck
Added Revision menu.
194
334 by Daniel Schierbeck
Added icons to menus.
195
        branch_menu = gtk.Menu()
196
        branch_menuitem = gtk.MenuItem("_Branch")
197
        branch_menuitem.set_submenu(branch_menu)
198
336 by Daniel Schierbeck
Changed wording to comply with HIG guidelines.
199
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
200
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
201
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
202
        help_menu = gtk.Menu()
203
        help_menuitem = gtk.MenuItem("_Help")
204
        help_menuitem.set_submenu(help_menu)
205
206
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
207
        help_about_menuitem.connect('activate', self._about_dialog_cb)
208
209
        help_menu.add(help_about_menuitem)
210
331 by Daniel Schierbeck
Added basic menu bar.
211
        menubar.add(file_menuitem)
338 by Daniel Schierbeck
Added Preferences menu item.
212
        menubar.add(edit_menuitem)
348 by Daniel Schierbeck
Added toggle item for revision number column.
213
        menubar.add(view_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
214
        menubar.add(go_menuitem)
335 by Daniel Schierbeck
Added Revision menu.
215
        menubar.add(revision_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
216
        menubar.add(branch_menuitem)
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
217
        menubar.add(help_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
218
        menubar.show_all()
219
220
        return menubar
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
221
    
222
    def construct_loading_msg(self):
223
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
224
                                                 gtk.ICON_SIZE_BUTTON)
225
        image_loading.show()
226
        
227
        label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
368 by Daniel Schierbeck
Merged with mainline.
228
        label_loading.set_alignment(0.0, 0.5)
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
229
        label_loading.show()
230
        
231
        self.loading_msg_box = gtk.HBox()
232
        self.loading_msg_box.set_spacing(5)
233
        self.loading_msg_box.set_border_width(5)        
234
        self.loading_msg_box.pack_start(image_loading, False, False)
235
        self.loading_msg_box.pack_start(label_loading, True, True)
236
        self.loading_msg_box.show()
237
        
238
        return self.loading_msg_box
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
239
240
    def construct_top(self):
241
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
242
        # FIXME: Make broken_line_length configurable
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
243
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
244
        self.treeview = TreeView(self.branch, self.start, self.maxnum, self.compact_view)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
245
373 by Daniel Schierbeck
Made column display options persisted.
246
        self.treeview.connect('revision-selected',
303 by Daniel Schierbeck
Made basic signaling work.
247
                self._treeselection_changed_cb)
248
307 by Daniel Schierbeck
Made load notification work again.
249
        self.treeview.connect('revisions-loaded', 
250
                lambda x: self.loading_msg_box.hide())
251
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
252
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
253
373 by Daniel Schierbeck
Made column display options persisted.
254
        for col in ["revno", "date"]:
255
            option = self.config.get_user_option(col + '-column-visible')
256
            if option is not None:
257
                self.treeview.set_property(col + '-column-visible', option == 'True')
258
1 by Scott James Remnant
Commit the first version of bzrk.
259
        self.treeview.show()
260
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
261
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
262
        align.set_padding(5, 0, 0, 0)
263
        align.add(self.treeview)
264
        align.show()
265
266
        return align
44 by David Allouche
reorganise branch window
267
268
    def construct_navigation(self):
269
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
270
        self.toolbar = gtk.Toolbar()
271
        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
272
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
273
        self.prev_button = self.prev_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
274
        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
275
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
276
        self.next_button = self.next_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
277
        self.toolbar.insert(self.next_button, -1)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
278
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
279
        self.toolbar.insert(gtk.SeparatorToolItem(), -1)
280
281
        refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
404 by Daniel Schierbeck
Made the refresh use proper locking.
282
        refresh_button.connect('clicked', self._refresh_clicked)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
283
        self.toolbar.insert(refresh_button, -1)
284
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
285
        self.toolbar.show_all()
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
286
287
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
288
289
    def construct_bottom(self):
290
        """Construct the bottom half of the window."""
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
291
        from bzrlib.plugins.gtk.revisionview import RevisionView
412.1.2 by Daniel Schierbeck
Moved retrieval of tags into the revisionview itself.
292
        self.revisionview = RevisionView(branch=self.branch)
44 by David Allouche
reorganise branch window
293
        (width, height) = self.get_size()
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
294
        self.revisionview.set_size_request(width, int(height / 2.5))
295
        self.revisionview.show()
296
        self.revisionview.set_show_callback(self._show_clicked_cb)
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
297
        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.
298
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
299
        return self.revisionview
332 by Daniel Schierbeck
Made tag selection work.
300
301
    def _tag_selected_cb(self, menuitem, revid):
356 by Daniel Schierbeck
Made revision a property on TreeView.
302
        self.treeview.set_revision_id(revid)
341 by Daniel Schierbeck
Merged with trunk.
303
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)
304
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
305
        """callback for when the treeview changes."""
306
        revision = self.treeview.get_revision()
307
        parents  = self.treeview.get_parents()
308
        children = self.treeview.get_children()
309
310
        if revision is not None:
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
311
            prev_menu = gtk.Menu()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
312
            if len(parents) > 0:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
313
                self.prev_rev_action.set_sensitive(True)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
314
                for parent_id in parents:
315
                    parent = self.branch.repository.get_revision(parent_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
316
                    try:
317
                        str = ' (' + parent.properties['branch-nick'] + ')'
318
                    except KeyError:
319
                        str = ""
320
321
                    item = gtk.MenuItem(parent.message.split("\n")[0] + str)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
322
                    item.connect('activate', self._set_revision_cb, parent_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
323
                    prev_menu.add(item)
324
                prev_menu.show_all()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
325
            else:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
326
                self.prev_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
327
                prev_menu.hide()
328
329
            self.prev_button.set_menu(prev_menu)
330
331
            next_menu = gtk.Menu()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
332
            if len(children) > 0:
386 by Daniel Schierbeck
Created a single action for Next Revision.
333
                self.next_rev_action.set_sensitive(True)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
334
                for child_id in children:
335
                    child = self.branch.repository.get_revision(child_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
336
                    try:
337
                        str = ' (' + child.properties['branch-nick'] + ')'
338
                    except KeyError:
339
                        str = ""
340
341
                    item = gtk.MenuItem(child.message.split("\n")[0] + str)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
342
                    item.connect('activate', self._set_revision_cb, child_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
343
                    next_menu.add(item)
344
                next_menu.show_all()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
345
            else:
386 by Daniel Schierbeck
Created a single action for Next Revision.
346
                self.next_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
347
                next_menu.hide()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
348
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
349
            self.next_button.set_menu(next_menu)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
350
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
351
            self.revisionview.set_revision(revision)
352
            self.revisionview.set_children(children)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
353
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
354
    def _back_clicked_cb(self, *args):
355
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
356
        self.treeview.back()
357
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
358
    def _fwd_clicked_cb(self, *args):
359
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
360
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
361
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
362
    def _go_clicked_cb(self, w, p):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
363
        """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().
364
        if self.revisionview.get_revision() is not None:
365
            self.treeview.set_revision(self.revisionview.get_revision())
152 by Jelmer Vernooij
Cleanup some more code.
366
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
367
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
368
        """Callback for when the show button for a parent is clicked."""
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
369
        self.treeview.show_diff(revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
370
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
371
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
372
    def _set_revision_cb(self, w, revision_id):
356 by Daniel Schierbeck
Made revision a property on TreeView.
373
        self.treeview.set_revision_id(revision_id)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
374
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
375
    def _brokenlines_toggled_cb(self, button):
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
376
        self.compact_view = button.get_active()
377
378
        if self.compact_view:
379
            option = 'yes'
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
380
        else:
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
381
            option = 'no'
382
383
        self.config.set_user_option('viz-compact-view', option)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
384
        self.treeview.set_property('compact', self.compact_view)
385
        self.treeview.refresh()
368 by Daniel Schierbeck
Merged with mainline.
386
365 by Daniel Schierbeck
Fixed locks and made tagging work.
387
    def _tag_revision_cb(self, w):
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
388
        try:
389
            self.treeview.set_sensitive(False)
390
            dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
391
            response = dialog.run()
392
            if response != gtk.RESPONSE_NONE:
393
                dialog.hide()
365 by Daniel Schierbeck
Fixed locks and made tagging work.
394
            
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
395
                if response == gtk.RESPONSE_OK:
423.7.7 by Daniel Schierbeck
Simplified Go->Tag Revision menu item in the viz.
396
                    self.treeview.add_tag(dialog.tagname, dialog._revid)
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
397
                
398
                dialog.destroy()
399
400
        finally:
401
            self.treeview.set_sensitive(True)
365 by Daniel Schierbeck
Fixed locks and made tagging work.
402
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
403
    def _about_dialog_cb(self, w):
404
        from bzrlib.plugins.gtk.about import AboutDialog
405
406
        AboutDialog().run()
407
348 by Daniel Schierbeck
Added toggle item for revision number column.
408
    def _col_visibility_changed(self, col, property):
373 by Daniel Schierbeck
Made column display options persisted.
409
        self.config.set_user_option(property + '-column-visible', col.get_active())
348 by Daniel Schierbeck
Added toggle item for revision number column.
410
        self.treeview.set_property(property + '-column-visible', col.get_active())
351 by Daniel Schierbeck
Added option to hide the toolbar.
411
412
    def _toolbar_visibility_changed(self, col):
413
        if col.get_active():
414
            self.toolbar.show() 
415
        else:
416
            self.toolbar.hide()
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
417
418
    def _show_about_cb(self, w):
419
        dialog = AboutDialog()
420
        dialog.connect('response', lambda d,r: d.destroy())
421
        dialog.run()
404 by Daniel Schierbeck
Made the refresh use proper locking.
422
423
    def _refresh_clicked(self, w):
424
        self.treeview.update()
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
425
426
    def _update_tags(self):
427
        menu = gtk.Menu()
428
429
        if self.branch.supports_tags():
430
            tags = self.branch.tags.get_tag_dict().items()
431
            tags.sort()
432
            tags.reverse()
433
            for tag, revid in tags:
434
                tag_item = gtk.MenuItem(tag)
435
                tag_item.connect('activate', self._tag_selected_cb, revid)
436
                menu.add(tag_item)
437
            self.go_menu_tags.set_submenu(menu)
438
439
            self.go_menu_tags.set_sensitive(len(tags) != 0)
440
        else:
441
            self.go_menu_tags.set_sensitive(False)
442
443
        self.go_menu_tags.show_all()
444
445