/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():
397 by Daniel Schierbeck
Made the tag list appear sorted in the viz.
178
            tags = self.branch.tags.get_tag_dict().items()
179
            tags.sort()
398 by Daniel Schierbeck
Reversed the tag list.
180
            tags.reverse()
397 by Daniel Schierbeck
Made the tag list appear sorted in the viz.
181
            for tag, revid in tags:
367 by Daniel Schierbeck
Fixed crash when branch didn't support tags.
182
                tag_item = gtk.MenuItem(tag)
183
                tag_item.connect('activate', self._tag_selected_cb, revid)
184
                tags_menu.add(tag_item)
332 by Daniel Schierbeck
Made tag selection work.
185
399 by Daniel Schierbeck
Made tags menu insensitive when there are no tags to display.
186
            go_menu_tags.set_sensitive(len(tags) != 0)
187
        else:
188
            go_menu_tags.set_sensitive(False)
189
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
190
        go_menu.add(go_menu_next)
191
        go_menu.add(go_menu_prev)
334 by Daniel Schierbeck
Added icons to menus.
192
        go_menu.add(gtk.SeparatorMenuItem())
193
        go_menu.add(go_menu_tags)
194
335 by Daniel Schierbeck
Added Revision menu.
195
        revision_menu = gtk.Menu()
196
        revision_menuitem = gtk.MenuItem("_Revision")
197
        revision_menuitem.set_submenu(revision_menu)
198
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
199
        revision_menu_diff = gtk.MenuItem("View Changes")
200
        revision_menu_diff.connect('activate', 
201
                lambda w: self.treeview.show_diff())
202
365 by Daniel Schierbeck
Fixed locks and made tagging work.
203
        revision_menu_tag = gtk.MenuItem("Tag Revision")
204
        revision_menu_tag.connect('activate', self._tag_revision_cb)
205
206
        revision_menu.add(revision_menu_tag)
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
207
        revision_menu.add(revision_menu_diff)
335 by Daniel Schierbeck
Added Revision menu.
208
334 by Daniel Schierbeck
Added icons to menus.
209
        branch_menu = gtk.Menu()
210
        branch_menuitem = gtk.MenuItem("_Branch")
211
        branch_menuitem.set_submenu(branch_menu)
212
336 by Daniel Schierbeck
Changed wording to comply with HIG guidelines.
213
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
214
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
215
216
        help_menu = gtk.Menu()
217
        help_menuitem = gtk.MenuItem("_Help")
218
        help_menuitem.set_submenu(help_menu)
219
220
        help_menu_about = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
221
        help_menu_about.connect('activate', self._show_about_cb)
222
223
        help_menu.add(help_menu_about)
334 by Daniel Schierbeck
Added icons to menus.
224
       
331 by Daniel Schierbeck
Added basic menu bar.
225
        menubar.add(file_menuitem)
338 by Daniel Schierbeck
Added Preferences menu item.
226
        menubar.add(edit_menuitem)
348 by Daniel Schierbeck
Added toggle item for revision number column.
227
        menubar.add(view_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
228
        menubar.add(go_menuitem)
335 by Daniel Schierbeck
Added Revision menu.
229
        menubar.add(revision_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
230
        menubar.add(branch_menuitem)
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
231
        menubar.add(help_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
232
        menubar.show_all()
233
234
        return menubar
280.2.1 by Gary van der Merwe
Add a message to the viz window to indicate that graph is still loading.
235
    
236
    def construct_loading_msg(self):
237
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
238
                                                 gtk.ICON_SIZE_BUTTON)
239
        image_loading.show()
240
        
241
        label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
368 by Daniel Schierbeck
Merged with mainline.
242
        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.
243
        label_loading.show()
244
        
245
        self.loading_msg_box = gtk.HBox()
246
        self.loading_msg_box.set_spacing(5)
247
        self.loading_msg_box.set_border_width(5)        
248
        self.loading_msg_box.pack_start(image_loading, False, False)
249
        self.loading_msg_box.pack_start(label_loading, True, True)
250
        self.loading_msg_box.show()
251
        
252
        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
253
254
    def construct_top(self):
255
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
256
        # FIXME: Make broken_line_length configurable
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
257
        if self.compact_view:
258
            brokenlines = 32
259
        else:
260
            brokenlines = None
261
262
        self.treeview = TreeView(self.branch, self.start, self.maxnum, brokenlines)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
263
373 by Daniel Schierbeck
Made column display options persisted.
264
        self.treeview.connect('revision-selected',
303 by Daniel Schierbeck
Made basic signaling work.
265
                self._treeselection_changed_cb)
266
307 by Daniel Schierbeck
Made load notification work again.
267
        self.treeview.connect('revisions-loaded', 
268
                lambda x: self.loading_msg_box.hide())
269
373 by Daniel Schierbeck
Made column display options persisted.
270
        for col in ["revno", "date"]:
271
            option = self.config.get_user_option(col + '-column-visible')
272
            if option is not None:
273
                self.treeview.set_property(col + '-column-visible', option == 'True')
274
1 by Scott James Remnant
Commit the first version of bzrk.
275
        self.treeview.show()
276
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
277
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
278
        align.set_padding(5, 0, 0, 0)
279
        align.add(self.treeview)
280
        align.show()
281
282
        return align
44 by David Allouche
reorganise branch window
283
284
    def construct_navigation(self):
285
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
286
        self.toolbar = gtk.Toolbar()
287
        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
288
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
289
        self.prev_button = self.prev_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
290
        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
291
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
292
        self.next_button = self.next_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
293
        self.toolbar.insert(self.next_button, -1)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
294
295
        self.toolbar.show_all()
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
296
297
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
298
299
    def construct_bottom(self):
300
        """Construct the bottom half of the window."""
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
301
        from bzrlib.plugins.gtk.revisionview import RevisionView
302
        self.revisionview = RevisionView(None, tags=[], show_children=True, branch=self.branch)
44 by David Allouche
reorganise branch window
303
        (width, height) = self.get_size()
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
304
        self.revisionview.set_size_request(width, int(height / 2.5))
305
        self.revisionview.show()
306
        self.revisionview.set_show_callback(self._show_clicked_cb)
307
        self.revisionview.set_go_callback(self._go_clicked_cb)
308
        return self.revisionview
332 by Daniel Schierbeck
Made tag selection work.
309
310
    def _tag_selected_cb(self, menuitem, revid):
356 by Daniel Schierbeck
Made revision a property on TreeView.
311
        self.treeview.set_revision_id(revid)
341 by Daniel Schierbeck
Merged with trunk.
312
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)
313
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
314
        """callback for when the treeview changes."""
315
        revision = self.treeview.get_revision()
316
        parents  = self.treeview.get_parents()
317
        children = self.treeview.get_children()
318
319
        if revision is not None:
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
320
            prev_menu = gtk.Menu()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
321
            if len(parents) > 0:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
322
                self.prev_rev_action.set_sensitive(True)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
323
                for parent_id in parents:
324
                    parent = self.branch.repository.get_revision(parent_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
325
                    try:
326
                        str = ' (' + parent.properties['branch-nick'] + ')'
327
                    except KeyError:
328
                        str = ""
329
330
                    item = gtk.MenuItem(parent.message.split("\n")[0] + str)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
331
                    item.connect('activate', self._set_revision_cb, parent_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
332
                    prev_menu.add(item)
333
                prev_menu.show_all()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
334
            else:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
335
                self.prev_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
336
                prev_menu.hide()
337
338
            self.prev_button.set_menu(prev_menu)
339
340
            next_menu = gtk.Menu()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
341
            if len(children) > 0:
386 by Daniel Schierbeck
Created a single action for Next Revision.
342
                self.next_rev_action.set_sensitive(True)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
343
                for child_id in children:
344
                    child = self.branch.repository.get_revision(child_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
345
                    try:
346
                        str = ' (' + child.properties['branch-nick'] + ')'
347
                    except KeyError:
348
                        str = ""
349
350
                    item = gtk.MenuItem(child.message.split("\n")[0] + str)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
351
                    item.connect('activate', self._set_revision_cb, child_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
352
                    next_menu.add(item)
353
                next_menu.show_all()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
354
            else:
386 by Daniel Schierbeck
Created a single action for Next Revision.
355
                self.next_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
356
                next_menu.hide()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
357
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
358
            self.next_button.set_menu(next_menu)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
359
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)
360
            tags = []
361
            if self.branch.supports_tags():
362
                tagdict = self.branch.tags.get_reverse_tag_dict()
363
                if tagdict.has_key(revision.revision_id):
364
                    tags = tagdict[revision.revision_id]
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
365
            self.revisionview.set_revision(revision, tags, children)
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
366
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
367
    def _back_clicked_cb(self, *args):
368
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
369
        self.treeview.back()
370
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
371
    def _fwd_clicked_cb(self, *args):
372
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
373
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
374
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
375
    def _go_clicked_cb(self, revid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
376
        """Callback for when the go button for a parent is clicked."""
356 by Daniel Schierbeck
Made revision a property on TreeView.
377
        self.treeview.set_revision_id(revid)
152 by Jelmer Vernooij
Cleanup some more code.
378
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
379
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
380
        """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.
381
        self.treeview.show_diff(revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
382
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
383
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
384
    def _set_revision_cb(self, w, revision_id):
356 by Daniel Schierbeck
Made revision a property on TreeView.
385
        self.treeview.set_revision_id(revision_id)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
386
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
387
    def _brokenlines_toggled_cb(self, button):
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
388
        self.compact_view = button.get_active()
389
390
        if self.compact_view:
391
            option = 'yes'
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
392
        else:
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
393
            option = 'no'
394
395
        self.config.set_user_option('viz-compact-view', option)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
396
397
        revision = self.treeview.get_revision()
398
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
399
        self.paned.get_child1().destroy()
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
400
        self.paned.pack1(self.construct_top(), resize=True, shrink=False)
401
402
        gobject.idle_add(self.set_revision, revision.revision_id)
368 by Daniel Schierbeck
Merged with mainline.
403
365 by Daniel Schierbeck
Fixed locks and made tagging work.
404
    def _tag_revision_cb(self, w):
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
405
        try:
406
            self.treeview.set_sensitive(False)
407
            self.branch.unlock()
408
            dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
409
            response = dialog.run()
410
            if response != gtk.RESPONSE_NONE:
411
                dialog.hide()
365 by Daniel Schierbeck
Fixed locks and made tagging work.
412
            
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
413
                if response == gtk.RESPONSE_OK:
414
                    try:
415
                        self.branch.lock_write()
416
                        self.branch.tags.set_tag(dialog.tagname, dialog._revid)
417
                    finally:
418
                        self.branch.unlock()
419
                
420
                dialog.destroy()
421
422
        finally:
423
            self.branch.lock_read()
394 by Daniel Schierbeck
Made the revisionview update when a revision is tagged.
424
            self.treeview.emit("revision-selected")
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
425
            self.treeview.set_sensitive(True)
365 by Daniel Schierbeck
Fixed locks and made tagging work.
426
348 by Daniel Schierbeck
Added toggle item for revision number column.
427
    def _col_visibility_changed(self, col, property):
373 by Daniel Schierbeck
Made column display options persisted.
428
        self.config.set_user_option(property + '-column-visible', col.get_active())
348 by Daniel Schierbeck
Added toggle item for revision number column.
429
        self.treeview.set_property(property + '-column-visible', col.get_active())
351 by Daniel Schierbeck
Added option to hide the toolbar.
430
431
    def _toolbar_visibility_changed(self, col):
432
        if col.get_active():
433
            self.toolbar.show() 
434
        else:
435
            self.toolbar.hide()
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
436
437
    def _show_about_cb(self, w):
438
        dialog = AboutDialog()
439
        dialog.connect('response', lambda d,r: d.destroy())
440
        dialog.run()