/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: 2008-06-28 17:13:46 UTC
  • mto: This revision was merged to the branch mainline in revision 517.
  • Revision ID: jelmer@samba.org-20080628171346-ob42iggcc663s4xz
Show full license details in about dialog.

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