From ce9983233737189b6ebc55345a97598bda6aea18 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 25 Jan 2014 16:52:28 +0530 Subject: [PATCH] Context menu actions to go to next/previous change --- src/calibre/gui2/tweak_book/diff.py | 38 ++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/tweak_book/diff.py b/src/calibre/gui2/tweak_book/diff.py index 3f244460cf..2a08388a57 100644 --- a/src/calibre/gui2/tweak_book/diff.py +++ b/src/calibre/gui2/tweak_book/diff.py @@ -48,6 +48,7 @@ class TextBrowser(PlainTextEdit): # {{{ resized = pyqtSignal() wheel_event = pyqtSignal(object) + goto_change = pyqtSignal(object) def __init__(self, right=False, parent=None): PlainTextEdit.__init__(self, parent) @@ -114,6 +115,30 @@ class TextBrowser(PlainTextEdit): # {{{ i = unicode(self.textCursor().selectedText()) if i: a(QIcon(I('edit-copy.png')), _('Copy to clipboard'), self.copy) + + if len(self.changes) > 0: + try: + b = self.cursorForPosition(pos).block().blockNumber() + except Exception: + b = -1 + if b > -1: + pc = nc = None + for i, (top, bot, kind) in enumerate(self.changes): + if top <= b and bot >= b: + if len(self.changes) == 1: + break + pc = (i - 1) % len(self.changes) + nc = (i + 1) % len(self.changes) + if bot < b: + pc = i + if top > b: + nc = i + break + if pc is not None: + a(QIcon(I('arrow-up.png')), _('Previous change'), partial(self.goto_change.emit, pc)) + if nc is not None: + a(QIcon(I('arrow-down.png')), _('Next change'), partial(self.goto_change.emit, nc)) + if len(m.actions()) > 0: m.exec_(self.mapToGlobal(pos)) @@ -755,6 +780,17 @@ class DiffView(QWidget): # {{{ self.view.left.resized.connect(self.resized) for v in self.view.left, self.view.right, self.view.handle(1): v.wheel_event.connect(self.scrollbar.wheelEvent) + if hasattr(v, 'goto_change'): + v.goto_change.connect(self.goto_change) + + def goto_change(self, change): + for v in (self.view.left, self.view.right): + c = QTextCursor(v.document().findBlockByNumber(v.changes[change][0])) + v.setTextCursor(c) + v.centerCursor() + with self: + self.scroll_to(0, self.get_position_from_scrollbar(1)) + self.view.handle(1).update() def resized(self): self.resize_timer.start(100) @@ -805,7 +841,7 @@ class DiffView(QWidget): # {{{ val = start + offset bar.setValue(val - syncpos) - def scrolled(self, which): + def scrolled(self, which, *args): if self.syncing: return position = self.get_position_from_scrollbar(which)