Implement double clicking in the diff view opening the editor when viewing a diff against the current container

This commit is contained in:
Kovid Goyal 2014-01-29 21:11:28 +05:30
parent 209880df6c
commit 5eb1745526
4 changed files with 55 additions and 10 deletions

View File

@ -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):

View File

@ -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:

View File

@ -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):

View File

@ -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)