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)

This commit is contained in:
Kovid Goyal 2017-01-01 16:25:55 +05:30
parent 9d37292fe5
commit 337f28f5bc
2 changed files with 23 additions and 4 deletions

View File

@ -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 {{{

View File

@ -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)