/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)
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
69
        gtk.accel_map_add_entry("<viz>/View/Refresh", gtk.keysyms.F5, 0)
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
70
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
71
        self.accel_group = gtk.AccelGroup()
72
        self.add_accel_group(self.accel_group)
73
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
74
        gtk.Action.set_tool_item_type(gtk.MenuToolButton)
75
385 by Daniel Schierbeck
Created a single action for Previous Revision.
76
        self.prev_rev_action = gtk.Action("prev-rev", "_Previous Revision", "Go to the previous revision", gtk.STOCK_GO_DOWN)
77
        self.prev_rev_action.set_accel_path("<viz>/Go/Previous Revision")
78
        self.prev_rev_action.set_accel_group(self.accel_group)
79
        self.prev_rev_action.connect("activate", self._back_clicked_cb)
80
        self.prev_rev_action.connect_accelerator()
81
386 by Daniel Schierbeck
Created a single action for Next Revision.
82
        self.next_rev_action = gtk.Action("next-rev", "_Next Revision", "Go to the next revision", gtk.STOCK_GO_UP)
83
        self.next_rev_action.set_accel_path("<viz>/Go/Next Revision")
84
        self.next_rev_action.set_accel_group(self.accel_group)
85
        self.next_rev_action.connect("activate", self._fwd_clicked_cb)
86
        self.next_rev_action.connect_accelerator()
87
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
88
        self.refresh_action = gtk.Action("refresh", "_Refresh", "Refresh view", gtk.STOCK_REFRESH)
89
        self.refresh_action.set_accel_path("<viz>/View/Refresh")
90
        self.refresh_action.set_accel_group(self.accel_group)
91
        self.refresh_action.connect("activate", self._refresh_clicked)
92
        self.refresh_action.connect_accelerator()
93
1 by Scott James Remnant
Commit the first version of bzrk.
94
        self.construct()
95
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
96
    def set_revision(self, revid):
97
        self.treeview.set_revision_id(revid)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
98
1 by Scott James Remnant
Commit the first version of bzrk.
99
    def construct(self):
100
        """Construct the window contents."""
331 by Daniel Schierbeck
Added basic menu bar.
101
        vbox = gtk.VBox(spacing=0)
44 by David Allouche
reorganise branch window
102
        self.add(vbox)
103
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
104
        self.paned = gtk.VPaned()
105
        self.paned.pack1(self.construct_top(), resize=True, shrink=False)
106
        self.paned.pack2(self.construct_bottom(), resize=False, shrink=True)
107
        self.paned.show()
358 by Daniel Schierbeck
Generalized the hiding/showing code.
108
331 by Daniel Schierbeck
Added basic menu bar.
109
        vbox.pack_start(self.construct_menubar(), expand=False, fill=True)
44 by David Allouche
reorganise branch window
110
        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.
111
        
369 by Daniel Schierbeck
Fixed bug with compact view toggling.
112
        vbox.pack_start(self.paned, expand=True, fill=True)
113
        vbox.set_focus_child(self.paned)
44 by David Allouche
reorganise branch window
114
115
        vbox.show()
331 by Daniel Schierbeck
Added basic menu bar.
116
117
    def construct_menubar(self):
118
        menubar = gtk.MenuBar()
119
120
        file_menu = gtk.Menu()
334 by Daniel Schierbeck
Added icons to menus.
121
        file_menuitem = gtk.MenuItem("_File")
331 by Daniel Schierbeck
Added basic menu bar.
122
        file_menuitem.set_submenu(file_menu)
123
362 by Daniel Schierbeck
Added accel group to File -> Close menu item.
124
        file_menu_close = gtk.ImageMenuItem(gtk.STOCK_CLOSE, self.accel_group)
331 by Daniel Schierbeck
Added basic menu bar.
125
        file_menu_close.connect('activate', lambda x: self.destroy())
126
        
363 by Daniel Schierbeck
Added File -> Quit menu item.
127
        file_menu_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT, self.accel_group)
128
        file_menu_quit.connect('activate', lambda x: gtk.main_quit())
129
        
408 by Daniel Schierbeck
Made the close menu item actually appear when the viz is opened from another window.
130
        if self._parent is not None:
406 by Daniel Schierbeck
Made the viz show the close menu item only if opened from another window.
131
            file_menu.add(file_menu_close)
363 by Daniel Schierbeck
Added File -> Quit menu item.
132
        file_menu.add(file_menu_quit)
331 by Daniel Schierbeck
Added basic menu bar.
133
338 by Daniel Schierbeck
Added Preferences menu item.
134
        edit_menu = gtk.Menu()
135
        edit_menuitem = gtk.MenuItem("_Edit")
136
        edit_menuitem.set_submenu(edit_menu)
137
340 by Daniel Schierbeck
Added edit->find menu item stub.
138
        edit_menu_find = gtk.ImageMenuItem(gtk.STOCK_FIND)
139
361 by Daniel Schierbeck
Added branch settings menu item.
140
        edit_menu_branchopts = gtk.MenuItem("Branch Settings")
141
        edit_menu_branchopts.connect('activate', lambda x: PreferencesWindow(self.branch.get_config()).show())
142
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
143
        edit_menu_globopts = gtk.MenuItem("Global Settings")
144
        edit_menu_globopts.connect('activate', lambda x: PreferencesWindow().show())
338 by Daniel Schierbeck
Added Preferences menu item.
145
340 by Daniel Schierbeck
Added edit->find menu item stub.
146
        edit_menu.add(edit_menu_find)
361 by Daniel Schierbeck
Added branch settings menu item.
147
        edit_menu.add(edit_menu_branchopts)
407 by Daniel Schierbeck
Renamed Preferences menu item into Global Settings.
148
        edit_menu.add(edit_menu_globopts)
338 by Daniel Schierbeck
Added Preferences menu item.
149
348 by Daniel Schierbeck
Added toggle item for revision number column.
150
        view_menu = gtk.Menu()
151
        view_menuitem = gtk.MenuItem("_View")
152
        view_menuitem.set_submenu(view_menu)
153
499.1.1 by Russ Brown
Added Refresh menu option with keyboard shortcut to viz
154
        view_menu_refresh = self.refresh_action.create_menu_item()
155
        view_menu_refresh.connect('activate', self._refresh_clicked)
156
157
        view_menu.add(view_menu_refresh)
158
        view_menu.add(gtk.SeparatorMenuItem())
159
351 by Daniel Schierbeck
Added option to hide the toolbar.
160
        view_menu_toolbar = gtk.CheckMenuItem("Show Toolbar")
161
        view_menu_toolbar.set_active(True)
162
        view_menu_toolbar.connect('toggled', self._toolbar_visibility_changed)
163
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
164
        view_menu_compact = gtk.CheckMenuItem("Show Compact Graph")
165
        view_menu_compact.set_active(self.compact_view)
166
        view_menu_compact.connect('activate', self._brokenlines_toggled_cb)
167
351 by Daniel Schierbeck
Added option to hide the toolbar.
168
        view_menu.add(view_menu_toolbar)
370 by Daniel Schierbeck
Moved compact graph toggle to the menubar.
169
        view_menu.add(view_menu_compact)
351 by Daniel Schierbeck
Added option to hide the toolbar.
170
        view_menu.add(gtk.SeparatorMenuItem())
358 by Daniel Schierbeck
Generalized the hiding/showing code.
171
452.4.2 by Jelmer Vernooij
Hide revision number column if more than one branch was specified.
172
        self.mnu_show_revno_column = gtk.CheckMenuItem("Show Revision _Number Column")
173
        self.mnu_show_date_column = gtk.CheckMenuItem("Show _Date Column")
174
175
        # Revision numbers are pointless if there are multiple branches
176
        if len(self.start_revs) > 1:
177
            self.mnu_show_revno_column.set_sensitive(False)
178
            self.treeview.set_property('revno-column-visible', False)
179
180
        for (col, name) in [(self.mnu_show_revno_column, "revno"), 
181
                            (self.mnu_show_date_column, "date")]:
358 by Daniel Schierbeck
Generalized the hiding/showing code.
182
            col.set_active(self.treeview.get_property(name + "-column-visible"))
183
            col.connect('toggled', self._col_visibility_changed, name)
184
            view_menu.add(col)
348 by Daniel Schierbeck
Added toggle item for revision number column.
185
331 by Daniel Schierbeck
Added basic menu bar.
186
        go_menu = gtk.Menu()
382 by Daniel Schierbeck
Made accelerator for Previous Revision work.
187
        go_menu.set_accel_group(self.accel_group)
334 by Daniel Schierbeck
Added icons to menus.
188
        go_menuitem = gtk.MenuItem("_Go")
331 by Daniel Schierbeck
Added basic menu bar.
189
        go_menuitem.set_submenu(go_menu)
190
        
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
191
        go_menu_next = self.next_rev_action.create_menu_item()
192
        go_menu_prev = self.prev_rev_action.create_menu_item()
334 by Daniel Schierbeck
Added icons to menus.
193
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
194
        tag_image = gtk.Image()
195
        tag_image.set_from_file(icon_path("tag-16.png"))
196
        self.go_menu_tags = gtk.ImageMenuItem("_Tags")
197
        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.
198
        self._update_tags()
399 by Daniel Schierbeck
Made tags menu insensitive when there are no tags to display.
199
390 by Daniel Schierbeck
Made the Previous/Next Revision menu items local variables.
200
        go_menu.add(go_menu_next)
201
        go_menu.add(go_menu_prev)
334 by Daniel Schierbeck
Added icons to menus.
202
        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.
203
        go_menu.add(self.go_menu_tags)
334 by Daniel Schierbeck
Added icons to menus.
204
335 by Daniel Schierbeck
Added Revision menu.
205
        revision_menu = gtk.Menu()
206
        revision_menuitem = gtk.MenuItem("_Revision")
207
        revision_menuitem.set_submenu(revision_menu)
208
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
209
        revision_menu_diff = gtk.MenuItem("View Changes")
210
        revision_menu_diff.connect('activate', 
463.3.1 by Javier Derderian
Fixed menu entry 'View Changes'. Bug #215350
211
                self._menu_diff_cb)
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
212
        
213
        revision_menu_compare = gtk.MenuItem("Compare with...")
214
        revision_menu_compare.connect('activate',
215
                self._compare_with_cb)
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
216
365 by Daniel Schierbeck
Fixed locks and made tagging work.
217
        revision_menu_tag = gtk.MenuItem("Tag Revision")
218
        revision_menu_tag.connect('activate', self._tag_revision_cb)
219
220
        revision_menu.add(revision_menu_tag)
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
221
        revision_menu.add(revision_menu_diff)
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
222
        revision_menu.add(revision_menu_compare)
335 by Daniel Schierbeck
Added Revision menu.
223
334 by Daniel Schierbeck
Added icons to menus.
224
        branch_menu = gtk.Menu()
225
        branch_menuitem = gtk.MenuItem("_Branch")
226
        branch_menuitem.set_submenu(branch_menu)
227
336 by Daniel Schierbeck
Changed wording to comply with HIG guidelines.
228
        branch_menu.add(gtk.MenuItem("Pu_ll Revisions"))
229
        branch_menu.add(gtk.MenuItem("Pu_sh Revisions"))
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
230
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
231
        help_menu = gtk.Menu()
232
        help_menuitem = gtk.MenuItem("_Help")
233
        help_menuitem.set_submenu(help_menu)
234
235
        help_about_menuitem = gtk.ImageMenuItem(gtk.STOCK_ABOUT, self.accel_group)
236
        help_about_menuitem.connect('activate', self._about_dialog_cb)
237
238
        help_menu.add(help_about_menuitem)
239
331 by Daniel Schierbeck
Added basic menu bar.
240
        menubar.add(file_menuitem)
338 by Daniel Schierbeck
Added Preferences menu item.
241
        menubar.add(edit_menuitem)
348 by Daniel Schierbeck
Added toggle item for revision number column.
242
        menubar.add(view_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
243
        menubar.add(go_menuitem)
335 by Daniel Schierbeck
Added Revision menu.
244
        menubar.add(revision_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
245
        menubar.add(branch_menuitem)
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
246
        menubar.add(help_menuitem)
331 by Daniel Schierbeck
Added basic menu bar.
247
        menubar.show_all()
248
249
        return menubar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
250
251
    def construct_top(self):
252
        """Construct the top-half of the window."""
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
253
        # FIXME: Make broken_line_length configurable
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
254
452.4.1 by Jelmer Vernooij
Support displaying multiple tips in viz.
255
        self.treeview = TreeView(self.branch, self.start_revs, self.maxnum, self.compact_view)
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)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
259
        self.treeview.connect('revision-activated',
260
                self._tree_revision_activated)
303 by Daniel Schierbeck
Made basic signaling work.
261
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
262
        self.treeview.connect('tag-added', lambda w, t, r: self._update_tags())
263
373 by Daniel Schierbeck
Made column display options persisted.
264
        for col in ["revno", "date"]:
265
            option = self.config.get_user_option(col + '-column-visible')
266
            if option is not None:
267
                self.treeview.set_property(col + '-column-visible', option == 'True')
464.1.1 by Adrian Wilkins
Fixed column visibility properties not loading
268
            else:
269
                self.treeview.set_property(col + '-column-visible', False)
373 by Daniel Schierbeck
Made column display options persisted.
270
1 by Scott James Remnant
Commit the first version of bzrk.
271
        self.treeview.show()
272
375 by Daniel Schierbeck
Fixed crash when toggling compact view.
273
        align = gtk.Alignment(0.0, 0.0, 1.0, 1.0)
274
        align.set_padding(5, 0, 0, 0)
275
        align.add(self.treeview)
276
        align.show()
277
278
        return align
44 by David Allouche
reorganise branch window
279
280
    def construct_navigation(self):
281
        """Construct the navigation buttons."""
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
282
        self.toolbar = gtk.Toolbar()
283
        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
284
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
285
        self.prev_button = self.prev_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
286
        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
287
388 by Daniel Schierbeck
Switched to using the Previous/Next Revision actions to create tool buttons.
288
        self.next_button = self.next_rev_action.create_tool_item()
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
289
        self.toolbar.insert(self.next_button, -1)
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
290
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
291
        self.toolbar.insert(gtk.SeparatorToolItem(), -1)
292
293
        refresh_button = gtk.ToolButton(gtk.STOCK_REFRESH)
404 by Daniel Schierbeck
Made the refresh use proper locking.
294
        refresh_button.connect('clicked', self._refresh_clicked)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
295
        self.toolbar.insert(refresh_button, -1)
296
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
297
        self.toolbar.show_all()
325 by Daniel Schierbeck
Switched to using a real toolbar for the viz navigation.
298
299
        return self.toolbar
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
300
301
    def construct_bottom(self):
302
        """Construct the bottom half of the window."""
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
303
        from bzrlib.plugins.gtk.revisionview import RevisionView
412.1.2 by Daniel Schierbeck
Moved retrieval of tags into the revisionview itself.
304
        self.revisionview = RevisionView(branch=self.branch)
44 by David Allouche
reorganise branch window
305
        (width, height) = self.get_size()
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
306
        self.revisionview.set_size_request(width, int(height / 2.5))
307
        self.revisionview.show()
308
        self.revisionview.set_show_callback(self._show_clicked_cb)
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
309
        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.
310
        self.treeview.connect('tag-added', lambda w, t, r: self.revisionview.update_tags())
330.3.1 by Daniel Schierbeck
Renamed logview 'revisionview'.
311
        return self.revisionview
332 by Daniel Schierbeck
Made tag selection work.
312
313
    def _tag_selected_cb(self, menuitem, revid):
356 by Daniel Schierbeck
Made revision a property on TreeView.
314
        self.treeview.set_revision_id(revid)
341 by Daniel Schierbeck
Merged with trunk.
315
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)
316
    def _treeselection_changed_cb(self, selection, *args):
303 by Daniel Schierbeck
Made basic signaling work.
317
        """callback for when the treeview changes."""
318
        revision = self.treeview.get_revision()
319
        parents  = self.treeview.get_parents()
320
        children = self.treeview.get_children()
321
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
322
        if revision and revision != NULL_REVISION:
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
323
            prev_menu = gtk.Menu()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
324
            if len(parents) > 0:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
325
                self.prev_rev_action.set_sensitive(True)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
326
                for parent_id in parents:
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
327
                    if parent_id and parent_id != NULL_REVISION:
328
                        parent = self.branch.repository.get_revision(parent_id)
329
                        try:
330
                            str = ' (' + parent.properties['branch-nick'] + ')'
331
                        except KeyError:
332
                            str = ""
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
333
464.2.1 by Adrian Wilkins
Detect the reserved null: revision in appropriate places.
334
                        item = gtk.MenuItem(parent.message.split("\n")[0] + str)
335
                        item.connect('activate', self._set_revision_cb, parent_id)
336
                        prev_menu.add(item)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
337
                prev_menu.show_all()
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
338
            else:
385 by Daniel Schierbeck
Created a single action for Previous Revision.
339
                self.prev_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
340
                prev_menu.hide()
341
342
            self.prev_button.set_menu(prev_menu)
343
344
            next_menu = gtk.Menu()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
345
            if len(children) > 0:
386 by Daniel Schierbeck
Created a single action for Next Revision.
346
                self.next_rev_action.set_sensitive(True)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
347
                for child_id in children:
348
                    child = self.branch.repository.get_revision(child_id)
355 by Daniel Schierbeck
Appended branch nick to parent and child popup menus.
349
                    try:
350
                        str = ' (' + child.properties['branch-nick'] + ')'
351
                    except KeyError:
352
                        str = ""
353
354
                    item = gtk.MenuItem(child.message.split("\n")[0] + str)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
355
                    item.connect('activate', self._set_revision_cb, child_id)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
356
                    next_menu.add(item)
357
                next_menu.show_all()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
358
            else:
386 by Daniel Schierbeck
Created a single action for Next Revision.
359
                self.next_rev_action.set_sensitive(False)
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
360
                next_menu.hide()
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
361
376 by Daniel Schierbeck
Changed 'back' into 'prev' and 'fwd' into 'next'.
362
            self.next_button.set_menu(next_menu)
352.1.2 by Daniel Schierbeck
Added dropdown menu to Forward button.
363
412.1.13 by Daniel Schierbeck
Re-added support for displaying the children of a revision.
364
            self.revisionview.set_revision(revision)
365
            self.revisionview.set_children(children)
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
366
    
367
    def _tree_revision_activated(self, widget, path, col):
368
        # TODO: more than one parent
369
        """Callback for when a treeview row gets activated."""
370
        revision = self.treeview.get_revision()
371
        parents  = self.treeview.get_parents()
372
373
        if len(parents) == 0:
374
            parent_id = None
375
        else:
376
            parent_id = parents[0]
377
378
        self.show_diff(revision.revision_id, parent_id)
379
        self.treeview.grab_focus()
463.3.1 by Javier Derderian
Fixed menu entry 'View Changes'. Bug #215350
380
        
381
    def _menu_diff_cb(self,w):
382
        (path, focus) = self.treeview.treeview.get_cursor()
383
        revid = self.treeview.model[path][treemodel.REVID]
384
        
385
        parentids = self.branch.repository.revision_parents(revid)
386
387
        if len(parentids) == 0:
388
            parentid = NULL_REVISION
389
        else:
390
            parentid = parentids[0]
391
        
392
        self.show_diff(revid,parentid)    
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
393
3 by Scott James Remnant
Split the display in two with a pane, we'll use the bottom half to show
394
    def _back_clicked_cb(self, *args):
395
        """Callback for when the back button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
396
        self.treeview.back()
397
        
5 by Scott James Remnant
Reverse the meaning of the Back and Forward buttons so Back actually
398
    def _fwd_clicked_cb(self, *args):
399
        """Callback for when the forward button is clicked."""
304 by Daniel Schierbeck
Made forward/back buttons work again.
400
        self.treeview.forward()
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
401
412.1.9 by Daniel Schierbeck
Removed the use of RevisionView.set_go_callback().
402
    def _go_clicked_cb(self, w, p):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
403
        """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().
404
        if self.revisionview.get_revision() is not None:
405
            self.treeview.set_revision(self.revisionview.get_revision())
152 by Jelmer Vernooij
Cleanup some more code.
406
147 by Jelmer Vernooij
Remove a bunch of duplicate functionality.
407
    def _show_clicked_cb(self, revid, parentid):
7 by Scott James Remnant
Put some information about the highlighted revision in the bottom pane,
408
        """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.
409
        self.show_diff(revid, parentid)
13 by Scott James Remnant
Keep the focus on the treeview
410
        self.treeview.grab_focus()
46 by Wouter van Heyst
show diff on row activation, LP# 44591
411
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
412
    def _compare_with_cb(self,w):
413
        """Callback for revision 'compare with' menu. Will show a small
414
            dialog with branch revisions to compare with selected revision in TreeView"""
415
        
463.2.2 by Javier Derderian
Updated "Compare with..." (#78765) to use revbrowser.RevisionBrowser.
416
        from bzrlib.plugins.gtk.revbrowser import RevisionBrowser
417
        
418
        rb = RevisionBrowser(self.branch,self)
419
        ret = rb.run()
420
        
421
        if ret == gtk.RESPONSE_OK:          
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
422
            (path, focus) = self.treeview.treeview.get_cursor()
423
            revid = self.treeview.model[path][treemodel.REVID]
463.2.2 by Javier Derderian
Updated "Compare with..." (#78765) to use revbrowser.RevisionBrowser.
424
            self.show_diff(revid, rb.selected_revid)
425
            
426
        rb.destroy()
461.1.3 by Javier Derderian
Added "compare with" option to revisions menu.
427
            
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
428
    def _set_revision_cb(self, w, revision_id):
356 by Daniel Schierbeck
Made revision a property on TreeView.
429
        self.treeview.set_revision_id(revision_id)
352.1.1 by Daniel Schierbeck
Added dropdown menu to Back button.
430
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
431
    def _brokenlines_toggled_cb(self, button):
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
432
        self.compact_view = button.get_active()
433
434
        if self.compact_view:
435
            option = 'yes'
330.2.4 by Daniel Schierbeck
Made use of compact view optional.
436
        else:
330.2.5 by Daniel Schierbeck
Support persistence of compact view option.
437
            option = 'no'
438
439
        self.config.set_user_option('viz-compact-view', option)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
440
        self.treeview.set_property('compact', self.compact_view)
441
        self.treeview.refresh()
368 by Daniel Schierbeck
Merged with mainline.
442
365 by Daniel Schierbeck
Fixed locks and made tagging work.
443
    def _tag_revision_cb(self, w):
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
444
        try:
445
            self.treeview.set_sensitive(False)
446
            dialog = AddTagDialog(self.branch.repository, self.treeview.get_revision().revision_id, self.branch)
447
            response = dialog.run()
448
            if response != gtk.RESPONSE_NONE:
449
                dialog.hide()
365 by Daniel Schierbeck
Fixed locks and made tagging work.
450
            
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
451
                if response == gtk.RESPONSE_OK:
423.7.7 by Daniel Schierbeck
Simplified Go->Tag Revision menu item in the viz.
452
                    self.treeview.add_tag(dialog.tagname, dialog._revid)
392.1.1 by Daniel Schierbeck
Made it possible to tag revisions again.
453
                
454
                dialog.destroy()
455
456
        finally:
457
            self.treeview.set_sensitive(True)
365 by Daniel Schierbeck
Fixed locks and made tagging work.
458
423.9.1 by Daniel Schierbeck
Added Help->About menu item to the viz.
459
    def _about_dialog_cb(self, w):
460
        from bzrlib.plugins.gtk.about import AboutDialog
461
462
        AboutDialog().run()
463
348 by Daniel Schierbeck
Added toggle item for revision number column.
464
    def _col_visibility_changed(self, col, property):
373 by Daniel Schierbeck
Made column display options persisted.
465
        self.config.set_user_option(property + '-column-visible', col.get_active())
348 by Daniel Schierbeck
Added toggle item for revision number column.
466
        self.treeview.set_property(property + '-column-visible', col.get_active())
351 by Daniel Schierbeck
Added option to hide the toolbar.
467
468
    def _toolbar_visibility_changed(self, col):
469
        if col.get_active():
470
            self.toolbar.show() 
471
        else:
472
            self.toolbar.hide()
371.1.1 by Daniel Schierbeck
Added About dialog to the viz.
473
474
    def _show_about_cb(self, w):
475
        dialog = AboutDialog()
476
        dialog.connect('response', lambda d,r: d.destroy())
477
        dialog.run()
404 by Daniel Schierbeck
Made the refresh use proper locking.
478
479
    def _refresh_clicked(self, w):
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
480
        self.treeview.refresh()
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
481
482
    def _update_tags(self):
483
        menu = gtk.Menu()
484
485
        if self.branch.supports_tags():
486
            tags = self.branch.tags.get_tag_dict().items()
487
            tags.sort()
488
            tags.reverse()
489
            for tag, revid in tags:
450.4.1 by Daniel Schierbeck
Added tag icon to branch history window.
490
                tag_image = gtk.Image()
491
                tag_image.set_from_file(icon_path('tag-16.png'))
492
                tag_item = gtk.ImageMenuItem(tag.replace('_', '__'))
493
                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.
494
                tag_item.connect('activate', self._tag_selected_cb, revid)
495
                menu.add(tag_item)
496
            self.go_menu_tags.set_submenu(menu)
497
498
            self.go_menu_tags.set_sensitive(len(tags) != 0)
499
        else:
500
            self.go_menu_tags.set_sensitive(False)
501
502
        self.go_menu_tags.show_all()
503
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
504
    def show_diff(self, revid=None, parentid=None):
505
        """Open a new window to show a diff between the given revisions."""
506
        from bzrlib.plugins.gtk.diff import DiffWindow
507
        window = DiffWindow(parent=self)
508
509
        if parentid is None:
510
            parentid = NULL_REVISION
511
512
        rev_tree    = self.branch.repository.revision_tree(revid)
513
        parent_tree = self.branch.repository.revision_tree(parentid)
514
515
        description = revid + " - " + self.branch.nick
516
        window.set_diff(description, rev_tree, parent_tree)
517
        window.show()
518
423.7.5 by Daniel Schierbeck
Made the revision history window update the Go->Tags menu when a tag is added.
519