From da72ffd1fd727be8d31884e231ff3e431f6f77f2 Mon Sep 17 00:00:00 2001 From: Andrew Senetar Date: Tue, 24 Aug 2021 03:52:43 -0500 Subject: [PATCH] Add ability to use non-native dialog for directories - Add preference for native dialogs - Add non-native directory selection to allow selecting multiple folders fixes #874 when using non-native. --- qt/directories_dialog.py | 24 ++++++++++++++++++------ qt/preferences.py | 3 +++ qt/preferences_dialog.py | 12 ++++++++++++ 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/qt/directories_dialog.py b/qt/directories_dialog.py index efa7ed50..07b9a276 100644 --- a/qt/directories_dialog.py +++ b/qt/directories_dialog.py @@ -6,6 +6,7 @@ from PyQt5.QtCore import QRect, Qt from PyQt5.QtWidgets import ( + QListView, QWidget, QFileDialog, QHeaderView, @@ -285,14 +286,25 @@ class DirectoriesDialog(QMainWindow): # --- Events def addFolderTriggered(self): + no_native = not self.app.prefs.use_native_dialogs title = tr("Select a folder to add to the scanning list") - flags = QFileDialog.ShowDirsOnly - dirpath = str(QFileDialog.getExistingDirectory(self, title, self.lastAddedFolder, flags)) - if not dirpath: + file_dialog = QFileDialog(self, title, self.lastAddedFolder) + file_dialog.setFileMode(QFileDialog.DirectoryOnly) + file_dialog.setOption(QFileDialog.DontUseNativeDialog, no_native) + if no_native: + file_view = file_dialog.findChild(QListView, "listView") + if file_view: + file_view.setSelectionMode(QAbstractItemView.MultiSelection) + f_tree_view = file_dialog.findChild(QTreeView) + if f_tree_view: + f_tree_view.setSelectionMode(QAbstractItemView.MultiSelection) + if not file_dialog.exec(): return - self.lastAddedFolder = dirpath - self.app.model.add_directory(dirpath) - self.recentFolders.insertItem(dirpath) + + paths = file_dialog.selectedFiles() + self.lastAddedFolder = paths[-1] + [self.app.model.add_directory(path) for path in paths] + [self.recentFolders.insertItem(path) for path in paths] def appModeButtonSelected(self, index): if index == 2: diff --git a/qt/preferences.py b/qt/preferences.py index 2ad7e63f..eb57eaac 100644 --- a/qt/preferences.py +++ b/qt/preferences.py @@ -30,6 +30,7 @@ class Preferences(PreferencesBase): if not self.language and trans.installed_lang: self.language = trans.installed_lang self.portable = get("Portable", False) + self.use_native_dialogs = get("UseNativeDialogs", True) self.tableFontSize = get("TableFontSize", self.tableFontSize) self.reference_bold_font = get("ReferenceBoldFont", self.reference_bold_font) @@ -92,6 +93,7 @@ class Preferences(PreferencesBase): self.destination_type = 1 self.custom_command = "" self.language = trans.installed_lang if trans.installed_lang else "" + self.use_native_dialogs = True self.tableFontSize = QApplication.font().pointSize() self.reference_bold_font = True @@ -140,6 +142,7 @@ class Preferences(PreferencesBase): set_("CustomCommand", self.custom_command) set_("Language", self.language) set_("Portable", self.portable) + set_("UseNativeDialogs", self.use_native_dialogs) set_("TableFontSize", self.tableFontSize) set_("ReferenceBoldFont", self.reference_bold_font) diff --git a/qt/preferences_dialog.py b/qt/preferences_dialog.py index 8cc83f09..066c6553 100644 --- a/qt/preferences_dialog.py +++ b/qt/preferences_dialog.py @@ -158,6 +158,16 @@ On MacOS, the tab bar will fill up the window's width instead." ) ) layout.addWidget(self.tabs_default_pos) + self._setupAddCheckbox( + "use_native_dialogs", + tr("Use native OS dialogs"), + ) + self.use_native_dialogs.setToolTip( + tr( + "For actions such as file/folder selection use the OS native dialogs.\nSome native dialogs have limited functionality." + ) + ) + layout.addWidget(self.use_native_dialogs) self.ui_groupbox.setLayout(layout) self.displayVLayout.addWidget(self.ui_groupbox) @@ -286,6 +296,7 @@ use the modifier key to drag the floating window around" if section & Sections.DISPLAY: setchecked(self.reference_bold_font, prefs.reference_bold_font) setchecked(self.tabs_default_pos, prefs.tabs_default_pos) + setchecked(self.use_native_dialogs, prefs.use_native_dialogs) setchecked( self.details_dialog_titlebar_enabled, prefs.details_dialog_titlebar_enabled, @@ -329,6 +340,7 @@ use the modifier key to drag the floating window around" prefs.custom_command = str(self.customCommandEdit.text()) prefs.tableFontSize = self.fontSizeSpinBox.value() prefs.tabs_default_pos = ischecked(self.tabs_default_pos) + prefs.use_native_dialogs = ischecked(self.use_native_dialogs) lang = self.supportedLanguages[self.languageComboBox.currentIndex()] oldlang = self.app.prefs.language if oldlang not in self.supportedLanguages: