/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:
6
6
__copyright__ = "Copyright © 2005 Canonical Ltd."
7
7
__author__    = "Daniel Schierbeck <daniel.schierbeck@gmail.com>"
8
8
 
 
9
import sys
 
10
import string
9
11
import gtk
10
12
import gobject
11
13
import pango
 
14
import re
12
15
import treemodel
13
16
from bzrlib import ui
14
17
 
15
 
from bzrlib.plugins.gtk.ui import ProgressPanel
 
18
from bzrlib.plugins.gtk import _i18n
16
19
from linegraph import linegraph, same_branch
17
20
from graphcell import CellRendererGraph
18
21
from treemodel import TreeModel
19
22
from bzrlib.revision import NULL_REVISION
20
 
from bzrlib.plugins.gtk import lock
21
 
 
22
23
 
23
24
class TreeView(gtk.VBox):
24
25
 
90
91
                              (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)),
91
92
        'tag-added': (gobject.SIGNAL_RUN_FIRST,
92
93
                              gobject.TYPE_NONE,
93
 
                              (gobject.TYPE_STRING, gobject.TYPE_STRING)),
94
 
        'refreshed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
95
 
                              ())
 
94
                              (gobject.TYPE_STRING, gobject.TYPE_STRING))
96
95
    }
97
96
 
98
97
    def __init__(self, branch, start, maxnum, compact=True):
107
106
        """
108
107
        gtk.VBox.__init__(self, spacing=0)
109
108
 
110
 
        self.progress_widget = ProgressPanel()
111
 
        self.pack_start(self.progress_widget, expand=False, fill=True)
112
 
        if getattr(ui.ui_factory, "set_progress_bar_widget", None) is not None:
113
 
            # We'are using our own ui, let's tell it to use our widget.
114
 
            ui.ui_factory.set_progress_bar_widget(self.progress_widget)
115
 
 
116
109
        self.scrolled_window = gtk.ScrolledWindow()
117
110
        self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,
118
111
                                        gtk.POLICY_AUTOMATIC)
122
115
 
123
116
        self.scrolled_window.add(self.construct_treeview())
124
117
 
125
 
        self.path = None
 
118
        self.iter = None
126
119
        self.branch = branch
127
120
        self.revision = None
128
 
        self.index = {}
129
121
 
130
122
        self.start = start
131
123
        self.maxnum = maxnum
133
125
 
134
126
        gobject.idle_add(self.populate)
135
127
 
136
 
        self.connect("destroy", self._on_destroy)
137
 
 
138
 
    def _on_destroy(self, *ignored):
139
 
        self.branch.unlock()
140
 
        if getattr(ui.ui_factory, "set_progress_bar_widget", None) is not None:
141
 
            # We'are using our own ui, let's tell it to stop using our widget.
142
 
            ui.ui_factory.set_progress_bar_widget(None)
 
128
        self.connect("destroy", lambda x: self.branch.unlock())
143
129
 
144
130
    def do_get_property(self, property):
145
131
        if property.name == 'revno-column-visible':
155
141
        elif property.name == 'branch':
156
142
            return self.branch
157
143
        elif property.name == 'revision':
158
 
            return self.model.get_value(self.model.get_iter(self.path),
159
 
                                        treemodel.REVISION)
 
144
            return self.model.get_value(self.iter, treemodel.REVISION)
160
145
        elif property.name == 'revision-number':
161
 
            return self.model.get_value(self.model.get_iter(self.path),
162
 
                                        treemodel.REVNO)
 
146
            return self.model.get_value(self.iter, treemodel.REVNO)
163
147
        elif property.name == 'children':
164
 
            return self.model.get_value(self.model.get_iter(self.path),
165
 
                                        treemodel.CHILDREN)
 
148
            return self.model.get_value(self.iter, treemodel.CHILDREN)
166
149
        elif property.name == 'parents':
167
 
            return self.model.get_value(self.model.get_iter(self.path),
168
 
                                        treemodel.PARENTS)
 
150
            return self.model.get_value(self.iter, treemodel.PARENTS)
169
151
        else:
170
152
            raise AttributeError, 'unknown property %s' % property.name
171
153
 
191
173
        """Return revision id of currently selected revision, or None."""
192
174
        return self.get_property('revision')
193
175
 
194
 
    def has_revision_id(self, revision_id):
195
 
        return (revision_id in self.index)
196
 
 
197
176
    def set_revision(self, revision):
198
177
        self.set_property('revision', revision)
199
178
 
222
201
    def add_tag(self, tag, revid=None):
223
202
        if revid is None: revid = self.revision.revision_id
224
203
 
225
 
        if lock.release(self.branch):
 
204
        try:
 
205
            self.branch.unlock()
 
206
 
226
207
            try:
227
 
                lock.acquire(self.branch, lock.WRITE)
 
208
                self.branch.lock_write()
228
209
                self.model.add_tag(tag, revid)
229
210
            finally:
230
 
                lock.release(self.branch)
231
 
 
232
 
            lock.acquire(self.branch, lock.READ)
233
 
 
234
 
            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)
235
217
        
236
218
    def refresh(self):
237
219
        gobject.idle_add(self.populate, self.get_revision())
287
269
                       should be broken.
288
270
        """
289
271
 
290
 
        if getattr(ui.ui_factory, "set_progress_bar_widget", None) is not None:
291
 
            # We'are using our own ui, let's tell it to use our widget.
292
 
            ui.ui_factory.set_progress_bar_widget(self.progress_widget)
293
 
        self.progress_bar = ui.ui_factory.nested_progress_bar()
294
 
        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)
295
274
 
296
275
        try:
297
276
            if self.compact:
308
287
                                                            broken_line_length,
309
288
                                                            show_graph,
310
289
                                                            self.mainline_only,
311
 
                                                            self.progress_bar)
 
290
                                                            loading_progress)
312
291
 
313
292
            self.model = TreeModel(self.branch, linegraphdata)
314
293
            self.graph_cell.columns_len = columns_len
325
304
            else:
326
305
                self.set_revision(revision)
327
306
 
328
 
            self.emit('refreshed')
 
307
            self.emit('revisions-loaded')
 
308
 
329
309
            return False
330
310
        finally:
331
 
            self.progress_bar.finished()
 
311
            loading_progress.finished()
332
312
 
333
313
    def construct_treeview(self):
334
314
        self.treeview = gtk.TreeView()
341
321
        if set_tooltip is not None:
342
322
            set_tooltip(treemodel.MESSAGE)
343
323
 
344
 
        self._prev_cursor_path = None
345
324
        self.treeview.connect("cursor-changed",
346
325
                self._on_selection_changed)
347
326
 
413
392
        self.treeview.append_column(self.date_column)
414
393
        
415
394
        return self.treeview
416
 
    
 
395
 
417
396
    def _on_selection_changed(self, treeview):
418
397
        """callback for when the treeview changes."""
419
398
        (path, focus) = treeview.get_cursor()
420
 
        if (path is not None) and (path != self._prev_cursor_path):
421
 
            self._prev_cursor_path = path # avoid emitting twice per click
422
 
            self.path = path
 
399
        if path is not None:
 
400
            self.iter = self.model.get_iter(path)
423
401
            self.emit('revision-selected')
424
402
 
425
403
    def _on_revision_selected(self, widget, event):
426
 
        from bzrlib.plugins.gtk.revisionmenu import RevisionMenu
 
404
        from bzrlib.plugins.gtk.revisionmenu import RevisionPopupMenu
427
405
        if event.button == 3:
428
 
            menu = RevisionMenu(self.branch.repository, 
 
406
            menu = RevisionPopupMenu(self.branch.repository, 
429
407
                [self.get_revision().revision_id],
430
408
                self.branch)
431
409
            menu.connect('tag-added', lambda w, t, r: self.add_tag(t, r))