/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to branchview/treeview.py

  • Committer: Jelmer Vernooij
  • Date: 2008-06-29 16:20:15 UTC
  • mto: This revision was merged to the branch mainline in revision 519.
  • Revision ID: jelmer@samba.org-20080629162015-amhe7xj4cdmup4id
Rename GtkProgressBarStack to GtkWindowProgressBarStack

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
from bzrlib import ui
17
17
 
18
18
from bzrlib.plugins.gtk import _i18n
19
 
from bzrlib.plugins.gtk.ui import GtkProgressBar, ProgressPanel
20
19
from linegraph import linegraph, same_branch
21
20
from graphcell import CellRendererGraph
22
21
from treemodel import TreeModel
23
22
from bzrlib.revision import NULL_REVISION
24
 
from bzrlib.plugins.gtk import lock
25
 
 
26
23
 
27
24
class TreeView(gtk.VBox):
28
25
 
94
91
                              (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)),
95
92
        'tag-added': (gobject.SIGNAL_RUN_FIRST,
96
93
                              gobject.TYPE_NONE,
97
 
                              (gobject.TYPE_STRING, gobject.TYPE_STRING)),
98
 
        'refreshed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
99
 
                              ())
 
94
                              (gobject.TYPE_STRING, gobject.TYPE_STRING))
100
95
    }
101
96
 
102
97
    def __init__(self, branch, start, maxnum, compact=True):
111
106
        """
112
107
        gtk.VBox.__init__(self, spacing=0)
113
108
 
114
 
        self.progress_widget = ProgressPanel()
115
 
        self.pack_start(self.progress_widget, expand=False, fill=True)
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)
119
 
 
120
109
        self.scrolled_window = gtk.ScrolledWindow()
121
110
        self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,
122
111
                                        gtk.POLICY_AUTOMATIC)
126
115
 
127
116
        self.scrolled_window.add(self.construct_treeview())
128
117
 
129
 
        self.path = None
 
118
        self.iter = None
130
119
        self.branch = branch
131
120
        self.revision = None
132
 
        self.index = {}
133
121
 
134
122
        self.start = start
135
123
        self.maxnum = maxnum
137
125
 
138
126
        gobject.idle_add(self.populate)
139
127
 
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)
 
128
        self.connect("destroy", lambda x: self.branch.unlock())
147
129
 
148
130
    def do_get_property(self, property):
149
131
        if property.name == 'revno-column-visible':
159
141
        elif property.name == 'branch':
160
142
            return self.branch
161
143
        elif property.name == 'revision':
162
 
            return self.model.get_value(self.model.get_iter(self.path),
163
 
                                        treemodel.REVISION)
 
144
            return self.model.get_value(self.iter, treemodel.REVISION)
164
145
        elif property.name == 'revision-number':
165
 
            return self.model.get_value(self.model.get_iter(self.path),
166
 
                                        treemodel.REVNO)
 
146
            return self.model.get_value(self.iter, treemodel.REVNO)
167
147
        elif property.name == 'children':
168
 
            return self.model.get_value(self.model.get_iter(self.path),
169
 
                                        treemodel.CHILDREN)
 
148
            return self.model.get_value(self.iter, treemodel.CHILDREN)
170
149
        elif property.name == 'parents':
171
 
            return self.model.get_value(self.model.get_iter(self.path),
172
 
                                        treemodel.PARENTS)
 
150
            return self.model.get_value(self.iter, treemodel.PARENTS)
173
151
        else:
174
152
            raise AttributeError, 'unknown property %s' % property.name
175
153
 
195
173
        """Return revision id of currently selected revision, or None."""
196
174
        return self.get_property('revision')
197
175
 
198
 
    def has_revision_id(self, revision_id):
199
 
        return (revision_id in self.index)
200
 
 
201
176
    def set_revision(self, revision):
202
177
        self.set_property('revision', revision)
203
178
 
226
201
    def add_tag(self, tag, revid=None):
227
202
        if revid is None: revid = self.revision.revision_id
228
203
 
229
 
        if lock.release(self.branch):
 
204
        try:
 
205
            self.branch.unlock()
 
206
 
230
207
            try:
231
 
                lock.acquire(self.branch, lock.WRITE)
 
208
                self.branch.lock_write()
232
209
                self.model.add_tag(tag, revid)
233
210
            finally:
234
 
                lock.release(self.branch)
235
 
 
236
 
            lock.acquire(self.branch, lock.READ)
237
 
 
238
 
            self.emit('tag-added', tag, revid)
 
211
                self.branch.unlock()
 
212
 
 
213
        finally:
 
214
            self.branch.lock_read()
 
215
 
 
216
        self.emit('tag-added', tag, revid)
239
217
        
240
218
    def refresh(self):
241
219
        gobject.idle_add(self.populate, self.get_revision())
291
269
                       should be broken.
292
270
        """
293
271
 
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)
297
 
        self.progress_bar = ui.ui_factory.nested_progress_bar()
298
 
        self.progress_bar.update("Loading ancestry graph", 0, 5)
 
272
        loading_progress = ui.ui_factory.nested_progress_bar()
 
273
        loading_progress.update(msg="Loading ancestry graph", total=5)
299
274
 
300
275
        try:
301
276
            if self.compact:
312
287
                                                            broken_line_length,
313
288
                                                            show_graph,
314
289
                                                            self.mainline_only,
315
 
                                                            self.progress_bar)
 
290
                                                            loading_progress)
316
291
 
317
292
            self.model = TreeModel(self.branch, linegraphdata)
318
293
            self.graph_cell.columns_len = columns_len
329
304
            else:
330
305
                self.set_revision(revision)
331
306
 
332
 
            self.emit('refreshed')
 
307
            self.emit('revisions-loaded')
 
308
 
333
309
            return False
334
310
        finally:
335
 
            self.progress_bar.finished()
 
311
            loading_progress.finished()
336
312
 
337
313
    def construct_treeview(self):
338
314
        self.treeview = gtk.TreeView()
345
321
        if set_tooltip is not None:
346
322
            set_tooltip(treemodel.MESSAGE)
347
323
 
348
 
        self._prev_cursor_path = None
349
324
        self.treeview.connect("cursor-changed",
350
325
                self._on_selection_changed)
351
326
 
417
392
        self.treeview.append_column(self.date_column)
418
393
        
419
394
        return self.treeview
420
 
    
 
395
 
421
396
    def _on_selection_changed(self, treeview):
422
397
        """callback for when the treeview changes."""
423
398
        (path, focus) = treeview.get_cursor()
424
 
        if (path is not None) and (path != self._prev_cursor_path):
425
 
            self._prev_cursor_path = path # avoid emitting twice per click
426
 
            self.path = path
 
399
        if path is not None:
 
400
            self.iter = self.model.get_iter(path)
427
401
            self.emit('revision-selected')
428
402
 
429
403
    def _on_revision_selected(self, widget, event):
430
 
        from bzrlib.plugins.gtk.revisionmenu import RevisionMenu
 
404
        from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
431
405
        if event.button == 3:
432
 
            menu = RevisionMenu(self.branch.repository, 
 
406
            menu = RevisionPopupMenu(self.branch.repository, 
433
407
                [self.get_revision().revision_id],
434
408
                self.branch)
435
409
            menu.connect('tag-added', lambda w, t, r: self.add_tag(t, r))