/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: John Arbash Meinel
  • Date: 2007-10-02 23:08:12 UTC
  • mto: (322.1.1 trunk) (330.3.3 trunk)
  • mto: This revision was merged to the branch mainline in revision 368.
  • Revision ID: john@arbash-meinel.com-20071002230812-h8i6pq8fwvodute4
Start testing with Unicode data.
It seems there is some brokenness with serializing Unicode messages.
But otherwise everything seems to be working.

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
        self.logview.set_file_id(file_id)
69
70
        self.revision_id = getattr(tree, 'get_revision_id', 
70
71
                                   lambda: CURRENT_REVISION)()
71
72
        
81
82
        try:
82
83
            branch.lock_read()
83
84
            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
85
            for line_no, (revision, revno, line)\
89
86
                    in enumerate(self._annotate(tree, file_id)):
90
87
                if revision.revision_id == last_seen and not self.all:
114
111
 
115
112
        self.annoview.set_model(self.annomodel)
116
113
        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
114
 
121
115
    def jump_to_line(self, lineno):
122
116
        if lineno > len(self.annomodel) or lineno < 1:
132
126
        self.annoview.set_cursor(row)
133
127
        self.annoview.scroll_to_cell(row, use_align=True)
134
128
 
 
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
135
141
 
136
142
    def _annotate(self, tree, file_id):
137
143
        current_revision = FakeRevision(CURRENT_REVISION)
146
152
            revision_id = self.branch.last_revision()
147
153
        else:
148
154
            revision_id = self.revision_id
 
155
        dotted = self._dotted_revnos(repository, revision_id)
149
156
        revision_cache = RevisionCache(repository, self.revisions)
150
157
        for origin, text in tree.annotate_iter(file_id):
151
158
            rev_id = origin
155
162
            else:
156
163
                try:
157
164
                    revision = revision_cache.get_revision(rev_id)
158
 
                    revno = self.dotted.get(rev_id, 'merge')
 
165
                    revno = dotted.get(rev_id, 'merge')
159
166
                    if len(revno) > 15:
160
167
                        revno = 'merge'
161
168
                except NoSuchRevision:
178
185
 
179
186
    def _activate_selected_revision(self, w):
180
187
        rev_id = self._selected_revision()
181
 
        if not rev_id or rev_id == NULL_REVISION:
 
188
        if rev_id is None:
182
189
            return
183
190
        selected = self.revisions[rev_id]
184
 
        self.revisionview.set_revision(selected)
 
191
        self.logview.set_revision(selected)
185
192
        if (len(selected.parent_ids) != 0 and selected.parent_ids[0] not in
186
193
            self._no_back):
187
194
            enable_back = True
190
197
        self.back_button.set_sensitive(enable_back)
191
198
 
192
199
    def _create(self):
193
 
        self.revisionview = self._create_log_view()
 
200
        self.logview = self._create_log_view()
194
201
        self.annoview = self._create_annotate_view()
195
202
 
196
203
        vbox = gtk.VBox(False)
217
224
        
218
225
        self.pane = pane = gtk.VPaned()
219
226
        pane.add1(swbox)
220
 
        pane.add2(self.revisionview)
 
227
        pane.add2(self.logview)
221
228
        pane.show()
222
229
        vbox.pack_start(pane, expand=True, fill=True)
223
230
 
242
249
        self._search.show_for('line')
243
250
        self._search.set_target(self.annoview, LINE_NUM_COL)
244
251
 
245
 
    def line_diff(self, tv, path, tvc):
 
252
    def row_diff(self, tv, path, tvc):
246
253
        row = path[0]
247
254
        revision = self.annotations[row]
248
255
        repository = self.branch.repository
257
264
                tree2 = repository.revision_tree(NULL_REVISION)
258
265
        from bzrlib.plugins.gtk.diff import DiffWindow
259
266
        window = DiffWindow()
260
 
        window.set_diff("Diff for line %d" % (row+1), tree1, tree2)
 
267
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
261
268
        window.set_file(tree1.id2path(self.file_id))
262
269
        window.show()
263
270
 
267
274
        tv.set_rules_hint(False)
268
275
        tv.connect("cursor-changed", self._activate_selected_revision)
269
276
        tv.show()
270
 
        tv.connect("row-activated", self.line_diff)
 
277
        tv.connect("row-activated", self.row_diff)
271
278
 
272
279
        cell = gtk.CellRendererText()
273
280
        cell.set_property("xalign", 1.0)
321
328
        return tv
322
329
 
323
330
    def _create_log_view(self):
324
 
        lv = RevisionView(self._branch)
 
331
        lv = LogView()
325
332
        lv.show()
326
333
        return lv
327
334
 
388
395
            if i + n >= row:
389
396
                return j - i
390
397
 
 
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
 
391
417
 
392
418
class FakeRevision:
393
419
    """ A fake revision.