From 337f28f5bc0cd67eb104ba022e224ee00e3c23ba Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 1 Jan 2017 16:25:55 +0530 Subject: [PATCH] Edit Book: Ensure keyboard focus stays with Files Browser when renaming files. Fixes #1653311 [ebook editor / Files Browser loses focus after operation](https://bugs.launchpad.net/calibre/+bug/1653311) --- src/calibre/gui2/tweak_book/boss.py | 11 ++++++++--- src/calibre/gui2/tweak_book/file_list.py | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index 651745de01..1f7fd2aafa 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -660,16 +660,16 @@ class Boss(QObject): self.add_savepoint(_('Before: Rename %s') % oldname) name_map = {oldname:newname} self.gui.blocking_job( - 'rename_file', _('Renaming and updating links...'), partial(self.rename_done, name_map), + 'rename_file', _('Renaming and updating links...'), partial(self.rename_done, name_map, from_filelist=self.gui.file_list.current_name), rename_files, current_container(), name_map) def bulk_rename_requested(self, name_map): self.add_savepoint(_('Before: Bulk rename')) self.gui.blocking_job( - 'bulk_rename_files', _('Renaming and updating links...'), partial(self.rename_done, name_map), + 'bulk_rename_files', _('Renaming and updating links...'), partial(self.rename_done, name_map, from_filelist=self.gui.file_list.current_name), rename_files, current_container(), name_map) - def rename_done(self, name_map, job): + def rename_done(self, name_map, job, from_filelist=None): if job.traceback is not None: return error_dialog(self.gui, _('Failed to rename files'), _('Failed to rename files, click Show details for more information.'), @@ -684,6 +684,11 @@ class Boss(QObject): if self.gui.preview.current_name == oldname: self.gui.preview.current_name = newname self.apply_container_update_to_gui() + if from_filelist: + if from_filelist in name_map: + self.gui.file_list.select_name(name_map[from_filelist], set_as_current_index=True) + self.gui.file_list.file_list.setFocus(Qt.PopupFocusReason) + # }}} # Global history {{{ diff --git a/src/calibre/gui2/tweak_book/file_list.py b/src/calibre/gui2/tweak_book/file_list.py index 13477364b5..5e18fbc914 100644 --- a/src/calibre/gui2/tweak_book/file_list.py +++ b/src/calibre/gui2/tweak_book/file_list.py @@ -210,6 +210,13 @@ class FileList(QTreeWidget): }.iteritems()} self.itemActivated.connect(self.item_double_clicked) + @property + def current_name(self): + ci = self.currentItem() + if ci is not None: + return unicode(ci.data(0, NAME_ROLE) or '') + return '' + def get_state(self): s = {'pos':self.verticalScrollBar().value()} s['expanded'] = {c for c, item in self.categories.iteritems() if item.isExpanded()} @@ -233,13 +240,15 @@ class FileList(QTreeWidget): if q == name: return c - def select_name(self, name): + def select_name(self, name, set_as_current_index=False): for parent in self.categories.itervalues(): for c in (parent.child(i) for i in xrange(parent.childCount())): q = unicode(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 mark_name_as_current(self, name): current = self.item_from_name(name) @@ -893,6 +902,7 @@ class FileListWidget(QWidget): self.forwarded_signals = {k for k, o in vars(self.file_list.__class__).iteritems() if isinstance(o, pyqtSignal) and '_' in k and not hasattr(self, k)} for x in ('delete_done', 'select_name', 'request_edit', 'mark_name_as_current', 'clear_currently_edited_name'): setattr(self, x, getattr(self.file_list, x)) + self.setFocusProxy(self.file_list) def build(self, container, preserve_state=True): self.file_list.build(container, preserve_state=preserve_state) @@ -901,6 +911,10 @@ class FileListWidget(QWidget): def searchable_names(self): return self.file_list.searchable_names + @property + def current_name(self): + return self.file_list.current_name + def __getattr__(self, name): if name in self.forwarded_signals: return getattr(self.file_list, name)