diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index 9a71ca41bc..8703d6c228 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -486,7 +486,7 @@ class LayoutMixin(object): # {{{ path1, path2 = db.format_abspath(book_id, ofmt), db.format_abspath(book_id, fmt) from calibre.gui2.tweak_book.diff.main import compare_books compare_books(path1, path2, parent=self, revert_msg=_('Restore %s') % ofmt, revert_callback=partial( - self.iactions['Remove Books'].restore_format, book_id, ofmt)) + self.iactions['Remove Books'].restore_format, book_id, ofmt), names=(ofmt, fmt)) def save_layout_state(self): for x in ('library', 'memory', 'card_a', 'card_b'): diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index 9ee56eca72..508d71fbe8 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -518,7 +518,9 @@ 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)) - d.container_diff(to_container or self.global_undo.previous_container, self.global_undo.current_container) + other = to_container or self.global_undo.previous_container + d.container_diff(other, self.global_undo.current_container, + names=(self.global_undo.label_for_container(other), self.global_undo.label_for_container(self.global_undo.current_container))) def compare_book(self): self.commit_all_editors_to_container() @@ -529,7 +531,8 @@ class Boss(QObject): with TemporaryDirectory('_compare') as tdir: other = _gc(path[0], tdir=tdir, tweak_mode=True) d = self.create_diff_dialog(revert_msg=None) - d.container_diff(other, c) + d.container_diff(other, c, + names=(_('Other book'), _('Current book'))) def revert_requested(self, container): self.commit_all_editors_to_container() diff --git a/src/calibre/gui2/tweak_book/diff/main.py b/src/calibre/gui2/tweak_book/diff/main.py index db9c33d3f6..05be8d3c5f 100644 --- a/src/calibre/gui2/tweak_book/diff/main.py +++ b/src/calibre/gui2/tweak_book/diff/main.py @@ -12,7 +12,7 @@ from functools import partial from PyQt4.Qt import ( QGridLayout, QToolButton, QIcon, QRadioButton, QMenu, QApplication, Qt, QSize, QWidget, QLabel, QStackedLayout, QPainter, QRect, QVBoxLayout, - QCursor, QEventLoop, QKeySequence, pyqtSignal, QTimer) + QCursor, QEventLoop, QKeySequence, pyqtSignal, QTimer, QHBoxLayout) from calibre.ebooks.oeb.polish.container import Container from calibre.ebooks.oeb.polish.utils import guess_type @@ -213,18 +213,18 @@ class Diff(Dialog): b.clicked.connect(partial(self.view.next_change, -1)) b.setToolTip(_('Go to previous change') + ' [p]') b.setText(_('&Previous change')), b.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - l.addWidget(b, r, l.columnCount(), 1, 1) + l.addWidget(b, r, 0) self.bn = b = QToolButton(self) b.setIcon(QIcon(I('forward.png'))) b.clicked.connect(partial(self.view.next_change, 1)) b.setToolTip(_('Go to next change') + ' [n]') b.setText(_('&Next change')), b.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - l.addWidget(b, r, l.columnCount(), 1, 1) + l.addWidget(b, r, 1) self.search = s = HistoryLineEdit2(self) s.initialize('diff_search_history') - l.addWidget(s, r, l.columnCount(), 1, 1) + l.addWidget(s, r, 2) s.setPlaceholderText(_('Search for text')) s.returnPressed.connect(partial(self.do_search, False)) self.sbn = b = QToolButton(self) @@ -232,19 +232,19 @@ class Diff(Dialog): b.clicked.connect(partial(self.do_search, False)) b.setToolTip(_('Find next match')) b.setText(_('Next &match')), b.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - l.addWidget(b, l.rowCount() - 1, l.columnCount(), 1, 1) + l.addWidget(b, r, 3) self.sbp = b = QToolButton(self) b.setIcon(QIcon(I('arrow-up.png'))) b.clicked.connect(partial(self.do_search, True)) b.setToolTip(_('Find previous match')) b.setText(_('P&revious match')), b.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) - l.addWidget(b, l.rowCount() - 1, l.columnCount(), 1, 1) + l.addWidget(b, r, 4) self.lb = b = QRadioButton(_('Left panel'), self) b.setToolTip(_('Perform search in the left panel')) - l.addWidget(b, l.rowCount() - 1, l.columnCount(), 1, 1) + l.addWidget(b, r, 5) self.rb = b = QRadioButton(_('Right panel'), self) b.setToolTip(_('Perform search in the right panel')) - l.addWidget(b, l.rowCount() - 1, l.columnCount(), 1, 1) + l.addWidget(b, r, 6) b.setChecked(True) self.pb = b = QToolButton(self) b.setIcon(QIcon(I('config.png'))) @@ -259,7 +259,12 @@ class Diff(Dialog): cm.addAction(_('Show all text'), partial(self.change_context, None)) m.addAction(_('Beautify files before comparing them'), partial(self.change_beautify, True)) m.addMenu(cm) - l.addWidget(b, l.rowCount() - 1, l.columnCount(), 1, 1) + l.addWidget(b, r, 7) + + self.hl = QHBoxLayout() + l.addLayout(self.hl, l.rowCount(), 0, 1, -1) + self.names = QLabel('') + self.hl.addWidget(self.names, r) self.bb.setStandardButtons(self.bb.Close) if self.revert_button_msg is not None: @@ -267,7 +272,7 @@ class Diff(Dialog): 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) + self.hl.addWidget(self.bb, r) self.view.setFocus(Qt.OtherFocusReason) @@ -318,14 +323,22 @@ class Diff(Dialog): self.stacks.setCurrentIndex(1) QApplication.restoreOverrideCursor() - def ebook_diff(self, path1, path2): + def set_names(self, names): + if isinstance(names, tuple): + self.names.setText('%s <--> %s' % names) + else: + self.names.setText('') + + def ebook_diff(self, path1, path2, names=None): + self.set_names(names) with self: identical = self.apply_diff(_('The books are identical'), *ebook_diff(path1, path2)) self.view.finalize() if identical: self.reject() - def container_diff(self, left, right, identical_msg=None): + def container_diff(self, left, right, identical_msg=None, names=None): + self.set_names(names) with self: identical = self.apply_diff(identical_msg or _('No changes found'), *container_diff(left, right)) self.view.finalize() @@ -399,11 +412,11 @@ class Diff(Dialog): return return Dialog.keyPressEvent(self, ev) -def compare_books(path1, path2, revert_msg=None, revert_callback=None, parent=None): +def compare_books(path1, path2, revert_msg=None, revert_callback=None, parent=None, names=None): d = Diff(parent=parent, revert_button_msg=revert_msg) if revert_msg is not None: d.revert_requested.connect(revert_callback) - QTimer.singleShot(0, partial(d.ebook_diff, path1, path2)) + QTimer.singleShot(0, partial(d.ebook_diff, path1, path2, names=names)) d.exec_() try: d.revert_requested.disconnect() diff --git a/src/calibre/gui2/tweak_book/undo.py b/src/calibre/gui2/tweak_book/undo.py index c7269f0cf3..208172ffad 100644 --- a/src/calibre/gui2/tweak_book/undo.py +++ b/src/calibre/gui2/tweak_book/undo.py @@ -43,15 +43,7 @@ class GlobalUndoHistory(QAbstractListModel): def data(self, index, role=Qt.DisplayRole): if role == Qt.DisplayRole: - row = index.row() - msg = self.states[row].message - if self.pos == row: - msg = _('Current state') - elif not msg: - msg = _('[Unnamed state]') - else: - msg = _('Before %s') % msg - return QVariant(msg) + return QVariant(self.label_for_row(index.row())) if role == Qt.FontRole and index.row() == self.pos: f = QApplication.instance().font() f.setBold(True) @@ -60,6 +52,21 @@ class GlobalUndoHistory(QAbstractListModel): return QVariant(self.states[index.row()]) return NONE + def label_for_row(self, row): + msg = self.states[row].message + if self.pos == row: + msg = _('Current state') + elif not msg: + msg = _('[Unnamed state]') + else: + msg = _('Before %s') % msg + return msg + + def label_for_container(self, container): + for i, state in enumerate(self.states): + if state.container is container: + return self.label_for_row(i) + @property def current_container(self): return self.states[self.pos].container