/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
486.1.1 by matkor at laptop-hp
Fix for presenting log in olive-gtk.
6
__copyright__ = "Copyright © 2005 Canonical Ltd."
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
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
475.2.1 by Chad MILLER
Make "vizualize" use the GUI progress bar defined in the parent 'ui' module.
16
from bzrlib import ui
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
17
475.1.2 by Vincent Ladeuil
Fix bug #187283 fix replacing _() by _i18n().
18
from bzrlib.plugins.gtk import _i18n
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
19
from bzrlib.plugins.gtk.ui import GtkProgressBar, ProgressPanel
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
20
from linegraph import linegraph, same_branch
21
from graphcell import CellRendererGraph
22
from treemodel import TreeModel
330.4.3 by Daniel Schierbeck
Switched to using NULL_REVISION instead of None.
23
from bzrlib.revision import NULL_REVISION
452.5.2 by Daniel Schierbeck
Added generalized locking functionality in lock.py.
24
from bzrlib.plugins.gtk import lock
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
25
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
26
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
27
class TreeView(gtk.VBox):
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
28
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
29
    __gproperties__ = {
352 by Daniel Schierbeck
Added branch property to treeview.
30
        'branch': (gobject.TYPE_PYOBJECT,
31
                   'Branch',
32
                   'The Bazaar branch being visualized',
33
                   gobject.PARAM_CONSTRUCT_ONLY | gobject.PARAM_WRITABLE),
34
356 by Daniel Schierbeck
Made revision a property on TreeView.
35
        'revision': (gobject.TYPE_PYOBJECT,
36
                     'Revision',
37
                     'The currently selected revision',
38
                     gobject.PARAM_READWRITE),
39
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
40
        'revision-number': (gobject.TYPE_STRING,
41
                            'Revision number',
42
                            'The number of the selected revision',
43
                            '',
44
                            gobject.PARAM_READABLE),
45
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
46
        'children': (gobject.TYPE_PYOBJECT,
47
                     'Child revisions',
48
                     'Children of the currently selected revision',
49
                     gobject.PARAM_READABLE),
50
51
        'parents': (gobject.TYPE_PYOBJECT,
52
                    'Parent revisions',
53
                    'Parents to the currently selected revision',
54
                    gobject.PARAM_READABLE),
55
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
56
        'revno-column-visible': (gobject.TYPE_BOOLEAN,
423.1.18 by Gary van der Merwe
Add options to viz treeview to not show the line graph, and to only show the main line.
57
                                 'Revision number column',
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
58
                                 'Show revision number column',
59
                                 True,
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
60
                                 gobject.PARAM_READWRITE),
61
423.1.18 by Gary van der Merwe
Add options to viz treeview to not show the line graph, and to only show the main line.
62
        'graph-column-visible': (gobject.TYPE_BOOLEAN,
63
                                 'Graph column',
64
                                 'Show graph column',
65
                                 True,
66
                                 gobject.PARAM_READWRITE),
67
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
68
        'date-column-visible': (gobject.TYPE_BOOLEAN,
360 by Daniel Schierbeck
Fixed wrong text in date property.
69
                                 'Date',
70
                                 'Show date column',
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
71
                                 False,
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
72
                                 gobject.PARAM_READWRITE),
73
74
        'compact': (gobject.TYPE_BOOLEAN,
75
                    'Compact view',
76
                    'Break ancestry lines to save space',
77
                    True,
423.1.18 by Gary van der Merwe
Add options to viz treeview to not show the line graph, and to only show the main line.
78
                    gobject.PARAM_CONSTRUCT | gobject.PARAM_READWRITE),
79
80
        'mainline-only': (gobject.TYPE_BOOLEAN,
81
                    'Mainline only',
82
                    'Only show the mainline history.',
83
                    False,
84
                    gobject.PARAM_CONSTRUCT | gobject.PARAM_READWRITE),
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
85
346 by Daniel Schierbeck
Added revno-column-visible property to treeview.
86
    }
87
307 by Daniel Schierbeck
Made load notification work again.
88
    __gsignals__ = {
345 by Daniel Schierbeck
Made treeview columns instance variables.
89
        'revision-selected': (gobject.SIGNAL_RUN_FIRST,
90
                              gobject.TYPE_NONE,
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
91
                              ()),
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
92
        'revision-activated': (gobject.SIGNAL_RUN_FIRST,
93
                              gobject.TYPE_NONE,
94
                              (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)),
423.7.4 by Daniel Schierbeck
Made revisionview and branchview update when a tag is added.
95
        'tag-added': (gobject.SIGNAL_RUN_FIRST,
96
                              gobject.TYPE_NONE,
576.5.1 by Jelmer Vernooij
Disable the ability to click on tags that are not available in the current view.
97
                              (gobject.TYPE_STRING, gobject.TYPE_STRING)),
98
        'refreshed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
99
                              ())
307 by Daniel Schierbeck
Made load notification work again.
100
    }
101
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
102
    def __init__(self, branch, start, maxnum, compact=True):
322 by Jelmer Vernooij
Add docstrings.
103
        """Create a new TreeView.
104
105
        :param branch: Branch object for branch to show.
106
        :param start: Revision id of top revision.
107
        :param maxnum: Maximum number of revisions to display, 
108
                       None for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
109
        :param broken_line_length: After how much lines to break 
110
                                   branches.
322 by Jelmer Vernooij
Add docstrings.
111
        """
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
112
        gtk.VBox.__init__(self, spacing=0)
113
645.1.4 by Vincent Ladeuil
Fix refresh warnings and progress widget usage.
114
        self.progress_widget = ProgressPanel()
115
        self.pack_start(self.progress_widget, expand=False, fill=True)
645.1.5 by Vincent Ladeuil
Integrater Jelmer patch and implement a more robust solution.
116
        if getattr(ui.ui_factory, "set_progress_bar_widget", None) is not None:
117
            # We'are using our own ui, let's tell it to use our widget.
118
            ui.ui_factory.set_progress_bar_widget(self.progress_widget)
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
119
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
120
        self.scrolled_window = gtk.ScrolledWindow()
423.1.18 by Gary van der Merwe
Add options to viz treeview to not show the line graph, and to only show the main line.
121
        self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,
122
                                        gtk.POLICY_AUTOMATIC)
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
123
        self.scrolled_window.set_shadow_type(gtk.SHADOW_IN)
124
        self.scrolled_window.show()
125
        self.pack_start(self.scrolled_window, expand=True, fill=True)
126
127
        self.scrolled_window.add(self.construct_treeview())
303 by Daniel Schierbeck
Made basic signaling work.
128
645.1.4 by Vincent Ladeuil
Fix refresh warnings and progress widget usage.
129
        self.path = None
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
130
        self.branch = branch
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
131
        self.revision = None
576.5.1 by Jelmer Vernooij
Disable the ability to click on tags that are not available in the current view.
132
        self.index = {}
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
133
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
134
        self.start = start
135
        self.maxnum = maxnum
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
136
        self.compact = compact
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
137
138
        gobject.idle_add(self.populate)
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
139
645.1.5 by Vincent Ladeuil
Integrater Jelmer patch and implement a more robust solution.
140
        self.connect("destroy", self._on_destroy)
141
142
    def _on_destroy(self, *ignored):
143
        self.branch.unlock()
144
        if getattr(ui.ui_factory, "set_progress_bar_widget", None) is not None:
145
            # We'are using our own ui, let's tell it to stop using our widget.
146
            ui.ui_factory.set_progress_bar_widget(None)
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.
147
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
148
    def do_get_property(self, property):
149
        if property.name == 'revno-column-visible':
352 by Daniel Schierbeck
Added branch property to treeview.
150
            return self.revno_column.get_visible()
423.1.18 by Gary van der Merwe
Add options to viz treeview to not show the line graph, and to only show the main line.
151
        elif property.name == 'graph-column-visible':
152
            return self.graph_column.get_visible()
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
153
        elif property.name == 'date-column-visible':
154
            return self.date_column.get_visible()
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
155
        elif property.name == 'compact':
156
            return self.compact
423.1.18 by Gary van der Merwe
Add options to viz treeview to not show the line graph, and to only show the main line.
157
        elif property.name == 'mainline-only':
158
            return self.mainline_only
352 by Daniel Schierbeck
Added branch property to treeview.
159
        elif property.name == 'branch':
160
            return self.branch
356 by Daniel Schierbeck
Made revision a property on TreeView.
161
        elif property.name == 'revision':
645.1.4 by Vincent Ladeuil
Fix refresh warnings and progress widget usage.
162
            return self.model.get_value(self.model.get_iter(self.path),
163
                                        treemodel.REVISION)
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
164
        elif property.name == 'revision-number':
645.1.4 by Vincent Ladeuil
Fix refresh warnings and progress widget usage.
165
            return self.model.get_value(self.model.get_iter(self.path),
166
                                        treemodel.REVNO)
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
167
        elif property.name == 'children':
645.1.4 by Vincent Ladeuil
Fix refresh warnings and progress widget usage.
168
            return self.model.get_value(self.model.get_iter(self.path),
169
                                        treemodel.CHILDREN)
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
170
        elif property.name == 'parents':
645.1.4 by Vincent Ladeuil
Fix refresh warnings and progress widget usage.
171
            return self.model.get_value(self.model.get_iter(self.path),
172
                                        treemodel.PARENTS)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
173
        else:
174
            raise AttributeError, 'unknown property %s' % property.name
175
176
    def do_set_property(self, property, value):
177
        if property.name == 'revno-column-visible':
178
            self.revno_column.set_visible(value)
423.1.18 by Gary van der Merwe
Add options to viz treeview to not show the line graph, and to only show the main line.
179
        elif property.name == 'graph-column-visible':
180
            self.graph_column.set_visible(value)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
181
        elif property.name == 'date-column-visible':
182
            self.date_column.set_visible(value)
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
183
        elif property.name == 'compact':
184
            self.compact = value
423.1.18 by Gary van der Merwe
Add options to viz treeview to not show the line graph, and to only show the main line.
185
        elif property.name == 'mainline-only':
186
            self.mainline_only = value
352 by Daniel Schierbeck
Added branch property to treeview.
187
        elif property.name == 'branch':
188
            self.branch = value
356 by Daniel Schierbeck
Made revision a property on TreeView.
189
        elif property.name == 'revision':
190
            self.set_revision_id(value.revision_id)
347 by Daniel Schierbeck
Added property getter and setter method to the treeview.
191
        else:
192
            raise AttributeError, 'unknown property %s' % property.name
193
303 by Daniel Schierbeck
Made basic signaling work.
194
    def get_revision(self):
322 by Jelmer Vernooij
Add docstrings.
195
        """Return revision id of currently selected revision, or None."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
196
        return self.get_property('revision')
197
576.5.1 by Jelmer Vernooij
Disable the ability to click on tags that are not available in the current view.
198
    def has_revision_id(self, revision_id):
199
        return (revision_id in self.index)
200
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
201
    def set_revision(self, revision):
202
        self.set_property('revision', revision)
303 by Daniel Schierbeck
Made basic signaling work.
203
356 by Daniel Schierbeck
Made revision a property on TreeView.
204
    def set_revision_id(self, revid):
322 by Jelmer Vernooij
Add docstrings.
205
        """Change the currently selected revision.
206
207
        :param revid: Revision id of revision to display.
208
        """
305 by Daniel Schierbeck
Moved revision selection to the new view.
209
        self.treeview.set_cursor(self.index[revid])
210
        self.treeview.grab_focus()
211
303 by Daniel Schierbeck
Made basic signaling work.
212
    def get_children(self):
322 by Jelmer Vernooij
Add docstrings.
213
        """Return the children of the currently selected revision.
214
215
        :return: list of revision ids.
216
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
217
        return self.get_property('children')
303 by Daniel Schierbeck
Made basic signaling work.
218
219
    def get_parents(self):
322 by Jelmer Vernooij
Add docstrings.
220
        """Return the parents of the currently selected revision.
221
222
        :return: list of revision ids.
223
        """
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
224
        return self.get_property('parents')
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
225
226
    def add_tag(self, tag, revid=None):
227
        if revid is None: revid = self.revision.revision_id
228
452.5.2 by Daniel Schierbeck
Added generalized locking functionality in lock.py.
229
        if lock.release(self.branch):
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
230
            try:
452.5.2 by Daniel Schierbeck
Added generalized locking functionality in lock.py.
231
                lock.acquire(self.branch, lock.WRITE)
423.7.3 by Daniel Schierbeck
Moved tag writing logic inside the branchview treemodel.
232
                self.model.add_tag(tag, revid)
233
            finally:
452.5.2 by Daniel Schierbeck
Added generalized locking functionality in lock.py.
234
                lock.release(self.branch)
235
236
            lock.acquire(self.branch, lock.READ)
237
238
            self.emit('tag-added', tag, revid)
316 by Daniel Schierbeck
Removed viz.TreeView.set_branch()
239
        
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
240
    def refresh(self):
241
        gobject.idle_add(self.populate, self.get_revision())
401.1.1 by Daniel Schierbeck
Added update() method to TreeView.
242
404 by Daniel Schierbeck
Made the refresh use proper locking.
243
    def update(self):
244
        try:
245
            self.branch.unlock()
246
            try:
247
                self.branch.lock_write()
248
                self.branch.update()
249
            finally:
250
                self.branch.unlock()
251
        finally:
252
            self.branch.lock_read()
253
304 by Daniel Schierbeck
Made forward/back buttons work again.
254
    def back(self):
322 by Jelmer Vernooij
Add docstrings.
255
        """Signal handler for the Back button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
256
        parents = self.get_parents()
304 by Daniel Schierbeck
Made forward/back buttons work again.
257
        if not len(parents):
258
            return
259
260
        for parent_id in parents:
261
            parent_index = self.index[parent_id]
262
            parent = self.model[parent_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
263
            if same_branch(self.get_revision(), parent):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
264
                self.set_revision(parent)
304 by Daniel Schierbeck
Made forward/back buttons work again.
265
                break
266
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
267
            self.set_revision_id(parents[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
268
269
    def forward(self):
322 by Jelmer Vernooij
Add docstrings.
270
        """Signal handler for the Forward button."""
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
271
        children = self.get_children()
304 by Daniel Schierbeck
Made forward/back buttons work again.
272
        if not len(children):
273
            return
274
275
        for child_id in children:
276
            child_index = self.index[child_id]
277
            child = self.model[child_index][treemodel.REVISION]
395.1.1 by Daniel Schierbeck
Cleaned up code in the TreeView, removing instance variables.
278
            if same_branch(child, self.get_revision()):
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
279
                self.set_revision(child)
304 by Daniel Schierbeck
Made forward/back buttons work again.
280
                break
281
        else:
395.1.2 by Daniel Schierbeck
Added revision-number property to the TreeView.
282
            self.set_revision_id(children[0])
304 by Daniel Schierbeck
Made forward/back buttons work again.
283
401.1.2 by Daniel Schierbeck
Allowed the treeview to be refreshed.
284
    def populate(self, revision=None):
322 by Jelmer Vernooij
Add docstrings.
285
        """Fill the treeview with contents.
286
287
        :param start: Revision id of revision to start with.
288
        :param maxnum: Maximum number of revisions to display, or None 
289
                       for no limit.
329 by Jelmer Vernooij
Make broken_line_length setting from higher up.
290
        :param broken_line_length: After how much lines branches \
291
                       should be broken.
322 by Jelmer Vernooij
Add docstrings.
292
        """
401.1.3 by Daniel Schierbeck
Made the compact view toggling cleaner.
293
645.1.4 by Vincent Ladeuil
Fix refresh warnings and progress widget usage.
294
        if getattr(ui.ui_factory, "set_progress_bar_widget", None) is not None:
295
            # We'are using our own ui, let's tell it to use our widget.
296
            ui.ui_factory.set_progress_bar_widget(self.progress_widget)
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
297
        self.progress_bar = ui.ui_factory.nested_progress_bar()
576.4.1 by Jelmer Vernooij
Avoid using explicit names for progress bar function arguments since they differ.
298
        self.progress_bar.update("Loading ancestry graph", 0, 5)
475.2.1 by Chad MILLER
Make "vizualize" use the GUI progress bar defined in the parent 'ui' module.
299
300
        try:
301
            if self.compact:
302
                broken_line_length = 32
303
            else:
304
                broken_line_length = None
305
            
306
            show_graph = self.graph_column.get_visible()
307
308
            self.branch.lock_read()
511.5.3 by Jelmer Vernooij
Merge Chad's progress bar in viz patch.
309
            (linegraphdata, index, columns_len) = linegraph(self.branch.repository.get_graph(),
475.2.1 by Chad MILLER
Make "vizualize" use the GUI progress bar defined in the parent 'ui' module.
310
                                                            self.start,
311
                                                            self.maxnum, 
312
                                                            broken_line_length,
313
                                                            show_graph,
475.2.2 by Chad MILLER
Big diff, few changes. :(
314
                                                            self.mainline_only,
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
315
                                                            self.progress_bar)
475.2.1 by Chad MILLER
Make "vizualize" use the GUI progress bar defined in the parent 'ui' module.
316
317
            self.model = TreeModel(self.branch, linegraphdata)
318
            self.graph_cell.columns_len = columns_len
319
            width = self.graph_cell.get_size(self.treeview)[2]
320
            if width > 500:
321
                width = 500
322
            self.graph_column.set_fixed_width(width)
323
            self.graph_column.set_max_width(width)
324
            self.index = index
325
            self.treeview.set_model(self.model)
326
327
            if not revision or revision == NULL_REVISION:
328
                self.treeview.set_cursor(0)
329
            else:
330
                self.set_revision(revision)
331
576.5.1 by Jelmer Vernooij
Disable the ability to click on tags that are not available in the current view.
332
            self.emit('refreshed')
475.2.1 by Chad MILLER
Make "vizualize" use the GUI progress bar defined in the parent 'ui' module.
333
            return False
334
        finally:
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
335
            self.progress_bar.finished()
304 by Daniel Schierbeck
Made forward/back buttons work again.
336
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
337
    def construct_treeview(self):
338
        self.treeview = gtk.TreeView()
339
340
        self.treeview.set_rules_hint(True)
330.1.2 by Daniel Schierbeck
Replaced literal column index with equivalent symbol.
341
        self.treeview.set_search_column(treemodel.REVNO)
330.5.2 by Szilveszter Farkas (Phanatic)
Fixed set_tooltip_column() related issue.
342
        
330.5.5 by Szilveszter Farkas (Phanatic)
Use better fix by John.
343
        # Fix old PyGTK bug - by JAM
344
        set_tooltip = getattr(self.treeview, 'set_tooltip_column', None)
345
        if set_tooltip is not None:
423.4.3 by Daniel Schierbeck
Made the MESSAGE column be the tooltip column.
346
            set_tooltip(treemodel.MESSAGE)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
347
531.7.4 by Scott Scriven
The 'vis' treeview was updating twice per cursor motion. Fixed.
348
        self._prev_cursor_path = None
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
349
        self.treeview.connect("cursor-changed",
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
350
                self._on_selection_changed)
351
352
        self.treeview.connect("row-activated", 
353
                self._on_revision_activated)
354
355
        self.treeview.connect("button-release-event", 
356
                self._on_revision_selected)
357
358
        self.treeview.set_property('fixed-height-mode', True)
359
360
        self.treeview.show()
361
362
        cell = gtk.CellRendererText()
363
        cell.set_property("width-chars", 15)
364
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
365
        self.revno_column = gtk.TreeViewColumn("Revision No")
496.2.1 by Daniel Schierbeck
Made the columns have more suitable sizes.
366
        self.revno_column.set_resizable(False)
345 by Daniel Schierbeck
Made treeview columns instance variables.
367
        self.revno_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
368
        self.revno_column.set_fixed_width(cell.get_size(self.treeview)[2])
369
        self.revno_column.pack_start(cell, expand=True)
370
        self.revno_column.add_attribute(cell, "text", treemodel.REVNO)
371
        self.treeview.append_column(self.revno_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
372
373
        self.graph_cell = CellRendererGraph()
374
        self.graph_column = gtk.TreeViewColumn()
496.2.1 by Daniel Schierbeck
Made the columns have more suitable sizes.
375
        self.graph_column.set_resizable(False)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
376
        self.graph_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
496.2.1 by Daniel Schierbeck
Made the columns have more suitable sizes.
377
        self.graph_column.pack_start(self.graph_cell, expand=True)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
378
        self.graph_column.add_attribute(self.graph_cell, "node", treemodel.NODE)
423.5.1 by Ali Sabil
Added tags visualization in the graph
379
        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.
380
        self.graph_column.add_attribute(self.graph_cell, "in-lines", treemodel.LAST_LINES)
381
        self.graph_column.add_attribute(self.graph_cell, "out-lines", treemodel.LINES)
382
        self.treeview.append_column(self.graph_column)
383
384
        cell = gtk.CellRendererText()
385
        cell.set_property("width-chars", 65)
386
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
423.4.1 by Daniel Schierbeck
Renamed the MESSAGE column to SUMMARY.
387
        self.summary_column = gtk.TreeViewColumn("Summary")
496.2.1 by Daniel Schierbeck
Made the columns have more suitable sizes.
388
        self.summary_column.set_resizable(False)
389
        self.summary_column.set_expand(True)
423.4.1 by Daniel Schierbeck
Renamed the MESSAGE column to SUMMARY.
390
        self.summary_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
391
        self.summary_column.set_fixed_width(cell.get_size(self.treeview)[2])
392
        self.summary_column.pack_start(cell, expand=True)
393
        self.summary_column.add_attribute(cell, "markup", treemodel.SUMMARY)
394
        self.treeview.append_column(self.summary_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
395
396
        cell = gtk.CellRendererText()
397
        cell.set_property("width-chars", 15)
398
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
345 by Daniel Schierbeck
Made treeview columns instance variables.
399
        self.committer_column = gtk.TreeViewColumn("Committer")
496.2.1 by Daniel Schierbeck
Made the columns have more suitable sizes.
400
        self.committer_column.set_resizable(False)
345 by Daniel Schierbeck
Made treeview columns instance variables.
401
        self.committer_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
496.2.1 by Daniel Schierbeck
Made the columns have more suitable sizes.
402
        self.committer_column.set_fixed_width(200)
345 by Daniel Schierbeck
Made treeview columns instance variables.
403
        self.committer_column.pack_start(cell, expand=True)
423.4.4 by Daniel Schierbeck
Renamed COMMITER column into the correct COMMITTER.
404
        self.committer_column.add_attribute(cell, "text", treemodel.COMMITTER)
345 by Daniel Schierbeck
Made treeview columns instance variables.
405
        self.treeview.append_column(self.committer_column)
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
406
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
407
        cell = gtk.CellRendererText()
359 by Daniel Schierbeck
Simplified date format.
408
        cell.set_property("width-chars", 20)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
409
        cell.set_property("ellipsize", pango.ELLIPSIZE_END)
410
        self.date_column = gtk.TreeViewColumn("Date")
411
        self.date_column.set_visible(False)
496.2.1 by Daniel Schierbeck
Made the columns have more suitable sizes.
412
        self.date_column.set_resizable(False)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
413
        self.date_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
496.2.1 by Daniel Schierbeck
Made the columns have more suitable sizes.
414
        self.date_column.set_fixed_width(130)
357 by Daniel Schierbeck
Added support for showing the date column in the viz.
415
        self.date_column.pack_start(cell, expand=True)
416
        self.date_column.add_attribute(cell, "text", treemodel.TIMESTAMP)
417
        self.treeview.append_column(self.date_column)
423.1.13 by Gary van der Merwe
Move viz loading msg from branchwin to treeview.
418
        
419
        return self.treeview
511.5.6 by Jelmer Vernooij
Simplify progress bar code, use embedded progress bar inside viz window.
420
    
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
421
    def _on_selection_changed(self, treeview):
303 by Daniel Schierbeck
Made basic signaling work.
422
        """callback for when the treeview changes."""
391 by Daniel Schierbeck
Moved away from the changed signal on the treeview.
423
        (path, focus) = treeview.get_cursor()
531.7.4 by Scott Scriven
The 'vis' treeview was updating twice per cursor motion. Fixed.
424
        if (path is not None) and (path != self._prev_cursor_path):
425
            self._prev_cursor_path = path # avoid emitting twice per click
645.1.4 by Vincent Ladeuil
Fix refresh warnings and progress widget usage.
426
            self.path = path
310 by Daniel Schierbeck
Moved to using custom signal for handling revision selections.
427
            self.emit('revision-selected')
428
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
429
    def _on_revision_selected(self, widget, event):
523.3.1 by Jelmer Vernooij
Rename RevisionPopupMenu -> RevisionMenu.
430
        from bzrlib.plugins.gtk.revisionmenu import RevisionMenu
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
431
        if event.button == 3:
523.3.1 by Jelmer Vernooij
Rename RevisionPopupMenu -> RevisionMenu.
432
            menu = RevisionMenu(self.branch.repository, 
312 by Daniel Schierbeck
Made right-clicking work again.
433
                [self.get_revision().revision_id],
301 by Daniel Schierbeck
Initial work on extracting the TreeView from the branch window.
434
                self.branch)
423.7.8 by Daniel Schierbeck
Made the revision popup menu correctly add tags.
435
            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.
436
            menu.popup(None, None, None, event.button, event.get_time())
437
438
    def _on_revision_activated(self, widget, path, col):
423.1.17 by Gary van der Merwe
Reuse the viz treeview in the revision browser.
439
        self.emit('revision-activated', path, col)