/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
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
19
from bzrlib.revision import Revision
361 by Daniel Schierbeck
Added branch settings menu item.
20
from bzrlib.config import BranchConfig
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
21
from bzrlib.config import GlobalConfig
333 by Daniel Schierbeck
Removed unnecessary imports.
22
from treeview import TreeView
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
23
from about import AboutDialog
1 by Scott James Remnant
Commit the first version of bzrk.
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
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
32
    def __init__(self, branch, start, maxnum, parent=None):
322 by Jelmer Vernooij
Add docstrings.
33
        """Create a new BranchWindow.
34
35
        :param branch: Branch object for branch to show.
36
        :param start: Revision id of top revision.
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
45
        self.start       = start
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
54
        self.set_title(branch.nick + " - revision history")
1 by Scott James Remnant
Commit the first version of bzrk.
55
56
        # Use three-quarters of the screen by default
57
        screen = self.get_screen()
4 by Scott James Remnant
Use the size of the first monitor rather than the entire screen
58
        monitor = screen.get_monitor_geometry(0)
59
        width = int(monitor.width * 0.75)
60
        height = int(monitor.height * 0.75)
1 by Scott James Remnant
Commit the first version of bzrk.
61
        self.set_default_size(width, height)
62
63
        # FIXME AndyFitz!
64
        icon = self.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
65
        self.set_icon(icon)
66
384 by Daniel Schierbeck
Added accelerator for Next Revision action.
67
        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.
68
        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.
69
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
70
        self.accel_group = gtk.AccelGroup()
71
        self.add_accel_group(self.accel_group)
72
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
73
        gtk.Action.set_tool_item_type(gtk.MenuToolButton)
74
385 by Daniel Schierbeck
Created a single action for Previous Revision.
75
        self.prev_rev_action = gtk.Action("prev-rev", "_Previous Revision", "Go to the previous revision", gtk.STOCK_GO_DOWN)
76
        self.prev_rev_action.set_accel_path("<viz>/Go/Previous Revision")
77
        self.prev_rev_action.set_accel_group(self.accel_group)
78
        self.prev_rev_action.connect("activate", self._back_clicked_cb)
79
        self.prev_rev_action.connect_accelerator()
80
386 by Daniel Schierbeck
Created a single action for Next Revision.
81
        self.next_rev_action = gtk.Action("next-rev", "_Next Revision", "Go to the next revision", gtk.STOCK_GO_UP)
82
        self.next_rev_action.set_accel_path("<viz>/Go/Next Revision")
83
        self.next_rev_action.set_accel_group(self.accel_group)
84
        self.next_rev_action.connect("activate", self._fwd_clicked_cb)
85
        self.next_rev_action.connect_accelerator()
86
1 by Scott James Remnant
Commit the first version of bzrk.
87
        self.construct()
88
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
89
    def set_revision(self, revid):
90
        self.treeview.set_revision_id(revid)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
91
1 by Scott James Remnant
Commit the first version of bzrk.
92
    def construct(self):
93
        """Construct the window contents."""
331 by Daniel Schierbeck
Added basic menu bar.
94
        vbox = gtk.VBox(spacing=0)
44 by David Allouche
reorganise branch window
95
        self.add(vbox)
96
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
97
        self.paned = gtk.VPaned()
98
        self.paned.pack1(self.construct_top(), resize=True, shrink=False)
99
        self.paned.pack2(self.construct_bottom(), resize=False, shrink=True)
100
        self.paned.show()
358 by Daniel Schierbeck
Generalized the hiding/showing code.
101
331 by Daniel Schierbeck
Added basic menu bar.
102
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
44 by David Allouche
reorganise branch window
103
        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.
104
        vbox.pack_start(self.construct_loading_msg(), expand=False, fill=True)
105
        
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
106
        vbox.pack_start(self.paned, expand=True, fill=True)
107
        vbox.set_focus_child(self.paned)
44 by David Allouche
reorganise branch window
108
109
        vbox.show()
331 by Daniel Schierbeck
Added basic menu bar.
110
111
    def construct_menubar(self):
112
        menubar = gtk.MenuBar()
113
114
        file_menu = gtk.Menu()
334 by Daniel Schierbeck
Added icons to menus.
115
        file_menuitem = gtk.MenuItem("_File")
331 by Daniel Schierbeck
Added basic menu bar.
116
        file_menuitem.set_submenu(file_menu)
117
362 by Daniel Schierbeck
Added accel group to File -> Close menu item.
118
        file_menu_close = gtk.ImageMenuItem(gtk.STOCK_CLOSE, self.accel_group)
331 by Daniel Schierbeck
Added basic menu bar.
119
        file_menu_close.connect('activate', lambda x: self.destroy())
120
        
363 by Daniel Schierbeck
Added File -> Quit menu item.
121
        file_menu_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.accel_group)
122
        file_menu_quit.connect('activate', lambda x: gtk.main_quit())
123
        
331 by Daniel Schierbeck
Added basic menu bar.
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
338 by Daniel Schierbeck
Added Preferences menu item.
136
        edit_menu_prefs = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES)
361 by Daniel Schierbeck
Added branch settings menu item.
137
        edit_menu_prefs.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)
338 by Daniel Schierbeck
Added Preferences menu item.
141
        edit_menu.add(edit_menu_prefs)
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
332 by Daniel Schierbeck
Made tag selection work.
173
        tags_menu = gtk.Menu()
334 by Daniel Schierbeck
Added icons to menus.
174
        go_menu_tags = gtk.MenuItem("_Tags")
175
        go_menu_tags.set_submenu(tags_menu)
332 by Daniel Schierbeck
Made tag selection work.
176
367 by Daniel Schierbeck
Fixed crash when branch didn't support tags.
177
        if self.branch.supports_tags():
178
            for (tag, revid) in self.branch.tags.get_tag_dict().items():
179
                tag_item = gtk.MenuItem(tag)
180
                tag_item.connect('activate', self._tag_selected_cb, revid)
181
                tags_menu.add(tag_item)
332 by Daniel Schierbeck
Made tag selection work.
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())
186
        go_menu.add(go_menu_tags)
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
209
        help_menu = gtk.Menu()
210
        help_menuitem = gtk.MenuItem("_Help")
211
        help_menuitem.set_submenu(help_menu)
212
213
        help_menu_about = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
214
        help_menu_about.connect('activate', self._show_about_cb)
215
216
        help_menu.add(help_menu_about)
334 by Daniel Schierbeck
Added icons to menus.
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)
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
224
        menubar.add(help_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
225
        menubar.show_all()
226
227
        return menubar
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
228
    
229
    def construct_loading_msg(self):
230
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
231
                                                 gtk.ICON_SIZE_BUTTON)
232
        image_loading.show()
233
        
234
        label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
368 by Daniel Schierbeck
Merged with mainline.
235
        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.
236
        label_loading.show()
237
        
238
        self.loading_msg_box = gtk.HBox()
239
        self.loading_msg_box.set_spacing(5)
240
        self.loading_msg_box.set_border_width(5)        
241
        self.loading_msg_box.pack_start(image_loading, False, False)
242
        self.loading_msg_box.pack_start(label_loading, True, True)
243
        self.loading_msg_box.show()
244
        
245
        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
246
247
    def construct_top(self):
248
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
249
        # FIXME: Make broken_line_length configurable
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
250
        if self.compact_view:
251
            brokenlines = 32
252
        else:
253
            brokenlines = None
254
255
        self.treeview = TreeView(self.branch, self.start, self.maxnum, brokenlines)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
256
373 by Daniel Schierbeck
Made column display options persisted.
257
        self.treeview.connect('revision-selected',
303 by Daniel Schierbeck
Made basic signaling work.
258
                self._treeselection_changed_cb)
259
307 by Daniel Schierbeck
Made load notification work again.
260
        self.treeview.connect('revisions-loaded', 
261
                lambda x: self.loading_msg_box.hide())
262
373 by Daniel Schierbeck
Made column display options persisted.
263
        for col in ["revno", "date"]:
264
            option = self.config.get_user_option(col + '-column-visible')
265
            if option is not None:
266
                self.treeview.set_property(col + '-column-visible', option == 'True')
267
1 by Scott James Remnant
Commit the first version of bzrk.
268
        self.treeview.show()
269
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
270
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
271
        align.set_padding(5, 0, 0, 0)
272
        align.add(self.treeview)
273
        align.show()
274
275
        return align
44 by David Allouche
reorganise branch window
276
277
    def construct_navigation(self):
278
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
279
        self.toolbar = gtk.Toolbar()
280
        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
281
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
282
        self.prev_button = self.prev_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
283
        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
284
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
285
        self.next_button = self.next_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
286
        self.toolbar.insert(self.next_button, -1)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
287
288
        self.toolbar.show_all()
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
289
290
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
291
292
    def construct_bottom(self):
293
        """Construct the bottom half of the window."""
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
294
        from bzrlib.plugins.gtk.revisionview import RevisionView
295
        self.revisionview = RevisionView(None, tags=[], show_children=True, branch=self.branch)
44 by David Allouche
reorganise branch window
296
        (width, height) = self.get_size()
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
297
        self.revisionview.set_size_request(width, int(height / 2.5))
298
        self.revisionview.show()
299
        self.revisionview.set_show_callback(self._show_clicked_cb)
300
        self.revisionview.set_go_callback(self._go_clicked_cb)
301
        return self.revisionview
332 by Daniel Schierbeck
Made tag selection work.
302
303
    def _tag_selected_cb(self, menuitem, revid):
356 by Daniel Schierbeck
Made revision a property on TreeView.
304
        self.treeview.set_revision_id(revid)
341 by Daniel Schierbeck
Merged with trunk.
305
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)
306
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
307
        """callback for when the treeview changes."""
308
        revision = self.treeview.get_revision()
309
        parents  = self.treeview.get_parents()
310
        children = self.treeview.get_children()
311
312
        if revision is not None:
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
313
            prev_menu = gtk.Menu()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
314
            if len(parents) > 0:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
315
                self.prev_rev_action.set_sensitive(True)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
316
                for parent_id in parents:
317
                    parent = self.branch.repository.get_revision(parent_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
318
                    try:
319
                        str = ' (' + parent.properties['branch-nick'] + ')'
320
                    except KeyError:
321
                        str = ""
322
323
                    item = gtk.MenuItem(parent.message.split("\n")[0] + str)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
324
                    item.connect('activate', self._set_revision_cb, parent_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
325
                    prev_menu.add(item)
326
                prev_menu.show_all()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
327
            else:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
328
                self.prev_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
329
                prev_menu.hide()
330
331
            self.prev_button.set_menu(prev_menu)
332
333
            next_menu = gtk.Menu()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
334
            if len(children) > 0:
386 by Daniel Schierbeck
Created a single action for Next Revision.
335
                self.next_rev_action.set_sensitive(True)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
336
                for child_id in children:
337
                    child = self.branch.repository.get_revision(child_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
338
                    try:
339
                        str = ' (' + child.properties['branch-nick'] + ')'
340
                    except KeyError:
341
                        str = ""
342
343
                    item = gtk.MenuItem(child.message.split("\n")[0] + str)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
344
                    item.connect('activate', self._set_revision_cb, child_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
345
                    next_menu.add(item)
346
                next_menu.show_all()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
347
            else:
386 by Daniel Schierbeck
Created a single action for Next Revision.
348
                self.next_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
349
                next_menu.hide()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
350
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
351
            self.next_button.set_menu(next_menu)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
352
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)
353
            tags = []
354
            if self.branch.supports_tags():
355
                tagdict = self.branch.tags.get_reverse_tag_dict()
356
                if tagdict.has_key(revision.revision_id):
357
                    tags = tagdict[revision.revision_id]
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
358
            self.revisionview.set_revision(revision, tags, children)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
359
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
360
    def _back_clicked_cb(self, *args):
361
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
362
        self.treeview.back()
363
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
364
    def _fwd_clicked_cb(self, *args):
365
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
366
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
367
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
368
    def _go_clicked_cb(self, revid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
369
        """Callback for when the go button for a parent is clicked."""
356 by Daniel Schierbeck
Made revision a property on TreeView.
370
        self.treeview.set_revision_id(revid)
152 by Jelmer Vernooij
Cleanup some more code.
371
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
372
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
373
        """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.
374
        self.treeview.show_diff(revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
375
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
376
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
377
    def _set_revision_cb(self, w, revision_id):
356 by Daniel Schierbeck
Made revision a property on TreeView.
378
        self.treeview.set_revision_id(revision_id)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
379
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
380
    def _brokenlines_toggled_cb(self, button):
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
381
        self.compact_view = button.get_active()
382
383
        if self.compact_view:
384
            option = 'yes'
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
385
        else:
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
386
            option = 'no'
387
388
        self.config.set_user_option('viz-compact-view', option)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
389
390
        revision = self.treeview.get_revision()
391
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
392
        self.paned.get_child1().destroy()
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
393
        self.paned.pack1(self.construct_top(), resize=True, shrink=False)
394
395
        gobject.idle_add(self.set_revision, revision.revision_id)
368 by Daniel Schierbeck
Merged with mainline.
396
365 by Daniel Schierbeck
Fixed locks and made tagging work.
397
    def _tag_revision_cb(self, w):
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
398
        try:
399
            self.treeview.set_sensitive(False)
400
            self.branch.unlock()
401
            dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
402
            response = dialog.run()
403
            if response != gtk.RESPONSE_NONE:
404
                dialog.hide()
365 by Daniel Schierbeck
Fixed locks and made tagging work.
405
            
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
406
                if response == gtk.RESPONSE_OK:
407
                    try:
408
                        self.branch.lock_write()
409
                        self.branch.tags.set_tag(dialog.tagname, dialog._revid)
410
                    finally:
411
                        self.branch.unlock()
412
                
413
                dialog.destroy()
414
415
        finally:
416
            self.branch.lock_read()
394 by Daniel Schierbeck
Made the revisionview update when a revision is tagged.
417
            self.treeview.emit("revision-selected")
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
418
            self.treeview.set_sensitive(True)
365 by Daniel Schierbeck
Fixed locks and made tagging work.
419
348 by Daniel Schierbeck
Added toggle item for revision number column.
420
    def _col_visibility_changed(self, col, property):
373 by Daniel Schierbeck
Made column display options persisted.
421
        self.config.set_user_option(property + '-column-visible', col.get_active())
348 by Daniel Schierbeck
Added toggle item for revision number column.
422
        self.treeview.set_property(property + '-column-visible', col.get_active())
351 by Daniel Schierbeck
Added option to hide the toolbar.
423
424
    def _toolbar_visibility_changed(self, col):
425
        if col.get_active():
426
            self.toolbar.show() 
427
        else:
428
            self.toolbar.hide()
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
429
430
    def _show_about_cb(self, w):
431
        dialog = AboutDialog()
432
        dialog.connect('response', lambda d,r: d.destroy())
433
        dialog.run()