/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
1
# -*- coding: UTF-8 -*-
2
"""Revision history view.
3
4
"""
5
6
__copyright__ = "Copyright © 2005 Canonical Ltd."
7
__author__    = "Daniel Schierbeck <daniel.schierbeck@gmail.com>"
8
314 by Daniel Schierbeck
Moved branch locking into treeview.
9
import sys
10
import string
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
11
import gtk
12
import gobject
13
import pango
14
import re
303 by Daniel Schierbeck
Made basic signaling work.
15
import treemodel
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
16
17
from linegraph import linegraph, same_branch
18
from graphcell import CellRendererGraph
19
from treemodel import TreeModel
330.4.3 by Daniel Schierbeck
Switched to using NULL_REVISION instead of None.
20
from bzrlib.revision import NULL_REVISION
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
21
303 by Daniel Schierbeck
Made basic signaling work.
22
class TreeView(gtk.ScrolledWindow):
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
23
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
24
    __gproperties__ = {
352 by Daniel Schierbeck
Added branch property to treeview.
25
        'branch': (gobject.TYPE_PYOBJECT,
26
                   'Branch',
27
                   'The Bazaar branch being visualized',
28
                   gobject.PARAM_CONSTRUCT_ONLY | gobject.PARAM_WRITABLE),
29
356 by Daniel Schierbeck
Made revision a property on TreeView.
30
        'revision': (gobject.TYPE_PYOBJECT,
31
                     'Revision',
32
                     'The currently selected revision',
33
                     gobject.PARAM_READWRITE),
34
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
35
        'revision-number': (gobject.TYPE_STRING,
36
                            'Revision number',
37
                            'The number of the selected revision',
38
                            '',
39
                            gobject.PARAM_READABLE),
40
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
41
        'children': (gobject.TYPE_PYOBJECT,
42
                     'Child revisions',
43
                     'Children of the currently selected revision',
44
                     gobject.PARAM_READABLE),
45
46
        'parents': (gobject.TYPE_PYOBJECT,
47
                    'Parent revisions',
48
                    'Parents to the currently selected revision',
49
                    gobject.PARAM_READABLE),
50
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
51
        'revno-column-visible': (gobject.TYPE_BOOLEAN,
52
                                 'Revision number',
53
                                 'Show revision number column',
54
                                 True,
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
55
                                 gobject.PARAM_READWRITE),
56
57
        'date-column-visible': (gobject.TYPE_BOOLEAN,
360 by Daniel Schierbeck
Fixed wrong text in date property.
58
                                 'Date',
59
                                 'Show date column',
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
60
                                 False,
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
61
                                 gobject.PARAM_READWRITE),
62
63
        'compact': (gobject.TYPE_BOOLEAN,
64
                    'Compact view',
65
                    'Break ancestry lines to save space',
66
                    True,
67
                    gobject.PARAM_CONSTRUCT | gobject.PARAM_READWRITE)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
68
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
69
    }
70
307 by Daniel Schierbeck
Made load notification work again.
71
    __gsignals__ = {
345 by Daniel Schierbeck
Made treeview columns instance variables.
72
        'revisions-loaded': (gobject.SIGNAL_RUN_FIRST, 
73
                             gobject.TYPE_NONE,
74
                             ()),
75
        'revision-selected': (gobject.SIGNAL_RUN_FIRST,
76
                              gobject.TYPE_NONE,
77
                              ())
307 by Daniel Schierbeck
Made load notification work again.
78
    }
79
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
80
    def __init__(self, branch, start, maxnum, compact=True):
322 by Jelmer Vernooij
Add docstrings.
81
        """Create a new TreeView.
82
83
        :param branch: Branch object for branch to show.
84
        :param start: Revision id of top revision.
85
        :param maxnum: Maximum number of revisions to display, 
86
                       None for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
87
        :param broken_line_length: After how much lines to break 
88
                                   branches.
322 by Jelmer Vernooij
Add docstrings.
89
        """
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
90
        gtk.ScrolledWindow.__init__(self)
91
303 by Daniel Schierbeck
Made basic signaling work.
92
        self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
93
        self.set_shadow_type(gtk.SHADOW_IN)
94
303 by Daniel Schierbeck
Made basic signaling work.
95
        self.construct_treeview()
96
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
97
        self.iter = None
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
98
        self.branch = branch
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
99
        self.revision = None
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
100
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
101
        self.start = start
102
        self.maxnum = maxnum
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
103
        self.compact = compact
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
104
105
        gobject.idle_add(self.populate)
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
106
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
107
        self.connect("destroy", lambda x: self.branch.unlock())
108
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
109
    def do_get_property(self, property):
110
        if property.name == 'revno-column-visible':
352 by Daniel Schierbeck
Added branch property to treeview.
111
            return self.revno_column.get_visible()
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
112
        elif property.name == 'date-column-visible':
113
            return self.date_column.get_visible()
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
114
        elif property.name == 'compact':
115
            return self.compact
352 by Daniel Schierbeck
Added branch property to treeview.
116
        elif property.name == 'branch':
117
            return self.branch
356 by Daniel Schierbeck
Made revision a property on TreeView.
118
        elif property.name == 'revision':
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
119
            return self.model.get_value(self.iter, treemodel.REVISION)
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
120
        elif property.name == 'revision-number':
121
            return self.model.get_value(self.iter, treemodel.REVNO)
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
122
        elif property.name == 'children':
123
            return self.model.get_value(self.iter, treemodel.CHILDREN)
124
        elif property.name == 'parents':
125
            return self.model.get_value(self.iter, treemodel.PARENTS)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
126
        else:
127
            raise AttributeError, 'unknown property %s' % property.name
128
129
    def do_set_property(self, property, value):
130
        if property.name == 'revno-column-visible':
131
            self.revno_column.set_visible(value)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
132
        elif property.name == 'date-column-visible':
133
            self.date_column.set_visible(value)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
134
        elif property.name == 'compact':
135
            self.compact = value
352 by Daniel Schierbeck
Added branch property to treeview.
136
        elif property.name == 'branch':
137
            self.branch = value
356 by Daniel Schierbeck
Made revision a property on TreeView.
138
        elif property.name == 'revision':
139
            self.set_revision_id(value.revision_id)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
140
        else:
141
            raise AttributeError, 'unknown property %s' % property.name
142
303 by Daniel Schierbeck
Made basic signaling work.
143
    def get_revision(self):
322 by Jelmer Vernooij
Add docstrings.
144
        """Return revision id of currently selected revision, or None."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
145
        return self.get_property('revision')
146
147
    def set_revision(self, revision):
148
        self.set_property('revision', revision)
303 by Daniel Schierbeck
Made basic signaling work.
149
356 by Daniel Schierbeck
Made revision a property on TreeView.
150
    def set_revision_id(self, revid):
322 by Jelmer Vernooij
Add docstrings.
151
        """Change the currently selected revision.
152
153
        :param revid: Revision id of revision to display.
154
        """
305 by Daniel Schierbeck
Moved revision selection to the new view.
155
        self.treeview.set_cursor(self.index[revid])
156
        self.treeview.grab_focus()
157
303 by Daniel Schierbeck
Made basic signaling work.
158
    def get_children(self):
322 by Jelmer Vernooij
Add docstrings.
159
        """Return the children of the currently selected revision.
160
161
        :return: list of revision ids.
162
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
163
        return self.get_property('children')
303 by Daniel Schierbeck
Made basic signaling work.
164
165
    def get_parents(self):
322 by Jelmer Vernooij
Add docstrings.
166
        """Return the parents of the currently selected revision.
167
168
        :return: list of revision ids.
169
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
170
        return self.get_property('parents')
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
171
172
    def add_tag(self, tag, revid=None):
173
        if revid is None: revid = self.revision.revision_id
174
175
        try:
176
            self.branch.unlock()
177
178
            try:
179
                self.branch.lock_write()
180
                self.model.add_tag(tag, revid)
181
            finally:
182
                self.branch.unlock()
183
184
        finally:
185
            self.branch.lock_read()
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
186
        
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
187
    def refresh(self):
188
        gobject.idle_add(self.populate, self.get_revision())
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
189
404 by Daniel Schierbeck
Made the refresh use proper locking.
190
    def update(self):
191
        try:
192
            self.branch.unlock()
193
            try:
194
                self.branch.lock_write()
195
                self.branch.update()
196
            finally:
197
                self.branch.unlock()
198
        finally:
199
            self.branch.lock_read()
200
304 by Daniel Schierbeck
Made forward/back buttons work again.
201
    def back(self):
322 by Jelmer Vernooij
Add docstrings.
202
        """Signal handler for the Back button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
203
        parents = self.get_parents()
304 by Daniel Schierbeck
Made forward/back buttons work again.
204
        if not len(parents):
205
            return
206
207
        for parent_id in parents:
208
            parent_index = self.index[parent_id]
209
            parent = self.model[parent_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
210
            if same_branch(self.get_revision(), parent):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
211
                self.set_revision(parent)
304 by Daniel Schierbeck
Made forward/back buttons work again.
212
                break
213
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
214
            self.set_revision_id(parents[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
215
216
    def forward(self):
322 by Jelmer Vernooij
Add docstrings.
217
        """Signal handler for the Forward button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
218
        children = self.get_children()
304 by Daniel Schierbeck
Made forward/back buttons work again.
219
        if not len(children):
220
            return
221
222
        for child_id in children:
223
            child_index = self.index[child_id]
224
            child = self.model[child_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
225
            if same_branch(child, self.get_revision()):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
226
                self.set_revision(child)
304 by Daniel Schierbeck
Made forward/back buttons work again.
227
                break
228
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
229
            self.set_revision_id(children[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
230
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
231
    def populate(self, revision=None):
322 by Jelmer Vernooij
Add docstrings.
232
        """Fill the treeview with contents.
233
234
        :param start: Revision id of revision to start with.
235
        :param maxnum: Maximum number of revisions to display, or None 
236
                       for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
237
        :param broken_line_length: After how much lines branches \
238
                       should be broken.
322 by Jelmer Vernooij
Add docstrings.
239
        """
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
240
241
        if self.compact:
242
            broken_line_length = 32
243
        else:
244
            broken_line_length = None
245
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
246
        self.branch.lock_read()
247
        (linegraphdata, index, columns_len) = linegraph(self.branch.repository,
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
248
                                                        self.start,
249
                                                        self.maxnum, 
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
250
                                                        broken_line_length)
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
251
423.5.1 by Ali Sabil
Added tags visualization in the graph
252
        self.model = TreeModel(self.branch, linegraphdata)
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
253
        self.graph_cell.columns_len = columns_len
254
        width = self.graph_cell.get_size(self.treeview)[2]
403 by Daniel Schierbeck
Set a maximum width on the graph column.
255
        if width > 500:
256
            width = 500
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
257
        self.graph_column.set_fixed_width(width)
258
        self.graph_column.set_max_width(width)
259
        self.index = index
260
        self.treeview.set_model(self.model)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
261
262
        if revision is None:
263
            self.treeview.set_cursor(0)
264
        else:
265
            self.set_revision(revision)
266
392 by Daniel Schierbeck
Fixed performance issue by only releasing the branch lock when the treeview is destroyed. This will surely fuck up the tagging code.
267
        self.emit('revisions-loaded')
304 by Daniel Schierbeck
Made forward/back buttons work again.
268
269
        return False
270
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
271
    def show_diff(self, revid=None, parentid=None):
306 by Daniel Schierbeck
Made clicking a row work again.
272
        """Open a new window to show a diff between the given revisions."""
273
        from bzrlib.plugins.gtk.diff import DiffWindow
274
        window = DiffWindow(parent=self)
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
275
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
276
        parents = self.get_parents()
277
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
278
        if revid is None:
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
279
            revid = self.get_revision().revision_id
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
280
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
281
            if parentid is None and len(parents) > 0:
282
                parentid = parents[0]
330.4.3 by Daniel Schierbeck
Switched to using NULL_REVISION instead of None.
283
284
        if parentid is None:
285
            parentid = NULL_REVISION
286
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
287
        rev_tree    = self.branch.repository.revision_tree(revid)
288
        parent_tree = self.branch.repository.revision_tree(parentid)
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
289
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
290
        description = revid + " - " + self.branch.nick
306 by Daniel Schierbeck
Made clicking a row work again.
291
        window.set_diff(description, rev_tree, parent_tree)
292
        window.show()
293
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
294
    def construct_treeview(self):
295
        self.treeview = gtk.TreeView()
296
297
        self.treeview.set_rules_hint(True)
330.1.2 by Daniel Schierbeck
Replaced literal column index with equivalent symbol.
298
        self.treeview.set_search_column(treemodel.REVNO)
330.5.2 by Szilveszter Farkas (Phanatic)
Fixed set_tooltip_column() related issue.
299
        
330.5.5 by Szilveszter Farkas (Phanatic)
Use better fix by John.
300
        # Fix old PyGTK bug - by JAM
301
        set_tooltip = getattr(self.treeview, 'set_tooltip_column', None)
302
        if set_tooltip is not None:
303
            set_tooltip(treemodel.MESSAGE)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
304
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
305
        self.treeview.connect("cursor-changed",
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
306
                self._on_selection_changed)
307
308
        self.treeview.connect("row-activated", 
309
                self._on_revision_activated)
310
311
        self.treeview.connect("button-release-event", 
312
                self._on_revision_selected)
313
314
        self.treeview.set_property('fixed-height-mode', True)
315
316
        self.add(self.treeview)
317
        self.treeview.show()
318
319
        cell = gtk.CellRendererText()
320
        cell.set_property("width-chars", 15)
321
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
322
        self.revno_column = gtk.TreeViewColumn("Revision No")
323
        self.revno_column.set_resizable(True)
324
        self.revno_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
325
        self.revno_column.set_fixed_width(cell.get_size(self.treeview)[2])
326
        self.revno_column.pack_start(cell, expand=True)
327
        self.revno_column.add_attribute(cell, "text", treemodel.REVNO)
328
        self.treeview.append_column(self.revno_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
329
330
        self.graph_cell = CellRendererGraph()
331
        self.graph_column = gtk.TreeViewColumn()
332
        self.graph_column.set_resizable(True)
333
        self.graph_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
334
        self.graph_column.pack_start(self.graph_cell, expand=False)
335
        self.graph_column.add_attribute(self.graph_cell, "node", treemodel.NODE)
423.5.1 by Ali Sabil
Added tags visualization in the graph
336
        self.graph_column.add_attribute(self.graph_cell, "tags", treemodel.TAGS)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
337
        self.graph_column.add_attribute(self.graph_cell, "in-lines", treemodel.LAST_LINES)
338
        self.graph_column.add_attribute(self.graph_cell, "out-lines", treemodel.LINES)
339
        self.treeview.append_column(self.graph_column)
340
341
        cell = gtk.CellRendererText()
342
        cell.set_property("width-chars", 65)
343
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
344
        self.msg_column = gtk.TreeViewColumn("Message")
345
        self.msg_column.set_resizable(True)
346
        self.msg_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
347
        self.msg_column.set_fixed_width(cell.get_size(self.treeview)[2])
348
        self.msg_column.pack_start(cell, expand=True)
413 by Daniel Schierbeck
Made the treeview escape XML in the revision messages.
349
        self.msg_column.add_attribute(cell, "markup", treemodel.MESSAGE)
345 by Daniel Schierbeck
Made treeview columns instance variables.
350
        self.treeview.append_column(self.msg_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
351
352
        cell = gtk.CellRendererText()
353
        cell.set_property("width-chars", 15)
354
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
355
        self.committer_column = gtk.TreeViewColumn("Committer")
356
        self.committer_column.set_resizable(True)
357
        self.committer_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
358
        self.committer_column.set_fixed_width(cell.get_size(self.treeview)[2])
359
        self.committer_column.pack_start(cell, expand=True)
360
        self.committer_column.add_attribute(cell, "text", treemodel.COMMITER)
361
        self.treeview.append_column(self.committer_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
362
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
363
        cell = gtk.CellRendererText()
359 by Daniel Schierbeck
Simplified date format.
364
        cell.set_property("width-chars", 20)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
365
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
366
        self.date_column = gtk.TreeViewColumn("Date")
367
        self.date_column.set_visible(False)
368
        self.date_column.set_resizable(True)
369
        self.date_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
370
        self.date_column.set_fixed_width(cell.get_size(self.treeview)[2])
371
        self.date_column.pack_start(cell, expand=True)
372
        self.date_column.add_attribute(cell, "text", treemodel.TIMESTAMP)
373
        self.treeview.append_column(self.date_column)
374
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
375
    def _on_selection_changed(self, treeview):
303 by Daniel Schierbeck
Made basic signaling work.
376
        """callback for when the treeview changes."""
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
377
        (path, focus) = treeview.get_cursor()
378
        if path is not None:
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
379
            self.iter = self.model.get_iter(path)
310 by Daniel Schierbeck
Moved to using custom signal for handling revision selections.
380
            self.emit('revision-selected')
381
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
382
    def _on_revision_selected(self, widget, event):
383
        from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
384
        if event.button == 3:
385
            menu = RevisionPopupMenu(self.branch.repository, 
312 by Daniel Schierbeck
Made right-clicking work again.
386
                [self.get_revision().revision_id],
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
387
                self.branch)
388
            menu.popup(None, None, None, event.button, event.get_time())
389
390
    def _on_revision_activated(self, widget, path, col):
391
        # TODO: more than one parent
392
        """Callback for when a treeview row gets activated."""
393
        revision_id = self.model[path][treemodel.REVID]
394
        parents = self.model[path][treemodel.PARENTS]
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
395
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
396
        if len(parents) == 0:
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
397
            parent_id = None
398
        else:
399
            parent_id = parents[0]
400
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
401
        self.show_diff(revision_id, parent_id)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
402
        self.treeview.grab_focus()