From b45c38726036ce5ddfc4ef3379d71bd239c5d3df Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 22 Sep 2022 20:40:20 +0530 Subject: [PATCH] Edit book: File list: Fix pressing Tab key while renaming a file not working --- src/calibre/gui2/tweak_book/file_list.py | 28 +++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/tweak_book/file_list.py b/src/calibre/gui2/tweak_book/file_list.py index 6ec866c818..0777801f5b 100644 --- a/src/calibre/gui2/tweak_book/file_list.py +++ b/src/calibre/gui2/tweak_book/file_list.py @@ -7,7 +7,7 @@ import posixpath import sys import textwrap from collections import Counter, OrderedDict, defaultdict -from functools import partial, lru_cache +from functools import lru_cache, partial from gettext import pgettext from qt.core import ( QAbstractItemView, QApplication, QCheckBox, QDialog, QDialogButtonBox, QFont, @@ -19,7 +19,6 @@ from qt.core import ( from calibre import human_readable, sanitize_file_name from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES -from calibre.ebooks.oeb.polish.utils import OEB_FONTS, guess_type from calibre.ebooks.oeb.polish.cover import ( get_cover_page_name, get_raster_cover_name, is_raster_image ) @@ -27,6 +26,7 @@ from calibre.ebooks.oeb.polish.css import add_stylesheet_links from calibre.ebooks.oeb.polish.replace import ( get_recommended_folders, get_spine_order_for_all_files ) +from calibre.ebooks.oeb.polish.utils import OEB_FONTS, guess_type from calibre.gui2 import ( choose_dir, choose_files, choose_save_file, elided_text, error_dialog, make_view_use_window_background, question_dialog @@ -127,7 +127,7 @@ def get_bulk_rename_settings(parent, number, msg=None, sanitize=sanitize_file_na class ItemDelegate(QStyledItemDelegate): # {{{ - rename_requested = pyqtSignal(object, object) + rename_requested = pyqtSignal(object, object, object) def setEditorData(self, editor, index): name = str(index.data(NAME_ROLE) or '') @@ -152,7 +152,7 @@ class ItemDelegate(QStyledItemDelegate): # {{{ newname = str(editor.text()) oldname = str(index.data(NAME_ROLE) or '') if newname != oldname: - self.rename_requested.emit(oldname, newname) + self.rename_requested.emit(index, oldname, newname) def sizeHint(self, option, index): ans = QStyledItemDelegate.sizeHint(self, option, index) @@ -244,13 +244,14 @@ class FileList(QTreeWidget, OpenWithHandler): def __init__(self, parent=None): QTreeWidget.__init__(self, parent) + self.pending_renames = {} make_view_use_window_background(self) self.categories = {} self.ordered_selected_indexes = False set_no_activate_on_click(self) self.current_edited_name = None self.delegate = ItemDelegate(self) - self.delegate.rename_requested.connect(self.rename_requested) + self.delegate.rename_requested.connect(self.possible_rename_requested, type=Qt.ConnectionType.QueuedConnection) self.setTextElideMode(Qt.TextElideMode.ElideMiddle) self.setItemDelegate(self.delegate) self.setIconSize(QSize(16, 16)) @@ -284,6 +285,23 @@ class FileList(QTreeWidget, OpenWithHandler): })} self.itemActivated.connect(self.item_double_clicked) + def possible_rename_requested(self, index, old, new): + self.pending_renames[old] = new + QTimer.singleShot(10, self.dispatch_pending_renames) + item = self.itemFromIndex(index) + item.setText(0, new) + + def dispatch_pending_renames(self): + if self.state() != QAbstractItemView.State.EditingState: + pr, self.pending_renames = self.pending_renames, {} + if len(pr) == 1: + old, new = tuple(pr.items())[0] + self.rename_requested.emit(old, new) + else: + self.bulk_rename_requested.emit(pr) + else: + QTimer.singleShot(10, self.dispatch_pending_renames) + def mimeTypes(self): ans = QTreeWidget.mimeTypes(self) ans.append(CONTAINER_DND_MIMETYPE)