From 171e5f19e581cb8a04493e5c8bed3c7f9a06cf5a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 29 Nov 2021 11:27:28 +0530 Subject: [PATCH] Add books dialog: When a non-book file type is added the next time the dialog is used, preselect the "All files" filter. Fixes #1952562 [Update default selection filter for manual format adds via GUI](https://bugs.launchpad.net/calibre/+bug/1952562) --- src/calibre/gui2/__init__.py | 20 ++++++++++++++++++++ src/calibre/gui2/actions/add.py | 8 ++++---- src/calibre/gui2/linux_file_dialogs.py | 10 ++++++++-- src/calibre/gui2/qt_file_dialogs.py | 7 +++++-- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 895b0ba5ca..52baced5e2 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -688,6 +688,26 @@ else: choose_files, choose_images, choose_dir, choose_save_file +def choose_files_and_remember_all_files( + window, name, title, filters=[], select_only_single_file=False, default_dir='~' +): + pref_name = f'{name}-last-used-filter-spec-all-files' + lufs = dynamic.get(pref_name, False) + af = _('All files'), ['*'] + filters = list(filters) + filters.insert(0, af) if lufs else filters.append(af) + paths = choose_files(window, name, title, list(filters), False, select_only_single_file, default_dir) + if paths: + ext = paths[0].rpartition(os.extsep)[-1].lower() + used_all_files = True + for i, (name, exts) in enumerate(filters): + if ext in exts: + used_all_files = False + break + dynamic.set(pref_name, used_all_files) + return paths + + def is_dark_theme(): pal = QApplication.instance().palette() col = pal.color(QPalette.ColorRole.Window) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 59966e4384..2f910066e3 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -16,8 +16,8 @@ from calibre.constants import iswindows from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata import MetaInformation, normalize_isbn from calibre.gui2 import ( - choose_dir, choose_files, error_dialog, gprefs, info_dialog, question_dialog, - warning_dialog + choose_dir, choose_files, choose_files_and_remember_all_files, error_dialog, + gprefs, info_dialog, question_dialog, warning_dialog ) from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.add_empty_book import AddEmptyBookDialog @@ -139,7 +139,7 @@ class AddAction(InterfaceAction): ids = self._check_add_formats_ok() if not ids: return - books = choose_files(self.gui, 'add formats dialog dir', + books = choose_files_and_remember_all_files(self.gui, 'add formats dialog dir', _('Select book files'), filters=get_filters()) if books: self._add_formats(books, ids) @@ -529,7 +529,7 @@ class AddAction(InterfaceAction): fmts = self.gui.device_manager.device.settings().format_map filters = [(_('Supported books'), fmts)] - books = choose_files(self.gui, 'add books dialog dir', + books = choose_files_and_remember_all_files(self.gui, 'add books dialog dir', _('Select books'), filters=filters) if not books: return diff --git a/src/calibre/gui2/linux_file_dialogs.py b/src/calibre/gui2/linux_file_dialogs.py index 41572648d7..90bdd6caff 100644 --- a/src/calibre/gui2/linux_file_dialogs.py +++ b/src/calibre/gui2/linux_file_dialogs.py @@ -163,7 +163,10 @@ def kdialog_choose_dir(window, name, title, default_dir='~', no_save_dir=False): def kdialog_filters(filters, all_files=True): ans = [] for name, exts in filters: - ans.append('{} ({})'.format(name, ' '.join('*.' + x for x in exts))) + if not exts or (len(exts) == 1 and exts[0] == '*'): + ans.append(name + ' (*)') + else: + ans.append('{} ({})'.format(name, ' '.join('*.' + x for x in exts))) if all_files: ans.append(_('All files') + ' (*)') return '\n'.join(ans) @@ -240,7 +243,10 @@ def zenity_choose_dir(window, name, title, default_dir='~', no_save_dir=False): def zenity_filters(filters, all_files=True): ans = [] for name, exts in filters: - ans.append('--file-filter={} | {}'.format(name, ' '.join('*.' + x for x in exts))) + if not exts or (len(exts) == 1 and exts[0] == '*'): + ans.append('--file-filter={} | {}'.format(name, '*')) + else: + ans.append('--file-filter={} | {}'.format(name, ' '.join('*.' + x for x in exts))) if all_files: ans.append('--file-filter={} | {}'.format(_('All files'), '*')) return ans diff --git a/src/calibre/gui2/qt_file_dialogs.py b/src/calibre/gui2/qt_file_dialogs.py index 6026fcb1a0..08bf20a95b 100644 --- a/src/calibre/gui2/qt_file_dialogs.py +++ b/src/calibre/gui2/qt_file_dialogs.py @@ -56,8 +56,11 @@ class FileDialog(QObject): if filters: for filter in filters: text, extensions = filter - extensions = ['*'+(i if i.startswith('.') else '.'+i) for i in - extensions] + if not extensions or (len(extensions) == 1 and extensions[0] == '*'): + extensions = ['*'] + else: + extensions = ['*'+(i if i.startswith('.') else '.'+i) for i in + extensions] etext = '%s (%s);;'%(text, ' '.join(extensions)) if len(etext) > 72: has_long_filter = True