diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index a723bdd88c..1f755dc186 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -396,10 +396,10 @@ class Boss(QObject): d.resize(600, 400) d.exec_() - def create_diff_dialog(self, revert_msg=_('&Revert changes')): + def create_diff_dialog(self, revert_msg=_('&Revert changes'), show_open_in_editor=True): global _diff_dialogs from calibre.gui2.tweak_book.diff.main import Diff - d = Diff(revert_button_msg=revert_msg, parent=self.gui) + d = Diff(revert_button_msg=revert_msg, parent=self.gui, show_open_in_editor=show_open_in_editor) [x.break_cycles() for x in _diff_dialogs if not x.isVisible()] _diff_dialogs = [x for x in _diff_dialogs if x.isVisible()] + [d] d.show(), d.raise_(), d.setFocus(Qt.OtherFocusReason) @@ -409,6 +409,15 @@ class Boss(QObject): self.commit_all_editors_to_container() d = self.create_diff_dialog() d.revert_requested.connect(partial(self.revert_requested, self.global_undo.previous_container)) + def line_activated(name, lnum, right): + if right: + self.edit_file_requested(name, None, guess_type(name)) + if name in editors: + editor = editors[name] + editor.go_to_line(lnum) + editor.setFocus(Qt.OtherFocusReason) + self.gui.raise_() + d.line_activated.connect(line_activated) d.container_diff(self.global_undo.previous_container, self.global_undo.current_container) def revert_requested(self, container): diff --git a/src/calibre/gui2/tweak_book/diff/main.py b/src/calibre/gui2/tweak_book/diff/main.py index a4ba8622b8..e4b419383b 100644 --- a/src/calibre/gui2/tweak_book/diff/main.py +++ b/src/calibre/gui2/tweak_book/diff/main.py @@ -129,12 +129,15 @@ def ebook_diff(path1, path2): class Diff(Dialog): revert_requested = pyqtSignal() + line_activated = pyqtSignal(object, object, object) - def __init__(self, revert_button_msg=None, parent=None): + def __init__(self, revert_button_msg=None, parent=None, show_open_in_editor=False): self.context = 3 self.apply_diff_calls = [] + self.show_open_in_editor = show_open_in_editor self.revert_button_msg = revert_button_msg Dialog.__init__(self, _('Differences between books'), 'diff-dialog', parent=parent) + self.view.line_activated.connect(self.line_activated) def sizeHint(self): geom = QApplication.instance().desktop().availableGeometry(self) @@ -151,7 +154,7 @@ class Diff(Dialog): self.l = l = QGridLayout() self.w.setLayout(l) - self.view = v = DiffView(self) + self.view = v = DiffView(self, show_open_in_editor=self.show_open_in_editor) l.addWidget(v, l.rowCount(), 0, 1, -1) r = l.rowCount() @@ -217,7 +220,7 @@ class Diff(Dialog): def break_cycles(self): self.view = None - for x in ('revert_requested',): + for x in ('revert_requested', 'line_activated'): try: getattr(self, x).disconnect() except: diff --git a/src/calibre/gui2/tweak_book/diff/view.py b/src/calibre/gui2/tweak_book/diff/view.py index d01be290e8..8cc8b1bf0c 100644 --- a/src/calibre/gui2/tweak_book/diff/view.py +++ b/src/calibre/gui2/tweak_book/diff/view.py @@ -70,10 +70,12 @@ class TextBrowser(PlainTextEdit): # {{{ wheel_event = pyqtSignal(object) next_change = pyqtSignal(object) scrolled = pyqtSignal() + line_activated = pyqtSignal(object, object, object) - def __init__(self, right=False, parent=None): + def __init__(self, right=False, parent=None, show_open_in_editor=False): PlainTextEdit.__init__(self, parent) self.setFrameStyle(0) + self.show_open_in_editor = show_open_in_editor self.side_margin = 0 self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_context_menu) @@ -144,9 +146,35 @@ class TextBrowser(PlainTextEdit): # {{{ a(QIcon(I('arrow-up.png')), _('Previous change'), partial(self.next_change.emit, -1)) a(QIcon(I('arrow-down.png')), _('Next change'), partial(self.next_change.emit, 1)) + if self.show_open_in_editor: + b = self.cursorForPosition(pos).block() + if b.isValid(): + a(QIcon(I('tweak.png')), _('Open file in the editor'), partial(self.generate_sync_request, b.blockNumber())) + if len(m.actions()) > 0: m.exec_(self.mapToGlobal(pos)) + def mouseDoubleClickEvent(self, ev): + if ev.button() == 1: + b = self.cursorForPosition(ev.pos()).block() + if b.isValid(): + self.generate_sync_request(b.blockNumber()) + return PlainTextEdit.mouseDoubleClickEvent(self, ev) + + def generate_sync_request(self, block_number): + if not self.headers: + return + try: + lnum = int(self.line_number_map.get(block_number, '')) + except: + lnum = 1 + for i, (num, text) in enumerate(self.headers): + if num > block_number: + name = text if i == 0 else self.headers[i - 1][1] + else: + name = self.headers[0][1] + self.line_activated.emit(name, lnum, bool(self.right)) + def search(self, query, reverse=False): ''' Search for query, also searching the headers. Matches in headers are not highlighted as managing the highlight is too much of a pain.''' @@ -468,11 +496,11 @@ class DiffSplitHandle(QSplitterHandle): # {{{ class DiffSplit(QSplitter): # {{{ - def __init__(self, parent=None): + def __init__(self, parent=None, show_open_in_editor=False): QSplitter.__init__(self, parent) self._failed_img = None - self.left, self.right = TextBrowser(parent=self), TextBrowser(right=True, parent=self) + self.left, self.right = TextBrowser(parent=self), TextBrowser(right=True, parent=self, show_open_in_editor=show_open_in_editor) self.addWidget(self.left), self.addWidget(self.right) self.split_words = re.compile(r"\w+|\W", re.UNICODE) self.clear() @@ -832,8 +860,9 @@ class DiffSplit(QSplitter): # {{{ class DiffView(QWidget): # {{{ SYNC_POSITION = 0.4 + line_activated = pyqtSignal(object, object, object) - def __init__(self, parent=None): + def __init__(self, parent=None, show_open_in_editor=False): QWidget.__init__(self, parent) self.changes = [[], [], []] self.delta = 0 @@ -841,7 +870,7 @@ class DiffView(QWidget): # {{{ self.setLayout(l) self.syncpos = 0 l.setMargin(0), l.setSpacing(0) - self.view = DiffSplit(self) + self.view = DiffSplit(self, show_open_in_editor=show_open_in_editor) l.addWidget(self.view) self.add_diff = self.view.add_diff self.scrollbar = QScrollBar(self) @@ -859,6 +888,7 @@ class DiffView(QWidget): # {{{ v.wheel_event.connect(self.scrollbar.wheelEvent) if i < 2: v.next_change.connect(self.next_change) + v.line_activated.connect(self.line_activated) v.scrolled.connect(partial(self.scrolled, i + 1)) def next_change(self, delta): diff --git a/src/calibre/gui2/tweak_book/editor/image.py b/src/calibre/gui2/tweak_book/editor/image.py index af247b4317..070c36bc47 100644 --- a/src/calibre/gui2/tweak_book/editor/image.py +++ b/src/calibre/gui2/tweak_book/editor/image.py @@ -155,6 +155,9 @@ class Editor(QMainWindow): def apply_settings(self, prefs=None): pass + def go_to_line(self, *args, **kwargs): + pass + def set_focus(self): self.canvas.setFocus(Qt.OtherFocusReason)