diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index e2bcd70b80..e68878b4c0 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -792,6 +792,7 @@ class Boss(QObject): def rename_done(self, name_map, job, from_filelist=None): if job.traceback is not None: + self.gui.file_list.restore_temp_names() return error_dialog(self.gui, _('Failed to rename files'), _('Failed to rename files, click "Show details" for more information.'), det_msg=job.traceback, show=True) diff --git a/src/calibre/gui2/tweak_book/file_list.py b/src/calibre/gui2/tweak_book/file_list.py index d33049e59e..6c07e29ce4 100644 --- a/src/calibre/gui2/tweak_book/file_list.py +++ b/src/calibre/gui2/tweak_book/file_list.py @@ -48,6 +48,7 @@ NAME_ROLE = Qt.ItemDataRole.UserRole CATEGORY_ROLE = NAME_ROLE + 1 LINEAR_ROLE = CATEGORY_ROLE + 1 MIME_ROLE = LINEAR_ROLE + 1 +TEMP_NAME_ROLE = MIME_ROLE + 1 NBSP = '\xa0' @@ -290,8 +291,16 @@ class FileList(QTreeWidget, OpenWithHandler): self.pending_renames[old] = new QTimer.singleShot(10, self.dispatch_pending_renames) item = self.itemFromIndex(index) + item.setData(0, TEMP_NAME_ROLE, item.text(0)) item.setText(0, new) + def restore_temp_names(self): + for item in self.all_files: + q = item.data(0, TEMP_NAME_ROLE) + if q: + item.setText(0, q) + item.setData(0, TEMP_NAME_ROLE, None) + def dispatch_pending_renames(self): if self.pending_renames: if self.state() != QAbstractItemView.State.EditingState: @@ -301,7 +310,7 @@ class FileList(QTreeWidget, OpenWithHandler): self.rename_requested.emit(old, new) else: ur = {} - seen_vals = set() + seen_vals = {c.data(0, NAME_ROLE) or '' for c in self.all_files} for k, v in pr.items(): if v not in seen_vals: seen_vals.add(v) @@ -409,24 +418,22 @@ class FileList(QTreeWidget, OpenWithHandler): return c def select_name(self, name, set_as_current_index=False): - for parent in self.categories.values(): - for c in (parent.child(i) for i in range(parent.childCount())): - q = str(c.data(0, NAME_ROLE) or '') - c.setSelected(q == name) - if q == name: - self.scrollToItem(c) - if set_as_current_index: - self.setCurrentItem(c) + for c in self.all_files: + q = str(c.data(0, NAME_ROLE) or '') + c.setSelected(q == name) + if q == name: + self.scrollToItem(c) + if set_as_current_index: + self.setCurrentItem(c) def select_names(self, names, current_name=None): - for parent in self.categories.values(): - for c in (parent.child(i) for i in range(parent.childCount())): - q = str(c.data(0, NAME_ROLE) or '') - c.setSelected(q in names) - if q == current_name: - self.scrollToItem(c) - s = self.selectionModel() - s.setCurrentIndex(self.indexFromItem(c), QItemSelectionModel.SelectionFlag.NoUpdate) + for c in self.all_files: + q = str(c.data(0, NAME_ROLE) or '') + c.setSelected(q in names) + if q == current_name: + self.scrollToItem(c) + s = self.selectionModel() + s.setCurrentIndex(self.indexFromItem(c), QItemSelectionModel.SelectionFlag.NoUpdate) def mark_name_as_current(self, name): current = self.item_from_name(name) @@ -1195,6 +1202,9 @@ class FileListWidget(QWidget): def build(self, container, preserve_state=True): self.file_list.build(container, preserve_state=preserve_state) + def restore_temp_names(self): + self.file_list.restore_temp_names() + @property def searchable_names(self): return self.file_list.searchable_names