mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Edit Book: Add a button to show diffs after any Polish action
This commit is contained in:
parent
1c286fb671
commit
f630484554
BIN
resources/images/diff.png
Normal file
BIN
resources/images/diff.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.5 KiB |
@ -38,6 +38,8 @@ from calibre.gui2.tweak_book.editor.insert_resource import get_resource_data, Ne
|
|||||||
from calibre.gui2.tweak_book.preferences import Preferences
|
from calibre.gui2.tweak_book.preferences import Preferences
|
||||||
from calibre.gui2.tweak_book.widgets import RationalizeFolders, MultiSplit
|
from calibre.gui2.tweak_book.widgets import RationalizeFolders, MultiSplit
|
||||||
|
|
||||||
|
_diff_dialogs = []
|
||||||
|
|
||||||
def get_container(*args, **kwargs):
|
def get_container(*args, **kwargs):
|
||||||
kwargs['tweak_mode'] = True
|
kwargs['tweak_mode'] = True
|
||||||
container = _gc(*args, **kwargs)
|
container = _gc(*args, **kwargs)
|
||||||
@ -384,12 +386,35 @@ class Boss(QObject):
|
|||||||
d.l.addWidget(d.e)
|
d.l.addWidget(d.e)
|
||||||
d.e.setHtml(report)
|
d.e.setHtml(report)
|
||||||
d.bb = QDialogButtonBox(QDialogButtonBox.Close)
|
d.bb = QDialogButtonBox(QDialogButtonBox.Close)
|
||||||
|
b = d.b = d.bb.addButton(_('See what changed'), d.bb.AcceptRole)
|
||||||
|
b.setIcon(QIcon(I('diff.png')))
|
||||||
|
b.clicked.connect(partial(self.show_current_diff, allow_revert=True))
|
||||||
d.l.addWidget(d.bb)
|
d.l.addWidget(d.bb)
|
||||||
d.bb.rejected.connect(d.reject)
|
d.bb.rejected.connect(d.reject)
|
||||||
d.bb.accepted.connect(d.accept)
|
d.bb.accepted.connect(d.accept)
|
||||||
d.resize(600, 400)
|
d.resize(600, 400)
|
||||||
d.exec_()
|
d.exec_()
|
||||||
|
|
||||||
|
def create_diff_dialog(self, revert_msg=_('&Revert changes')):
|
||||||
|
global _diff_dialogs
|
||||||
|
from calibre.gui2.tweak_book.diff.main import Diff
|
||||||
|
d = Diff(revert_button_msg=revert_msg, parent=self.gui)
|
||||||
|
[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)
|
||||||
|
return d
|
||||||
|
|
||||||
|
def show_current_diff(self, allow_revert=True):
|
||||||
|
self.commit_all_editors_to_container()
|
||||||
|
d = self.create_diff_dialog()
|
||||||
|
d.revert_requested.connect(partial(self.revert_requested, self.global_undo.previous_container))
|
||||||
|
d.container_diff(self.global_undo.previous_container, self.global_undo.current_container)
|
||||||
|
|
||||||
|
def revert_requested(self, container):
|
||||||
|
nc = self.global_undo.revert_to(container)
|
||||||
|
set_current_container(nc)
|
||||||
|
self.apply_container_update_to_gui()
|
||||||
|
|
||||||
# Renaming {{{
|
# Renaming {{{
|
||||||
|
|
||||||
def rationalize_folders(self):
|
def rationalize_folders(self):
|
||||||
|
@ -11,7 +11,7 @@ from functools import partial
|
|||||||
from PyQt4.Qt import (
|
from PyQt4.Qt import (
|
||||||
QGridLayout, QToolButton, QIcon, QRadioButton, QMenu, QApplication, Qt,
|
QGridLayout, QToolButton, QIcon, QRadioButton, QMenu, QApplication, Qt,
|
||||||
QSize, QWidget, QLabel, QStackedLayout, QPainter, QRect, QVBoxLayout,
|
QSize, QWidget, QLabel, QStackedLayout, QPainter, QRect, QVBoxLayout,
|
||||||
QCursor, QEventLoop, QKeySequence)
|
QCursor, QEventLoop, QKeySequence, pyqtSignal)
|
||||||
|
|
||||||
from calibre.ebooks.oeb.polish.container import Container
|
from calibre.ebooks.oeb.polish.container import Container
|
||||||
from calibre.gui2 import info_dialog
|
from calibre.gui2 import info_dialog
|
||||||
@ -128,9 +128,12 @@ def ebook_diff(path1, path2):
|
|||||||
|
|
||||||
class Diff(Dialog):
|
class Diff(Dialog):
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
revert_requested = pyqtSignal()
|
||||||
|
|
||||||
|
def __init__(self, revert_button_msg=None, parent=None):
|
||||||
self.context = 3
|
self.context = 3
|
||||||
self.apply_diff_calls = []
|
self.apply_diff_calls = []
|
||||||
|
self.revert_button_msg = revert_button_msg
|
||||||
Dialog.__init__(self, _('Differences between books'), 'diff-dialog', parent=parent)
|
Dialog.__init__(self, _('Differences between books'), 'diff-dialog', parent=parent)
|
||||||
|
|
||||||
def sizeHint(self):
|
def sizeHint(self):
|
||||||
@ -187,10 +190,23 @@ class Diff(Dialog):
|
|||||||
l.addWidget(b, l.rowCount() - 1, l.columnCount(), 1, 1)
|
l.addWidget(b, l.rowCount() - 1, l.columnCount(), 1, 1)
|
||||||
|
|
||||||
self.bb.setStandardButtons(self.bb.Close)
|
self.bb.setStandardButtons(self.bb.Close)
|
||||||
|
if self.revert_button_msg is not None:
|
||||||
|
self.rvb = b = self.bb.addButton(self.revert_button_msg, self.bb.RejectRole)
|
||||||
|
b.setIcon(QIcon(I('edit-undo.png')))
|
||||||
|
b.clicked.connect(self.revert_requested)
|
||||||
|
self.bb.button(self.bb.Close).setDefault(True)
|
||||||
l.addWidget(self.bb, l.rowCount(), 0, 1, -1)
|
l.addWidget(self.bb, l.rowCount(), 0, 1, -1)
|
||||||
|
|
||||||
self.view.setFocus(Qt.OtherFocusReason)
|
self.view.setFocus(Qt.OtherFocusReason)
|
||||||
|
|
||||||
|
def break_cycles(self):
|
||||||
|
self.view = None
|
||||||
|
for x in ('revert_requested',):
|
||||||
|
try:
|
||||||
|
getattr(self, x).disconnect()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
def do_search(self, reverse):
|
def do_search(self, reverse):
|
||||||
text = unicode(self.search.text())
|
text = unicode(self.search.text())
|
||||||
if not text.strip():
|
if not text.strip():
|
||||||
|
@ -33,6 +33,10 @@ class GlobalUndoHistory(object):
|
|||||||
def current_container(self):
|
def current_container(self):
|
||||||
return self.states[self.pos].container
|
return self.states[self.pos].container
|
||||||
|
|
||||||
|
@property
|
||||||
|
def previous_container(self):
|
||||||
|
return self.states[self.pos - 1].container
|
||||||
|
|
||||||
def open_book(self, container):
|
def open_book(self, container):
|
||||||
self.states = [State(container)]
|
self.states = [State(container)]
|
||||||
self.pos = 0
|
self.pos = 0
|
||||||
@ -76,6 +80,12 @@ class GlobalUndoHistory(object):
|
|||||||
self.pos += 1
|
self.pos += 1
|
||||||
return self.current_container
|
return self.current_container
|
||||||
|
|
||||||
|
def revert_to(self, container):
|
||||||
|
for i, state in enumerate(self.states):
|
||||||
|
if state.container is container:
|
||||||
|
self.pos = i
|
||||||
|
return container
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def can_undo(self):
|
def can_undo(self):
|
||||||
return self.pos > 0
|
return self.pos > 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user