/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 annotate/gannotate.py

  • Committer: Jelmer Vernooij
  • Date: 2007-10-02 17:23:52 UTC
  • mto: This revision was merged to the branch mainline in revision 292.
  • Revision ID: jelmer@samba.org-20071002172352-icn8h0b5iolowfkg
Avoid deprecation warning for all_plugins() in gpreferences.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
from bzrlib.revision import NULL_REVISION, CURRENT_REVISION
29
29
 
30
30
from colormap import AnnotateColorMap, AnnotateColorSaturation
31
 
from bzrlib.plugins.gtk.revisionview import RevisionView
32
 
from bzrlib.plugins.gtk.window import Window
 
31
from bzrlib.plugins.gtk.logview import LogView
33
32
 
34
33
 
35
34
(
42
41
) = range(6)
43
42
 
44
43
 
45
 
class GAnnotateWindow(Window):
 
44
class GAnnotateWindow(gtk.Window):
46
45
    """Annotate window."""
47
46
 
48
 
    def __init__(self, all=False, plain=False, parent=None, branch=None):
 
47
    def __init__(self, all=False, plain=False, parent=None):
49
48
        self.all = all
50
49
        self.plain = plain
51
 
        self._branch = branch
 
50
        self._parent = parent
52
51
        
53
 
        Window.__init__(self, parent)
 
52
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
 
53
 
 
54
        self.connect("key-press-event", self._on_key_pressed)
54
55
        
55
56
        self.set_icon(self.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON))
56
57
        self.annotate_colormap = AnnotateColorSaturation()
65
66
        self.branch = branch
66
67
        self.tree = tree
67
68
        self.file_id = file_id
68
 
        self.revisionview.set_file_id(file_id)
69
69
        self.revision_id = getattr(tree, 'get_revision_id', 
70
70
                                   lambda: CURRENT_REVISION)()
71
71
        
81
81
        try:
82
82
            branch.lock_read()
83
83
            branch.repository.lock_read()
84
 
            self.dotted = {}
85
 
            revno_map = self.branch.get_revision_id_to_revno_map()
86
 
            for revision_id, revno in revno_map.iteritems():
87
 
                self.dotted[revision_id] = '.'.join(str(num) for num in revno)
88
84
            for line_no, (revision, revno, line)\
89
85
                    in enumerate(self._annotate(tree, file_id)):
90
86
                if revision.revision_id == last_seen and not self.all:
114
110
 
115
111
        self.annoview.set_model(self.annomodel)
116
112
        self.annoview.grab_focus()
117
 
        my_revno = self.dotted.get(self.revision_id, 'current')
118
 
        title = '%s (%s) - gannotate' % (self.tree.id2path(file_id), my_revno)
119
 
        self.set_title(title)
120
113
 
121
114
    def jump_to_line(self, lineno):
122
115
        if lineno > len(self.annomodel) or lineno < 1:
132
125
        self.annoview.set_cursor(row)
133
126
        self.annoview.scroll_to_cell(row, use_align=True)
134
127
 
 
128
    def _dotted_revnos(self, repository, revision_id):
 
129
        """Return a dict of revision_id -> dotted revno
 
130
        
 
131
        :param repository: The repository to get the graph from
 
132
        :param revision_id: The last revision for which this info is needed
 
133
        """
 
134
        graph = repository.get_revision_graph(revision_id)
 
135
        dotted = {}
 
136
        for n, revision_id, d, revno, e in tsort.merge_sort(graph, 
 
137
            revision_id, generate_revno=True):
 
138
            dotted[revision_id] = '.'.join(str(num) for num in revno)
 
139
        return dotted
135
140
 
136
141
    def _annotate(self, tree, file_id):
137
142
        current_revision = FakeRevision(CURRENT_REVISION)
146
151
            revision_id = self.branch.last_revision()
147
152
        else:
148
153
            revision_id = self.revision_id
 
154
        dotted = self._dotted_revnos(repository, revision_id)
149
155
        revision_cache = RevisionCache(repository, self.revisions)
150
156
        for origin, text in tree.annotate_iter(file_id):
151
157
            rev_id = origin
155
161
            else:
156
162
                try:
157
163
                    revision = revision_cache.get_revision(rev_id)
158
 
                    revno = self.dotted.get(rev_id, 'merge')
 
164
                    revno = dotted.get(rev_id, 'merge')
159
165
                    if len(revno) > 15:
160
166
                        revno = 'merge'
161
167
                except NoSuchRevision:
178
184
 
179
185
    def _activate_selected_revision(self, w):
180
186
        rev_id = self._selected_revision()
181
 
        if not rev_id or rev_id == NULL_REVISION:
 
187
        if rev_id is None:
182
188
            return
183
189
        selected = self.revisions[rev_id]
184
 
        self.revisionview.set_revision(selected)
 
190
        self.logview.set_revision(selected)
185
191
        if (len(selected.parent_ids) != 0 and selected.parent_ids[0] not in
186
192
            self._no_back):
187
193
            enable_back = True
190
196
        self.back_button.set_sensitive(enable_back)
191
197
 
192
198
    def _create(self):
193
 
        self.revisionview = self._create_log_view()
 
199
        self.logview = self._create_log_view()
194
200
        self.annoview = self._create_annotate_view()
195
201
 
196
202
        vbox = gtk.VBox(False)
217
223
        
218
224
        self.pane = pane = gtk.VPaned()
219
225
        pane.add1(swbox)
220
 
        pane.add2(self.revisionview)
 
226
        pane.add2(self.logview)
221
227
        pane.show()
222
228
        vbox.pack_start(pane, expand=True, fill=True)
223
229
 
242
248
        self._search.show_for('line')
243
249
        self._search.set_target(self.annoview, LINE_NUM_COL)
244
250
 
245
 
    def line_diff(self, tv, path, tvc):
 
251
    def row_diff(self, tv, path, tvc):
246
252
        row = path[0]
247
253
        revision = self.annotations[row]
248
254
        repository = self.branch.repository
257
263
                tree2 = repository.revision_tree(NULL_REVISION)
258
264
        from bzrlib.plugins.gtk.diff import DiffWindow
259
265
        window = DiffWindow()
260
 
        window.set_diff("Diff for line %d" % (row+1), tree1, tree2)
 
266
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
261
267
        window.set_file(tree1.id2path(self.file_id))
262
268
        window.show()
263
269
 
267
273
        tv.set_rules_hint(False)
268
274
        tv.connect("cursor-changed", self._activate_selected_revision)
269
275
        tv.show()
270
 
        tv.connect("row-activated", self.line_diff)
 
276
        tv.connect("row-activated", self.row_diff)
271
277
 
272
278
        cell = gtk.CellRendererText()
273
279
        cell.set_property("xalign", 1.0)
321
327
        return tv
322
328
 
323
329
    def _create_log_view(self):
324
 
        lv = RevisionView(self._branch)
 
330
        lv = LogView()
325
331
        lv.show()
326
332
        return lv
327
333
 
388
394
            if i + n >= row:
389
395
                return j - i
390
396
 
 
397
    def _on_key_pressed(self, widget, event):
 
398
        """ Key press event handler. """
 
399
        keyname = gtk.gdk.keyval_name(event.keyval)
 
400
        func = getattr(self, '_on_key_press_' + keyname, None)
 
401
        if func:
 
402
            return func(event)
 
403
 
 
404
    def _on_key_press_w(self, event):
 
405
        if event.state & gtk.gdk.CONTROL_MASK:
 
406
            self.destroy()
 
407
            if self._parent is None:
 
408
                gtk.main_quit()
 
409
 
 
410
    def _on_key_press_q(self, event):
 
411
        if event.state & gtk.gdk.CONTROL_MASK:
 
412
            gtk.main_quit()
 
413
    
 
414
 
 
415
 
391
416
 
392
417
class FakeRevision:
393
418
    """ A fake revision.