/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
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
22
class TreeView(gtk.VBox):
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,
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
77
                              ()),
78
        'tag-added': (gobject.SIGNAL_RUN_FIRST,
79
                              gobject.TYPE_NONE,
80
                              (gobject.TYPE_STRING, gobject.TYPE_STRING))
307 by Daniel Schierbeck
Made load notification work again.
81
    }
82
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
83
    def __init__(self, branch, start, maxnum, compact=True):
322 by Jelmer Vernooij
Add docstrings.
84
        """Create a new TreeView.
85
86
        :param branch: Branch object for branch to show.
87
        :param start: Revision id of top revision.
88
        :param maxnum: Maximum number of revisions to display, 
89
                       None for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
90
        :param broken_line_length: After how much lines to break 
91
                                   branches.
322 by Jelmer Vernooij
Add docstrings.
92
        """
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
93
        gtk.VBox.__init__(self, spacing=0)
94
95
        self.pack_start(self.construct_loading_msg(), expand=False, fill=True)
96
        self.connect('revisions-loaded', 
97
                lambda x: self.loading_msg_box.hide())
98
99
        self.scrolled_window = gtk.ScrolledWindow()
100
        self.scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
101
        self.scrolled_window.set_shadow_type(gtk.SHADOW_IN)
102
        self.scrolled_window.show()
103
        self.pack_start(self.scrolled_window, expand=True, fill=True)
104
105
        self.scrolled_window.add(self.construct_treeview())
106
        
303 by Daniel Schierbeck
Made basic signaling work.
107
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
108
        self.iter = None
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
109
        self.branch = branch
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
110
        self.revision = None
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
111
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
112
        self.start = start
113
        self.maxnum = maxnum
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
114
        self.compact = compact
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
115
116
        gobject.idle_add(self.populate)
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
117
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.
118
        self.connect("destroy", lambda x: self.branch.unlock())
119
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
120
    def do_get_property(self, property):
121
        if property.name == 'revno-column-visible':
352 by Daniel Schierbeck
Added branch property to treeview.
122
            return self.revno_column.get_visible()
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
123
        elif property.name == 'date-column-visible':
124
            return self.date_column.get_visible()
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
125
        elif property.name == 'compact':
126
            return self.compact
352 by Daniel Schierbeck
Added branch property to treeview.
127
        elif property.name == 'branch':
128
            return self.branch
356 by Daniel Schierbeck
Made revision a property on TreeView.
129
        elif property.name == 'revision':
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
130
            return self.model.get_value(self.iter, treemodel.REVISION)
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
131
        elif property.name == 'revision-number':
132
            return self.model.get_value(self.iter, treemodel.REVNO)
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
133
        elif property.name == 'children':
134
            return self.model.get_value(self.iter, treemodel.CHILDREN)
135
        elif property.name == 'parents':
136
            return self.model.get_value(self.iter, treemodel.PARENTS)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
137
        else:
138
            raise AttributeError, 'unknown property %s' % property.name
139
140
    def do_set_property(self, property, value):
141
        if property.name == 'revno-column-visible':
142
            self.revno_column.set_visible(value)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
143
        elif property.name == 'date-column-visible':
144
            self.date_column.set_visible(value)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
145
        elif property.name == 'compact':
146
            self.compact = value
352 by Daniel Schierbeck
Added branch property to treeview.
147
        elif property.name == 'branch':
148
            self.branch = value
356 by Daniel Schierbeck
Made revision a property on TreeView.
149
        elif property.name == 'revision':
150
            self.set_revision_id(value.revision_id)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
151
        else:
152
            raise AttributeError, 'unknown property %s' % property.name
153
303 by Daniel Schierbeck
Made basic signaling work.
154
    def get_revision(self):
322 by Jelmer Vernooij
Add docstrings.
155
        """Return revision id of currently selected revision, or None."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
156
        return self.get_property('revision')
157
158
    def set_revision(self, revision):
159
        self.set_property('revision', revision)
303 by Daniel Schierbeck
Made basic signaling work.
160
356 by Daniel Schierbeck
Made revision a property on TreeView.
161
    def set_revision_id(self, revid):
322 by Jelmer Vernooij
Add docstrings.
162
        """Change the currently selected revision.
163
164
        :param revid: Revision id of revision to display.
165
        """
305 by Daniel Schierbeck
Moved revision selection to the new view.
166
        self.treeview.set_cursor(self.index[revid])
167
        self.treeview.grab_focus()
168
303 by Daniel Schierbeck
Made basic signaling work.
169
    def get_children(self):
322 by Jelmer Vernooij
Add docstrings.
170
        """Return the children of the currently selected revision.
171
172
        :return: list of revision ids.
173
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
174
        return self.get_property('children')
303 by Daniel Schierbeck
Made basic signaling work.
175
176
    def get_parents(self):
322 by Jelmer Vernooij
Add docstrings.
177
        """Return the parents of the currently selected revision.
178
179
        :return: list of revision ids.
180
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
181
        return self.get_property('parents')
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
182
183
    def add_tag(self, tag, revid=None):
184
        if revid is None: revid = self.revision.revision_id
185
186
        try:
187
            self.branch.unlock()
188
189
            try:
190
                self.branch.lock_write()
191
                self.model.add_tag(tag, revid)
192
            finally:
193
                self.branch.unlock()
194
195
        finally:
196
            self.branch.lock_read()
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
197
198
        self.emit('tag-added', tag, revid)
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
199
        
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
200
    def refresh(self):
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
201
        self.loading_msg_box.show()
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
202
        gobject.idle_add(self.populate, self.get_revision())
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
203
404 by Daniel Schierbeck
Made the refresh use proper locking.
204
    def update(self):
205
        try:
206
            self.branch.unlock()
207
            try:
208
                self.branch.lock_write()
209
                self.branch.update()
210
            finally:
211
                self.branch.unlock()
212
        finally:
213
            self.branch.lock_read()
214
304 by Daniel Schierbeck
Made forward/back buttons work again.
215
    def back(self):
322 by Jelmer Vernooij
Add docstrings.
216
        """Signal handler for the Back button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
217
        parents = self.get_parents()
304 by Daniel Schierbeck
Made forward/back buttons work again.
218
        if not len(parents):
219
            return
220
221
        for parent_id in parents:
222
            parent_index = self.index[parent_id]
223
            parent = self.model[parent_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
224
            if same_branch(self.get_revision(), parent):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
225
                self.set_revision(parent)
304 by Daniel Schierbeck
Made forward/back buttons work again.
226
                break
227
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
228
            self.set_revision_id(parents[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
229
230
    def forward(self):
322 by Jelmer Vernooij
Add docstrings.
231
        """Signal handler for the Forward button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
232
        children = self.get_children()
304 by Daniel Schierbeck
Made forward/back buttons work again.
233
        if not len(children):
234
            return
235
236
        for child_id in children:
237
            child_index = self.index[child_id]
238
            child = self.model[child_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
239
            if same_branch(child, self.get_revision()):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
240
                self.set_revision(child)
304 by Daniel Schierbeck
Made forward/back buttons work again.
241
                break
242
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
243
            self.set_revision_id(children[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
244
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
245
    def populate(self, revision=None):
322 by Jelmer Vernooij
Add docstrings.
246
        """Fill the treeview with contents.
247
248
        :param start: Revision id of revision to start with.
249
        :param maxnum: Maximum number of revisions to display, or None 
250
                       for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
251
        :param broken_line_length: After how much lines branches \
252
                       should be broken.
322 by Jelmer Vernooij
Add docstrings.
253
        """
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
254
255
        if self.compact:
256
            broken_line_length = 32
257
        else:
258
            broken_line_length = None
259
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.
260
        self.branch.lock_read()
261
        (linegraphdata, index, columns_len) = linegraph(self.branch.repository,
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
262
                                                        self.start,
263
                                                        self.maxnum, 
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
264
                                                        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.
265
423.5.1 by Ali Sabil
Added tags visualization in the graph
266
        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.
267
        self.graph_cell.columns_len = columns_len
268
        width = self.graph_cell.get_size(self.treeview)[2]
403 by Daniel Schierbeck
Set a maximum width on the graph column.
269
        if width > 500:
270
            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.
271
        self.graph_column.set_fixed_width(width)
272
        self.graph_column.set_max_width(width)
273
        self.index = index
274
        self.treeview.set_model(self.model)
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
275
276
        if revision is None:
277
            self.treeview.set_cursor(0)
278
        else:
279
            self.set_revision(revision)
280
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.
281
        self.emit('revisions-loaded')
304 by Daniel Schierbeck
Made forward/back buttons work again.
282
283
        return False
284
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
285
    def show_diff(self, revid=None, parentid=None):
306 by Daniel Schierbeck
Made clicking a row work again.
286
        """Open a new window to show a diff between the given revisions."""
287
        from bzrlib.plugins.gtk.diff import DiffWindow
288
        window = DiffWindow(parent=self)
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
289
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
290
        parents = self.get_parents()
291
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
292
        if revid is None:
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
293
            revid = self.get_revision().revision_id
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
294
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
295
            if parentid is None and len(parents) > 0:
296
                parentid = parents[0]
330.4.3 by Daniel Schierbeck
Switched to using NULL_REVISION instead of None.
297
298
        if parentid is None:
299
            parentid = NULL_REVISION
300
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
301
        rev_tree    = self.branch.repository.revision_tree(revid)
302
        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.
303
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
304
        description = revid + " - " + self.branch.nick
306 by Daniel Schierbeck
Made clicking a row work again.
305
        window.set_diff(description, rev_tree, parent_tree)
306
        window.show()
307
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
308
    def construct_treeview(self):
309
        self.treeview = gtk.TreeView()
310
311
        self.treeview.set_rules_hint(True)
330.1.2 by Daniel Schierbeck
Replaced literal column index with equivalent symbol.
312
        self.treeview.set_search_column(treemodel.REVNO)
330.5.2 by Szilveszter Farkas (Phanatic)
Fixed set_tooltip_column() related issue.
313
        
330.5.5 by Szilveszter Farkas (Phanatic)
Use better fix by John.
314
        # Fix old PyGTK bug - by JAM
315
        set_tooltip = getattr(self.treeview, 'set_tooltip_column', None)
316
        if set_tooltip is not None:
423.4.3 by Daniel Schierbeck
Made the MESSAGE column be the tooltip column.
317
            set_tooltip(treemodel.MESSAGE)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
318
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
319
        self.treeview.connect("cursor-changed",
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
320
                self._on_selection_changed)
321
322
        self.treeview.connect("row-activated", 
323
                self._on_revision_activated)
324
325
        self.treeview.connect("button-release-event", 
326
                self._on_revision_selected)
327
328
        self.treeview.set_property('fixed-height-mode', True)
329
330
        self.treeview.show()
331
332
        cell = gtk.CellRendererText()
333
        cell.set_property("width-chars", 15)
334
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
335
        self.revno_column = gtk.TreeViewColumn("Revision No")
336
        self.revno_column.set_resizable(True)
337
        self.revno_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
338
        self.revno_column.set_fixed_width(cell.get_size(self.treeview)[2])
339
        self.revno_column.pack_start(cell, expand=True)
340
        self.revno_column.add_attribute(cell, "text", treemodel.REVNO)
341
        self.treeview.append_column(self.revno_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
342
343
        self.graph_cell = CellRendererGraph()
344
        self.graph_column = gtk.TreeViewColumn()
345
        self.graph_column.set_resizable(True)
346
        self.graph_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
347
        self.graph_column.pack_start(self.graph_cell, expand=False)
348
        self.graph_column.add_attribute(self.graph_cell, "node", treemodel.NODE)
423.5.1 by Ali Sabil
Added tags visualization in the graph
349
        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.
350
        self.graph_column.add_attribute(self.graph_cell, "in-lines", treemodel.LAST_LINES)
351
        self.graph_column.add_attribute(self.graph_cell, "out-lines", treemodel.LINES)
352
        self.treeview.append_column(self.graph_column)
353
354
        cell = gtk.CellRendererText()
355
        cell.set_property("width-chars", 65)
356
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
423.4.1 by Daniel Schierbeck
Renamed the MESSAGE column to SUMMARY.
357
        self.summary_column = gtk.TreeViewColumn("Summary")
358
        self.summary_column.set_resizable(True)
359
        self.summary_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
360
        self.summary_column.set_fixed_width(cell.get_size(self.treeview)[2])
361
        self.summary_column.pack_start(cell, expand=True)
362
        self.summary_column.add_attribute(cell, "markup", treemodel.SUMMARY)
363
        self.treeview.append_column(self.summary_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
364
365
        cell = gtk.CellRendererText()
366
        cell.set_property("width-chars", 15)
367
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
368
        self.committer_column = gtk.TreeViewColumn("Committer")
369
        self.committer_column.set_resizable(True)
370
        self.committer_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
371
        self.committer_column.set_fixed_width(cell.get_size(self.treeview)[2])
372
        self.committer_column.pack_start(cell, expand=True)
423.4.4 by Daniel Schierbeck
Renamed COMMITER column into the correct COMMITTER.
373
        self.committer_column.add_attribute(cell, "text", treemodel.COMMITTER)
345 by Daniel Schierbeck
Made treeview columns instance variables.
374
        self.treeview.append_column(self.committer_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
375
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
376
        cell = gtk.CellRendererText()
359 by Daniel Schierbeck
Simplified date format.
377
        cell.set_property("width-chars", 20)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
378
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
379
        self.date_column = gtk.TreeViewColumn("Date")
380
        self.date_column.set_visible(False)
381
        self.date_column.set_resizable(True)
382
        self.date_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
383
        self.date_column.set_fixed_width(cell.get_size(self.treeview)[2])
384
        self.date_column.pack_start(cell, expand=True)
385
        self.date_column.add_attribute(cell, "text", treemodel.TIMESTAMP)
386
        self.treeview.append_column(self.date_column)
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
387
        
388
        return self.treeview
389
    
390
    def construct_loading_msg(self):
391
        image_loading = gtk.image_new_from_stock(gtk.STOCK_REFRESH,
392
                                                 gtk.ICON_SIZE_BUTTON)
393
        image_loading.show()
394
        
395
        label_loading = gtk.Label(_("Please wait, loading ancestral graph..."))
396
        label_loading.set_alignment(0.0, 0.5)
397
        label_loading.show()
398
        
399
        self.loading_msg_box = gtk.HBox()
400
        self.loading_msg_box.set_spacing(5)
401
        self.loading_msg_box.set_border_width(5)        
402
        self.loading_msg_box.pack_start(image_loading, False, False)
403
        self.loading_msg_box.pack_start(label_loading, True, True)
404
        self.loading_msg_box.show()
405
        
406
        return self.loading_msg_box
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
407
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
408
    def _on_selection_changed(self, treeview):
303 by Daniel Schierbeck
Made basic signaling work.
409
        """callback for when the treeview changes."""
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
410
        (path, focus) = treeview.get_cursor()
411
        if path is not None:
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
412
            self.iter = self.model.get_iter(path)
310 by Daniel Schierbeck
Moved to using custom signal for handling revision selections.
413
            self.emit('revision-selected')
414
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
415
    def _on_revision_selected(self, widget, event):
416
        from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
417
        if event.button == 3:
418
            menu = RevisionPopupMenu(self.branch.repository, 
312 by Daniel Schierbeck
Made right-clicking work again.
419
                [self.get_revision().revision_id],
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
420
                self.branch)
423.7.8 by Daniel Schierbeck
Made the revision popup menu correctly add tags.
421
            menu.connect('tag-added', lambda w, t, r: self.add_tag(t, r))
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
422
            menu.popup(None, None, None, event.button, event.get_time())
423
424
    def _on_revision_activated(self, widget, path, col):
425
        # TODO: more than one parent
426
        """Callback for when a treeview row gets activated."""
427
        revision_id = self.model[path][treemodel.REVID]
428
        parents = self.model[path][treemodel.PARENTS]
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
429
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
430
        if len(parents) == 0:
330.4.1 by Daniel Schierbeck
Made it possible to view the diff of an orphant revision.
431
            parent_id = None
432
        else:
433
            parent_id = parents[0]
434
364 by Daniel Schierbeck
Simplified TreeView.show_diff() and made the Revision -> View Changes menu item work.
435
        self.show_diff(revision_id, parent_id)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
436
        self.treeview.grab_focus()