Also discard duplicates from batched rename matching existing file names

This commit is contained in:
Kovid Goyal 2022-09-22 23:06:51 +05:30
parent a8caf05566
commit 8466f81072
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 28 additions and 17 deletions

View File

@ -792,6 +792,7 @@ class Boss(QObject):
def rename_done(self, name_map, job, from_filelist=None): def rename_done(self, name_map, job, from_filelist=None):
if job.traceback is not None: if job.traceback is not None:
self.gui.file_list.restore_temp_names()
return error_dialog(self.gui, _('Failed to rename files'), return error_dialog(self.gui, _('Failed to rename files'),
_('Failed to rename files, click "Show details" for more information.'), _('Failed to rename files, click "Show details" for more information.'),
det_msg=job.traceback, show=True) det_msg=job.traceback, show=True)

View File

@ -48,6 +48,7 @@ NAME_ROLE = Qt.ItemDataRole.UserRole
CATEGORY_ROLE = NAME_ROLE + 1 CATEGORY_ROLE = NAME_ROLE + 1
LINEAR_ROLE = CATEGORY_ROLE + 1 LINEAR_ROLE = CATEGORY_ROLE + 1
MIME_ROLE = LINEAR_ROLE + 1 MIME_ROLE = LINEAR_ROLE + 1
TEMP_NAME_ROLE = MIME_ROLE + 1
NBSP = '\xa0' NBSP = '\xa0'
@ -290,8 +291,16 @@ class FileList(QTreeWidget, OpenWithHandler):
self.pending_renames[old] = new self.pending_renames[old] = new
QTimer.singleShot(10, self.dispatch_pending_renames) QTimer.singleShot(10, self.dispatch_pending_renames)
item = self.itemFromIndex(index) item = self.itemFromIndex(index)
item.setData(0, TEMP_NAME_ROLE, item.text(0))
item.setText(0, new) 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): def dispatch_pending_renames(self):
if self.pending_renames: if self.pending_renames:
if self.state() != QAbstractItemView.State.EditingState: if self.state() != QAbstractItemView.State.EditingState:
@ -301,7 +310,7 @@ class FileList(QTreeWidget, OpenWithHandler):
self.rename_requested.emit(old, new) self.rename_requested.emit(old, new)
else: else:
ur = {} ur = {}
seen_vals = set() seen_vals = {c.data(0, NAME_ROLE) or '' for c in self.all_files}
for k, v in pr.items(): for k, v in pr.items():
if v not in seen_vals: if v not in seen_vals:
seen_vals.add(v) seen_vals.add(v)
@ -409,24 +418,22 @@ class FileList(QTreeWidget, OpenWithHandler):
return c return c
def select_name(self, name, set_as_current_index=False): def select_name(self, name, set_as_current_index=False):
for parent in self.categories.values(): for c in self.all_files:
for c in (parent.child(i) for i in range(parent.childCount())): q = str(c.data(0, NAME_ROLE) or '')
q = str(c.data(0, NAME_ROLE) or '') c.setSelected(q == name)
c.setSelected(q == name) if q == name:
if q == name: self.scrollToItem(c)
self.scrollToItem(c) if set_as_current_index:
if set_as_current_index: self.setCurrentItem(c)
self.setCurrentItem(c)
def select_names(self, names, current_name=None): def select_names(self, names, current_name=None):
for parent in self.categories.values(): for c in self.all_files:
for c in (parent.child(i) for i in range(parent.childCount())): q = str(c.data(0, NAME_ROLE) or '')
q = str(c.data(0, NAME_ROLE) or '') c.setSelected(q in names)
c.setSelected(q in names) if q == current_name:
if q == current_name: self.scrollToItem(c)
self.scrollToItem(c) s = self.selectionModel()
s = self.selectionModel() s.setCurrentIndex(self.indexFromItem(c), QItemSelectionModel.SelectionFlag.NoUpdate)
s.setCurrentIndex(self.indexFromItem(c), QItemSelectionModel.SelectionFlag.NoUpdate)
def mark_name_as_current(self, name): def mark_name_as_current(self, name):
current = self.item_from_name(name) current = self.item_from_name(name)
@ -1195,6 +1202,9 @@ class FileListWidget(QWidget):
def build(self, container, preserve_state=True): def build(self, container, preserve_state=True):
self.file_list.build(container, preserve_state=preserve_state) self.file_list.build(container, preserve_state=preserve_state)
def restore_temp_names(self):
self.file_list.restore_temp_names()
@property @property
def searchable_names(self): def searchable_names(self):
return self.file_list.searchable_names return self.file_list.searchable_names