/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: Mateusz Korniak
  • Date: 2007-07-21 13:16:33 UTC
  • mto: This revision was merged to the branch mainline in revision 248.
  • Revision ID: matkor@laptop-hp-20070721131633-t40kxs20j1q2fvvc
Context menu "Remove and delete added"
Acts like "Remove" but also deletes file locally.

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 logview import LogView
32
 
from spanselector import SpanSelector
 
31
from bzrlib.plugins.gtk.logview import LogView
33
32
 
34
33
 
35
34
(
56
55
 
57
56
        self._create()
58
57
        self.revisions = {}
 
58
        self.history = []
 
59
        self._no_back = set()
59
60
 
60
61
    def annotate(self, tree, branch, file_id):
61
62
        self.annotations = []
140
141
        current_revision.timestamp = time.time()
141
142
        current_revision.message = '[Not yet committed]'
142
143
        current_revision.parent_ids = tree.get_parent_ids()
 
144
        current_revision.properties['branch-nick'] = self.branch.nick
143
145
        current_revno = '%d?' % (self.branch.revno() + 1)
144
146
        repository = self.branch.repository
145
147
        if self.revision_id == CURRENT_REVISION:
177
179
            return None
178
180
        return self.annomodel[path][REVISION_ID_COL]
179
181
 
180
 
    def _show_log(self, w):
 
182
    def _activate_selected_revision(self, w):
181
183
        rev_id = self._selected_revision()
182
184
        if rev_id is None:
183
185
            return
184
 
        self.logview.set_revision(self.revisions[rev_id])
 
186
        selected = self.revisions[rev_id]
 
187
        self.logview.set_revision(selected)
 
188
        if (len(selected.parent_ids) != 0 and selected.parent_ids[0] not in
 
189
            self._no_back):
 
190
            enable_back = True
 
191
        else:
 
192
            enable_back = False
 
193
        self.back_button.set_sensitive(enable_back)
185
194
 
186
195
    def _create(self):
187
196
        self.logview = self._create_log_view()
188
197
        self.annoview = self._create_annotate_view()
189
198
 
190
 
        vbox = gtk.VBox(False, 12)
191
 
        vbox.set_border_width(12)
 
199
        vbox = gtk.VBox(False)
192
200
        vbox.show()
193
201
 
194
202
        sw = gtk.ScrolledWindow()
197
205
        sw.add(self.annoview)
198
206
        self.annoview.gwindow = self
199
207
        sw.show()
 
208
 
 
209
        swbox = gtk.VBox()
 
210
        swbox.pack_start(sw)
 
211
        swbox.show()
 
212
 
 
213
        hbox = gtk.HBox(False, 6)
 
214
        self.back_button = self._create_back_button()
 
215
        hbox.pack_start(self.back_button, expand=False, fill=True)
 
216
        self.forward_button = self._create_forward_button()
 
217
        hbox.pack_start(self.forward_button, expand=False, fill=True)
 
218
        hbox.show()
 
219
        vbox.pack_start(hbox, expand=False, fill=True)
200
220
        
201
221
        self.pane = pane = gtk.VPaned()
202
 
        pane.add1(sw)
 
222
        pane.add1(swbox)
203
223
        pane.add2(self.logview)
204
224
        pane.show()
205
225
        vbox.pack_start(pane, expand=True, fill=True)
206
226
 
207
227
        self._search = SearchBox()
208
 
        vbox.pack_start(self._search, expand=False, fill=True)
 
228
        swbox.pack_start(self._search, expand=False, fill=True)
209
229
        accels = gtk.AccelGroup()
210
230
        accels.connect_group(gtk.keysyms.f, gtk.gdk.CONTROL_MASK,
211
231
                             gtk.ACCEL_LOCKED,
215
235
                             self._search_by_line)
216
236
        self.add_accel_group(accels)
217
237
 
218
 
        hbox = gtk.HBox(True, 6)
219
 
        hbox.pack_start(self._create_prev_button(), expand=False, fill=True)
220
 
        hbox.pack_end(self._create_button_box(), expand=False, fill=True)
221
 
        hbox.show()
222
 
        vbox.pack_start(hbox, expand=False, fill=True)
223
 
 
224
238
        self.add(vbox)
225
239
 
226
240
    def _search_by_text(self, accel_group, window, key, modifiers):
244
258
                tree2 = repository.revision_tree(revision.parent_ids[0])
245
259
            else:
246
260
                tree2 = repository.revision_tree(NULL_REVISION)
247
 
        from bzrlib.plugins.gtk.viz.diffwin import DiffWindow
 
261
        from bzrlib.plugins.gtk.diff import DiffWindow
248
262
        window = DiffWindow()
249
263
        window.set_diff("Diff for row %d" % (row+1), tree1, tree2)
250
264
        window.set_file(tree1.id2path(self.file_id))
254
268
    def _create_annotate_view(self):
255
269
        tv = gtk.TreeView()
256
270
        tv.set_rules_hint(False)
257
 
        tv.connect("cursor-changed", self._show_log)
 
271
        tv.connect("cursor-changed", self._activate_selected_revision)
258
272
        tv.show()
259
273
        tv.connect("row-activated", self.row_diff)
260
274
 
312
326
    def _create_log_view(self):
313
327
        lv = LogView()
314
328
        lv.show()
315
 
 
316
329
        return lv
317
330
 
318
 
    def _create_button_box(self):
319
 
        box = gtk.HButtonBox()
320
 
        box.set_layout(gtk.BUTTONBOX_END)
321
 
        box.show()
322
 
 
323
 
        button = gtk.Button()
324
 
        button.set_use_stock(True)
325
 
        button.set_label("gtk-close")
326
 
        button.connect("clicked", lambda w: self.destroy())
327
 
        button.show()
328
 
 
329
 
        box.pack_start(button, expand=False, fill=False)
330
 
 
331
 
        return box
332
 
 
333
 
    def _create_prev_button(self):
334
 
        box = gtk.HButtonBox()
335
 
        box.set_layout(gtk.BUTTONBOX_START)
336
 
        box.show()
337
 
        
 
331
    def _create_back_button(self):
338
332
        button = gtk.Button()
339
333
        button.set_use_stock(True)
340
334
        button.set_label("gtk-go-back")
341
335
        button.connect("clicked", lambda w: self.go_back())
342
 
        button.show()
343
 
        box.pack_start(button, expand=False, fill=False)
344
 
        return box
 
336
        button.set_relief(gtk.RELIEF_NONE)
 
337
        button.show()
 
338
        return button
 
339
 
 
340
    def _create_forward_button(self):
 
341
        button = gtk.Button()
 
342
        button.set_use_stock(True)
 
343
        button.set_label("gtk-go-forward")
 
344
        button.connect("clicked", lambda w: self.go_forward())
 
345
        button.set_relief(gtk.RELIEF_NONE)
 
346
        button.show()
 
347
        button.set_sensitive(False)
 
348
        return button
345
349
 
346
350
    def go_back(self):
 
351
        last_tree = self.tree
347
352
        rev_id = self._selected_revision()
348
353
        parent_id = self.revisions[rev_id].parent_ids[0]
349
 
        tree = self.branch.repository.revision_tree(parent_id)
350
 
        if self.file_id in tree:
351
 
            offset = self.get_scroll_offset(tree)
 
354
        target_tree = self.branch.repository.revision_tree(parent_id)
 
355
        if self._go(target_tree):
 
356
            self.history.append(last_tree)
 
357
            self.forward_button.set_sensitive(True)
 
358
        else:
 
359
            self._no_back.add(parent_id)
 
360
            self.back_button.set_sensitive(False)
 
361
 
 
362
    def go_forward(self):
 
363
        if len(self.history) == 0:
 
364
            return
 
365
        target_tree = self.history.pop()
 
366
        if len(self.history) == 0:
 
367
            self.forward_button.set_sensitive(False)
 
368
        self._go(target_tree)
 
369
 
 
370
    def _go(self, target_tree):
 
371
        rev_id = self._selected_revision()
 
372
        if self.file_id in target_tree:
 
373
            offset = self.get_scroll_offset(target_tree)
352
374
            (row,), col = self.annoview.get_cursor()
353
 
            self.annotate(tree, self.branch, self.file_id)
354
 
            self.annoview.set_cursor(row+offset)
 
375
            self.annotate(target_tree, self.branch, self.file_id)
 
376
            new_row = row+offset
 
377
            if new_row < 0:
 
378
                new_row = 0
 
379
            self.annoview.set_cursor(new_row)
 
380
            return True
 
381
        else:
 
382
            return False
355
383
 
356
384
    def get_scroll_offset(self, tree):
357
385
        old = self.tree.get_file(self.file_id)
371
399
    For when a revision is referenced but not present.
372
400
    """
373
401
 
374
 
    def __init__(self, revision_id, committer='?'):
 
402
    def __init__(self, revision_id, committer='?', nick=None):
375
403
        self.revision_id = revision_id
376
404
        self.parent_ids = []
377
405
        self.committer = committer
378
406
        self.message = "?"
379
407
        self.timestamp = 0.0
380
408
        self.timezone = 0
 
409
        self.properties = {}
381
410
 
382
411
 
383
412
class RevisionCache(object):