~hid-iwata/qbzr/qdiff-with-filelist

« back to all changes in this revision

Viewing changes to lib/annotate.py

  • Committer: Alexander Belchenko
  • Date: 2012-02-02 10:41:32 UTC
  • mfrom: (1451.2.6 textedit-guidebar)
  • Revision ID: bialix@ukr.net-20120202104132-b6a3uythbhn4jn3k
Implemented changes markers in qdiff, qannotate as a side guidebar for fast navigation. (IWATA Hidetaka)

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
#  - better annotate algorithm on packs
24
24
 
25
25
import sys, time
 
26
from itertools import groupby
26
27
from PyQt4 import QtCore, QtGui
27
28
 
28
29
from bzrlib.revision import CURRENT_REVISION
41
42
    runs_in_loading_queue,
42
43
    )
43
44
from bzrlib.plugins.qbzr.lib.widgets.toolbars import FindToolbar
 
45
from bzrlib.plugins.qbzr.lib.widgets.texteditaccessory import (
 
46
    GuideBarPanel, setup_guidebar_for_find
 
47
)
44
48
from bzrlib.plugins.qbzr.lib.uifactory import ui_current_widget
45
49
from bzrlib.plugins.qbzr.lib.trace import reports_exception
46
50
from bzrlib.plugins.qbzr.lib.logwidget import LogList
70
74
        self.get_revno = get_revno
71
75
        self.annotate = None
72
76
        self.rev_colors = {}
73
 
        self.highlight_revids = set()
 
77
        self._highlight_revids = set()
 
78
        self.highlight_lines = []
74
79
        
75
80
        self.splitter = None
76
81
        self.adjustWidth(1, 999)
80
85
            self.edit_cursorPositionChanged)
81
86
        self.show_current_line = False
82
87
 
 
88
    def get_highlight_revids(self):
 
89
        return self._highlight_revids
 
90
 
 
91
    def set_highlight_revids(self, value):
 
92
        if self._highlight_revids == value:
 
93
            return
 
94
 
 
95
        self._highlight_revids = value
 
96
        self.update_highlight_lines()
 
97
 
 
98
    def update_highlight_lines(self):
 
99
        self.highlight_lines = []
 
100
        if not self.annotate:
 
101
            return
 
102
        lines = [i for i, (revno, istop) in enumerate(self.annotate)
 
103
                 if revno in self._highlight_revids]
 
104
 
 
105
        # Convert [0,1,2,5,6,9,14,15,16,17] to [(0,3),(5,2),(9,1),(14,4)]
 
106
        def summarize(lines):
 
107
            for k, g in groupby(enumerate(lines), key=lambda x:x[1]-x[0]):
 
108
                yield [line for i, line in g]
 
109
        self.highlight_lines = [(x[0], len(x)) for x in summarize(lines)]
 
110
 
 
111
    highlight_revids = property(get_highlight_revids, set_highlight_revids)
 
112
 
83
113
    def edit_cursorPositionChanged(self):
84
114
        self.show_current_line = True
85
115
 
138
168
        if self.annotate and line_number-1 < len(self.annotate):
139
169
            revid, is_top = self.annotate[line_number - 1]
140
170
            if is_top:
141
 
                if revid in self.highlight_revids:
 
171
                if revid in self._highlight_revids:
142
172
                    font = painter.font()
143
173
                    font.setBold(True)
144
174
                    painter.setFont(font)
271
301
        self.text_edit.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap)
272
302
        
273
303
        self.text_edit.document().setDefaultFont(get_monospace_font())
274
 
        
 
304
 
 
305
        self.guidebar_panel = GuideBarPanel(self.text_edit, parent=self)
 
306
        self.guidebar_panel.add_entry('annotate', QtGui.QColor(255, 160, 180))
275
307
        self.annotate_bar = AnnotateBar(self.text_edit, self, self.get_revno)
276
308
        annotate_spliter = QtGui.QSplitter(QtCore.Qt.Horizontal, self)
277
309
        annotate_spliter.addWidget(self.annotate_bar)
278
 
        annotate_spliter.addWidget(self.text_edit)
 
310
        annotate_spliter.addWidget(self.guidebar_panel)
279
311
        self.annotate_bar.splitter = annotate_spliter
280
312
        self.text_edit_frame.hbox.addWidget(annotate_spliter)
281
313
        
284
316
                     self.edit_cursorPositionChanged)        
285
317
        self.connect(self.annotate_bar,
286
318
                     QtCore.SIGNAL("cursorPositionChanged()"),
287
 
                     self.edit_cursorPositionChanged)        
 
319
                     self.edit_cursorPositionChanged)
 
320
        self.connect(self.text_edit,
 
321
                     QtCore.SIGNAL("documentChangeFinished()"),
 
322
                     self.edit_documentChangeFinished)
288
323
        
289
324
        self.log_list = AnnotateLogList(self.processEvents, self.throbber, self)
290
325
        self.log_list.header().hideSection(logmodel.COL_DATE)
372
407
        self.connect(self.show_find,
373
408
                     QtCore.SIGNAL("toggled (bool)"),
374
409
                     self.show_find_toggle)
 
410
        setup_guidebar_for_find(self.guidebar_panel, self.find_toolbar, index=1)
375
411
        
376
412
        self.goto_line_toolbar = GotoLineToolbar(self, self.show_goto_line)
377
413
        self.goto_line_toolbar.hide()
584
620
        if self.text_edit.annotate:
585
621
            rev_id, is_top = self.text_edit.annotate[current_line]
586
622
            self.log_list.select_revid(rev_id)
 
623
            
 
624
    def edit_documentChangeFinished(self):
 
625
        self.annotate_bar.update_highlight_lines()
 
626
        self.guidebar_panel.update_data(annotate=self.annotate_bar.highlight_lines)
587
627
 
588
628
    @runs_in_loading_queue
589
629
    def set_annotate_revision(self):
623
663
    def log_list_selectionChanged(self, selected, deselected):
624
664
        revids = self.log_list.get_selection_and_merged_revids()
625
665
        self.annotate_bar.highlight_revids = revids
 
666
        self.guidebar_panel.update_data(annotate=self.annotate_bar.highlight_lines)
626
667
        self.annotate_bar.update()
627
668
    
628
669
    def show_find_toggle(self, state):