diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 3f053e5223..c3ceb27e7e 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -17,6 +17,7 @@ from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.tag_list_editor import TagListEditor from calibre.gui2.actions import InterfaceAction from calibre.utils.icu import sort_key +from calibre.utils.config import test_eight_code class EditMetadataAction(InterfaceAction): @@ -133,8 +134,6 @@ class EditMetadataAction(InterfaceAction): row_list = [r.row() for r in rows] current_row = 0 - changed = set([]) - db = self.gui.library_view.model().db if len(row_list) == 1: cr = row_list[0] @@ -142,6 +141,24 @@ class EditMetadataAction(InterfaceAction): list(range(self.gui.library_view.model().rowCount(QModelIndex()))) current_row = row_list.index(cr) + if test_eight_code: + changed = self.do_edit_metadata(row_list, current_row) + else: + changed = self.do_edit_metadata_old(row_list, current_row) + + if changed: + self.gui.library_view.model().refresh_ids(list(changed)) + current = self.gui.library_view.currentIndex() + m = self.gui.library_view.model() + if self.gui.cover_flow: + self.gui.cover_flow.dataChanged() + m.current_changed(current, previous) + self.gui.tags_view.recount() + + def do_edit_metadata_old(self, row_list, current_row): + changed = set([]) + db = self.gui.library_view.model().db + while True: prev = next_ = None if current_row > 0: @@ -167,15 +184,28 @@ class EditMetadataAction(InterfaceAction): self.gui.library_view.set_current_row(current_row) self.gui.library_view.scroll_to_row(current_row) + def do_edit_metadata(self, row_list, current_row): + from calibre.gui2.metadata.single import edit_metadata + db = self.gui.library_view.model().db + changed, rows_to_refresh = edit_metadata(db, row_list, current_row, + parent=self.gui, view_slot=self.view_format_callback, + set_current_callback=self.set_current_callback) + return changed + + def set_current_callback(self, id_): + db = self.gui.library_view.model().db + current_row = db.row(id_) + self.gui.library_view.set_current_row(current_row) + self.gui.library_view.scroll_to_row(current_row) + + def view_format_callback(self, id_, fmt): + view = self.gui.iactions['View'] + if id_ is None: + view._view_file(fmt) + else: + db = self.gui.library_view.model().db + view.view_format(db.row(id_), fmt) - if changed: - self.gui.library_view.model().refresh_ids(list(changed)) - current = self.gui.library_view.currentIndex() - m = self.gui.library_view.model() - if self.gui.cover_flow: - self.gui.cover_flow.dataChanged() - m.current_changed(current, previous) - self.gui.tags_view.recount() def edit_bulk_metadata(self, checked): ''' diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index bab9073588..0b7d96c07c 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -428,7 +428,7 @@ class Format(QListWidgetItem): # {{{ if timestamp is not None: ts = timestamp.astimezone(local_tz) t = strftime('%a, %d %b %Y [%H:%M:%S]', ts.timetuple()) - text = _('Last modified: %s')%t + text = _('Last modified: %s\n\nDouble click to view')%t self.setToolTip(text) self.setStatusTip(text) @@ -577,8 +577,7 @@ class FormatsManager(QWidget): # {{{ self.changed = True def show_format(self, item, *args): - fmt = item.ext - self.dialog.view_format.emit(fmt) + self.dialog.do_view_format.emit(item.path, item.ext) def get_selected_format_metadata(self, db, id_): old = prefs['read_file_metadata'] diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 70307eb3b1..bba8528573 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -26,7 +26,7 @@ from calibre.utils.config import tweaks class MetadataSingleDialogBase(ResizableDialog): - view_format = pyqtSignal(object) + view_format = pyqtSignal(object, object) cc_two_column = tweaks['metadata_single_use_2_cols_for_custom_fields'] one_line_comments_toolbar = False @@ -194,6 +194,13 @@ class MetadataSingleDialogBase(ResizableDialog): pass # Do something # }}} + def do_view_format(self, path, fmt): + if path: + self.view_format.emit(None, path) + else: + self.view_format.emit(self.book_id, fmt) + + def do_layout(self): raise NotImplementedError() @@ -204,6 +211,8 @@ class MetadataSingleDialogBase(ResizableDialog): widget.initialize(self.db, id_) for widget in getattr(self, 'custom_metadata_widgets', []): widget.initialize(id_) + if callable(self.set_current_callback): + self.set_current_callback(id_) # Commented out as it doesn't play nice with Next, Prev buttons #self.fetch_metadata_button.setFocus(Qt.OtherFocusReason) @@ -339,11 +348,13 @@ class MetadataSingleDialogBase(ResizableDialog): gprefs['metasingle_window_geometry3'] = bytearray(self.saveGeometry()) # Dialog use methods {{{ - def start(self, row_list, current_row, view_slot=None): + def start(self, row_list, current_row, view_slot=None, + set_current_callback=None): self.row_list = row_list self.current_row = current_row if view_slot is not None: self.view_format.connect(view_slot) + self.set_current_callback = set_current_callback self.do_one(apply_changes=False) ret = self.exec_() self.break_cycles() @@ -375,6 +386,7 @@ class MetadataSingleDialogBase(ResizableDialog): def break_cycles(self): # Break any reference cycles that could prevent python # from garbage collecting this dialog + self.set_current_callback = None def disconnect(signal): try: signal.disconnect() @@ -643,9 +655,11 @@ class MetadataSingleDialogAlt(MetadataSingleDialogBase): # {{{ # }}} -def edit_metadata(db, row_list, current_row, parent=None, view_slot=None): +def edit_metadata(db, row_list, current_row, parent=None, view_slot=None, + set_current_callback=None): d = MetadataSingleDialog(db, parent) - d.start(row_list, current_row, view_slot=view_slot) + d.start(row_list, current_row, view_slot=view_slot, + set_current_callback=set_current_callback) return d.changed, d.rows_to_refresh if __name__ == '__main__':