/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
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
17
from bzrlib.plugins.gtk import icon_path
365 by Daniel Schierbeck
Fixed locks and made tagging work.
18
from bzrlib.plugins.gtk.tags import AddTagDialog
338 by Daniel Schierbeck
Added Preferences menu item.
19
from bzrlib.plugins.gtk.preferences import PreferencesWindow
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
20
from bzrlib.plugins.gtk.branchview import TreeView, treemodel
443 by Szilveszter Farkas (Phanatic)
Trivial fix for #149061 (be able to show the diff for revision 1).
21
from bzrlib.revision import Revision, NULL_REVISION
361 by Daniel Schierbeck
Added branch settings menu item.
22
from bzrlib.config import BranchConfig
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
23
from bzrlib.config import GlobalConfig
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
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
32
    def __init__(self, branch, start_revs, maxnum, parent=None):
322 by Jelmer Vernooij
Add docstrings.
33
        """Create a new BranchWindow.
34
35
        :param branch: Branch object for branch to show.
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
36
        :param start_revs: Revision ids of top revisions.
322 by Jelmer Vernooij
Add docstrings.
37
        :param maxnum: Maximum number of revisions to display, 
38
                       None for no limit.
39
        """
40
298.2.1 by Daniel Schierbeck
Refactored the GTK window code, creating a single base window class that handles keyboard events.
41
        Window.__init__(self, parent=parent)
1 by Scott James Remnant
Commit the first version of bzrk.
42
        self.set_border_width(0)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
43
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
44
        self.branch      = branch
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
45
        self.start_revs  = start_revs
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
46
        self.maxnum      = maxnum
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
47
        self.config      = GlobalConfig()
48
49
        if self.config.get_user_option('viz-compact-view') == 'yes':
50
            self.compact_view = True
51
        else:
52
            self.compact_view = False
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
53
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
        
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
452.4.2 by Jelmer Vernooij
Hide revision number column if more than one branch was specified.
159
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
160
        self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
161
162
        # Revision numbers are pointless if there are multiple branches
163
        if len(self.start_revs) > 1:
164
            self.mnu_show_revno_column.set_sensitive(False)
165
            self.treeview.set_property('revno-column-visible', False)
166
167
        for (col, name) in [(self.mnu_show_revno_column, "revno"), 
168
                            (self.mnu_show_date_column, "date")]:
358 by Daniel Schierbeck
Generalized the hiding/showing code.
169
            col.set_active(self.treeview.get_property(name + "-column-visible"))
170
            col.connect('toggled', self._col_visibility_changed, name)
171
            view_menu.add(col)
348 by Daniel Schierbeck
Added toggle item for revision number column.
172
331 by Daniel Schierbeck
Added basic menu bar.
173
        go_menu = gtk.Menu()
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
174
        go_menu.set_accel_group(self.accel_group)
334 by Daniel Schierbeck
Added icons to menus.
175
        go_menuitem = gtk.MenuItem("_Go")
331 by Daniel Schierbeck
Added basic menu bar.
176
        go_menuitem.set_submenu(go_menu)
177
        
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
178
        go_menu_next = self.next_rev_action.create_menu_item()
179
        go_menu_prev = self.prev_rev_action.create_menu_item()
334 by Daniel Schierbeck
Added icons to menus.
180
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
181
        tag_image = gtk.Image()
182
        tag_image.set_from_file(icon_path("tag-16.png"))
183
        self.go_menu_tags = gtk.ImageMenuItem("_Tags")
184
        self.go_menu_tags.set_image(tag_image)
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
185
        self._update_tags()
399 by Daniel Schierbeck
Made tags menu insensitive when there are no tags to display.
186
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
187
        go_menu.add(go_menu_next)
188
        go_menu.add(go_menu_prev)
334 by Daniel Schierbeck
Added icons to menus.
189
        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.
190
        go_menu.add(self.go_menu_tags)
334 by Daniel Schierbeck
Added icons to menus.
191
335 by Daniel Schierbeck
Added Revision menu.
192
        revision_menu = gtk.Menu()
193
        revision_menuitem = gtk.MenuItem("_Revision")
194
        revision_menuitem.set_submenu(revision_menu)
195
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
196
        revision_menu_diff = gtk.MenuItem("View Changes")
197
        revision_menu_diff.connect('activate', 
463.3.1 by Javier Derderian
Fixed menu entry 'View Changes'. Bug #215350
198
                self._menu_diff_cb)
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
199
        
200
        revision_menu_compare = gtk.MenuItem("Compare with...")
201
        revision_menu_compare.connect('activate',
202
                self._compare_with_cb)
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
203
365 by Daniel Schierbeck
Fixed locks and made tagging work.
204
        revision_menu_tag = gtk.MenuItem("Tag Revision")
205
        revision_menu_tag.connect('activate', self._tag_revision_cb)
206
207
        revision_menu.add(revision_menu_tag)
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
208
        revision_menu.add(revision_menu_diff)
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
209
        revision_menu.add(revision_menu_compare)
335 by Daniel Schierbeck
Added Revision menu.
210
334 by Daniel Schierbeck
Added icons to menus.
211
        branch_menu = gtk.Menu()
212
        branch_menuitem = gtk.MenuItem("_Branch")
213
        branch_menuitem.set_submenu(branch_menu)
214
336 by Daniel Schierbeck
Changed wording to comply with HIG guidelines.
215
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
216
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
217
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
218
        help_menu = gtk.Menu()
219
        help_menuitem = gtk.MenuItem("_Help")
220
        help_menuitem.set_submenu(help_menu)
221
222
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
223
        help_about_menuitem.connect('activate', self._about_dialog_cb)
224
225
        help_menu.add(help_about_menuitem)
226
331 by Daniel Schierbeck
Added basic menu bar.
227
        menubar.add(file_menuitem)
338 by Daniel Schierbeck
Added Preferences menu item.
228
        menubar.add(edit_menuitem)
348 by Daniel Schierbeck
Added toggle item for revision number column.
229
        menubar.add(view_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
230
        menubar.add(go_menuitem)
335 by Daniel Schierbeck
Added Revision menu.
231
        menubar.add(revision_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
232
        menubar.add(branch_menuitem)
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
233
        menubar.add(help_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
234
        menubar.show_all()
235
236
        return menubar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
237
238
    def construct_top(self):
239
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
240
        # FIXME: Make broken_line_length configurable
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
241
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
242
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
315 by Daniel Schierbeck
Removed BranchWindow.set_branch(), used constructor instead.
243
373 by Daniel Schierbeck
Made column display options persisted.
244
        self.treeview.connect('revision-selected',
303 by Daniel Schierbeck
Made basic signaling work.
245
                self._treeselection_changed_cb)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
246
        self.treeview.connect('revision-activated',
247
                self._tree_revision_activated)
303 by Daniel Schierbeck
Made basic signaling work.
248
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
249
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
250
373 by Daniel Schierbeck
Made column display options persisted.
251
        for col in ["revno", "date"]:
252
            option = self.config.get_user_option(col + '-column-visible')
253
            if option is not None:
254
                self.treeview.set_property(col + '-column-visible', option == 'True')
464.1.1 by Adrian Wilkins
Fixed column visibility properties not loading
255
            else:
256
                self.treeview.set_property(col + '-column-visible', False)
373 by Daniel Schierbeck
Made column display options persisted.
257
1 by Scott James Remnant
Commit the first version of bzrk.
258
        self.treeview.show()
259
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
260
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
261
        align.set_padding(5, 0, 0, 0)
262
        align.add(self.treeview)
263
        align.show()
264
265
        return align
44 by David Allouche
reorganise branch window
266
267
    def construct_navigation(self):
268
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
269
        self.toolbar = gtk.Toolbar()
270
        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
271
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
272
        self.prev_button = self.prev_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
273
        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
274
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
275
        self.next_button = self.next_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
276
        self.toolbar.insert(self.next_button, -1)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
277
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
278
        self.toolbar.insert(gtk.SeparatorToolItem(), -1)
279
280
        refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
404 by Daniel Schierbeck
Made the refresh use proper locking.
281
        refresh_button.connect('clicked', self._refresh_clicked)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
282
        self.toolbar.insert(refresh_button, -1)
283
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
284
        self.toolbar.show_all()
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
285
286
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
287
288
    def construct_bottom(self):
289
        """Construct the bottom half of the window."""
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
290
        from bzrlib.plugins.gtk.revisionview import RevisionView
412.1.2 by Daniel Schierbeck
Moved retrieval of tags into the revisionview itself.
291
        self.revisionview = RevisionView(branch=self.branch)
44 by David Allouche
reorganise branch window
292
        (width, height) = self.get_size()
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
293
        self.revisionview.set_size_request(width, int(height / 2.5))
294
        self.revisionview.show()
295
        self.revisionview.set_show_callback(self._show_clicked_cb)
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
296
        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.
297
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
298
        return self.revisionview
332 by Daniel Schierbeck
Made tag selection work.
299
300
    def _tag_selected_cb(self, menuitem, revid):
356 by Daniel Schierbeck
Made revision a property on TreeView.
301
        self.treeview.set_revision_id(revid)
341 by Daniel Schierbeck
Merged with trunk.
302
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)
303
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
304
        """callback for when the treeview changes."""
305
        revision = self.treeview.get_revision()
306
        parents  = self.treeview.get_parents()
307
        children = self.treeview.get_children()
308
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
309
        if revision and revision != NULL_REVISION:
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
310
            prev_menu = gtk.Menu()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
311
            if len(parents) > 0:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
312
                self.prev_rev_action.set_sensitive(True)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
313
                for parent_id in parents:
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
314
                    if parent_id and parent_id != NULL_REVISION:
315
                        parent = self.branch.repository.get_revision(parent_id)
316
                        try:
317
                            str = ' (' + parent.properties['branch-nick'] + ')'
318
                        except KeyError:
319
                            str = ""
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
320
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
321
                        item = gtk.MenuItem(parent.message.split("\n")[0] + str)
322
                        item.connect('activate', self._set_revision_cb, parent_id)
323
                        prev_menu.add(item)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
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)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
353
    
354
    def _tree_revision_activated(self, widget, path, col):
355
        # TODO: more than one parent
356
        """Callback for when a treeview row gets activated."""
357
        revision = self.treeview.get_revision()
358
        parents  = self.treeview.get_parents()
359
360
        if len(parents) == 0:
361
            parent_id = None
362
        else:
363
            parent_id = parents[0]
364
365
        self.show_diff(revision.revision_id, parent_id)
366
        self.treeview.grab_focus()
463.3.1 by Javier Derderian
Fixed menu entry 'View Changes'. Bug #215350
367
        
368
    def _menu_diff_cb(self,w):
369
        (path, focus) = self.treeview.treeview.get_cursor()
370
        revid = self.treeview.model[path][treemodel.REVID]
371
        
372
        parentids = self.branch.repository.revision_parents(revid)
373
374
        if len(parentids) == 0:
375
            parentid = NULL_REVISION
376
        else:
377
            parentid = parentids[0]
378
        
379
        self.show_diff(revid,parentid)    
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
380
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
381
    def _back_clicked_cb(self, *args):
382
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
383
        self.treeview.back()
384
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
385
    def _fwd_clicked_cb(self, *args):
386
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
387
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
388
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
389
    def _go_clicked_cb(self, w, p):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
390
        """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().
391
        if self.revisionview.get_revision() is not None:
392
            self.treeview.set_revision(self.revisionview.get_revision())
152 by Jelmer Vernooij
Cleanup some more code.
393
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
394
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
395
        """Callback for when the show button for a parent is clicked."""
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
396
        self.show_diff(revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
397
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
398
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
399
    def _compare_with_cb(self,w):
400
        """Callback for revision 'compare with' menu. Will show a small
401
            dialog with branch revisions to compare with selected revision in TreeView"""
402
        
463.2.2 by Javier Derderian
Updated "Compare with..." (#78765) to use revbrowser.RevisionBrowser.
403
        from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
404
        
405
        rb = RevisionBrowser(self.branch,self)
406
        ret = rb.run()
407
        
408
        if ret == gtk.RESPONSE_OK:          
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
409
            (path, focus) = self.treeview.treeview.get_cursor()
410
            revid = self.treeview.model[path][treemodel.REVID]
463.2.2 by Javier Derderian
Updated "Compare with..." (#78765) to use revbrowser.RevisionBrowser.
411
            self.show_diff(revid, rb.selected_revid)
412
            
413
        rb.destroy()
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
414
            
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
415
    def _set_revision_cb(self, w, revision_id):
356 by Daniel Schierbeck
Made revision a property on TreeView.
416
        self.treeview.set_revision_id(revision_id)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
417
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
418
    def _brokenlines_toggled_cb(self, button):
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
419
        self.compact_view = button.get_active()
420
421
        if self.compact_view:
422
            option = 'yes'
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
423
        else:
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
424
            option = 'no'
425
426
        self.config.set_user_option('viz-compact-view', option)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
427
        self.treeview.set_property('compact', self.compact_view)
428
        self.treeview.refresh()
368 by Daniel Schierbeck
Merged with mainline.
429
365 by Daniel Schierbeck
Fixed locks and made tagging work.
430
    def _tag_revision_cb(self, w):
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
431
        try:
432
            self.treeview.set_sensitive(False)
433
            dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
434
            response = dialog.run()
435
            if response != gtk.RESPONSE_NONE:
436
                dialog.hide()
365 by Daniel Schierbeck
Fixed locks and made tagging work.
437
            
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
438
                if response == gtk.RESPONSE_OK:
423.7.7 by Daniel Schierbeck
Simplified Go->Tag Revision menu item in the viz.
439
                    self.treeview.add_tag(dialog.tagname, dialog._revid)
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
440
                
441
                dialog.destroy()
442
443
        finally:
444
            self.treeview.set_sensitive(True)
365 by Daniel Schierbeck
Fixed locks and made tagging work.
445
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
446
    def _about_dialog_cb(self, w):
447
        from bzrlib.plugins.gtk.about import AboutDialog
448
449
        AboutDialog().run()
450
348 by Daniel Schierbeck
Added toggle item for revision number column.
451
    def _col_visibility_changed(self, col, property):
373 by Daniel Schierbeck
Made column display options persisted.
452
        self.config.set_user_option(property + '-column-visible', col.get_active())
348 by Daniel Schierbeck
Added toggle item for revision number column.
453
        self.treeview.set_property(property + '-column-visible', col.get_active())
351 by Daniel Schierbeck
Added option to hide the toolbar.
454
455
    def _toolbar_visibility_changed(self, col):
456
        if col.get_active():
457
            self.toolbar.show() 
458
        else:
459
            self.toolbar.hide()
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
460
461
    def _show_about_cb(self, w):
462
        dialog = AboutDialog()
463
        dialog.connect('response', lambda d,r: d.destroy())
464
        dialog.run()
404 by Daniel Schierbeck
Made the refresh use proper locking.
465
466
    def _refresh_clicked(self, w):
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
467
        self.treeview.refresh()
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
468
469
    def _update_tags(self):
470
        menu = gtk.Menu()
471
472
        if self.branch.supports_tags():
473
            tags = self.branch.tags.get_tag_dict().items()
474
            tags.sort()
475
            tags.reverse()
476
            for tag, revid in tags:
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
477
                tag_image = gtk.Image()
478
                tag_image.set_from_file(icon_path('tag-16.png'))
479
                tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
480
                tag_item.set_image(tag_image)
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
481
                tag_item.connect('activate', self._tag_selected_cb, revid)
482
                menu.add(tag_item)
483
            self.go_menu_tags.set_submenu(menu)
484
485
            self.go_menu_tags.set_sensitive(len(tags) != 0)
486
        else:
487
            self.go_menu_tags.set_sensitive(False)
488
489
        self.go_menu_tags.show_all()
490
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
491
    def show_diff(self, revid=None, parentid=None):
492
        """Open a new window to show a diff between the given revisions."""
493
        from bzrlib.plugins.gtk.diff import DiffWindow
494
        window = DiffWindow(parent=self)
495
496
        if parentid is None:
497
            parentid = NULL_REVISION
498
499
        rev_tree    = self.branch.repository.revision_tree(revid)
500
        parent_tree = self.branch.repository.revision_tree(parentid)
501
502
        description = revid + " - " + self.branch.nick
503
        window.set_diff(description, rev_tree, parent_tree)
504
        window.show()
505
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
506