vcl/inc/qt5/Qt5FilePicker.hxx | 2 + vcl/qt5/Qt5FilePicker.cxx | 18 +++++++--- vcl/unx/kde5/KDE5FilePicker.hxx | 7 --- vcl/unx/kde5/KDE5FilePicker2.cxx | 70 ++++++++++++--------------------------- 4 files changed, 37 insertions(+), 60 deletions(-)
New commits: commit 0e4963186a6f1bfbde5279c25c62694d073e92a1 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Tue Feb 5 13:43:20 2019 +0100 Commit: Katarina Behrens <katarina.behr...@cib.de> CommitDate: Wed Feb 20 16:42:12 2019 +0100 qt5/kde5: Reuse QFileDialog from Qt5Filepicker in kde5 Drop the '_dialog' member from KDE5FileDialog and use the one from Qt5FileDialog instead. Move up 'm_bIsFolderPicker' to Qt5FilePicker. Also, move some of the related functionality from the kde5 file picker to the qt5 one, in particular take over missing parts from 'KDE5FilePicker::setMultiSelectionMode' to 'Qt5FilePicker::setMultiSelectionMode' and drop the former (now inherited from the base class). This e.g. also makes sure that only folders are available for selection when using a FolderPicker in qt5 (e.g. in the dialog to add a JRE in "Tools" -> "Options" -> "Advanced"). The functionality had only been implemented for kde5 beforehand. Since the QFileDialog is set to non-native mode in Qt5FilePicker constructor, native mode needs to be excplicitly enabled again for kde5. Since Qt's signal/slot mechanism is used to connect signals on the object in both constructors (Qt5FilePicker/KDE5FilePicker), some events will trigger multiple actions. This will be taken care of in subsequent commits, along with further refactoring. Change-Id: I245d46c12945acb91c9b52dcff5c83248ac087dd Reviewed-on: https://gerrit.libreoffice.org/68042 Tested-by: Jenkins Reviewed-by: Katarina Behrens <katarina.behr...@cib.de> diff --git a/vcl/inc/qt5/Qt5FilePicker.hxx b/vcl/inc/qt5/Qt5FilePicker.hxx index e40d4c491263..1be97275ceb9 100644 --- a/vcl/inc/qt5/Qt5FilePicker.hxx +++ b/vcl/inc/qt5/Qt5FilePicker.hxx @@ -75,6 +75,8 @@ protected: QLabel* m_pFilterLabel; ///< label to display the filter QHash<sal_Int16, QWidget*> m_aCustomWidgetsMap; ///< map of SAL control ID's to widget + bool m_bIsFolderPicker; + public: explicit Qt5FilePicker(QFileDialog::FileMode); virtual ~Qt5FilePicker() override; diff --git a/vcl/qt5/Qt5FilePicker.cxx b/vcl/qt5/Qt5FilePicker.cxx index 6db64b3b0824..5a0abc2b8d48 100644 --- a/vcl/qt5/Qt5FilePicker.cxx +++ b/vcl/qt5/Qt5FilePicker.cxx @@ -78,12 +78,19 @@ uno::Sequence<OUString> FilePicker_getSupportedServiceNames() Qt5FilePicker::Qt5FilePicker(QFileDialog::FileMode eMode) : Qt5FilePicker_Base(m_aHelperMutex) - , m_pFileDialog(new QFileDialog()) + , m_pFileDialog(new QFileDialog(nullptr, {}, QDir::homePath())) + , m_bIsFolderPicker(eMode == QFileDialog::Directory) { m_pFileDialog->setOption(QFileDialog::DontUseNativeDialog); m_pFileDialog->setFileMode(eMode); m_pFileDialog->setWindowModality(Qt::ApplicationModal); + if (m_bIsFolderPicker) + { + m_pFileDialog->setOption(QFileDialog::ShowDirsOnly, true); + m_pFileDialog->setWindowTitle(toQString(VclResId(STR_FPICKER_FOLDER_DEFAULT_TITLE))); + } + m_pExtraControls = new QWidget(); m_pLayout = dynamic_cast<QGridLayout*>(m_pFileDialog->layout()); @@ -232,10 +239,11 @@ void SAL_CALL Qt5FilePicker::setMultiSelectionMode(sal_Bool multiSelect) return Q_EMIT setMultiSelectionModeSignal(multiSelect); } - if (multiSelect) - m_pFileDialog->setFileMode(QFileDialog::ExistingFiles); - else - m_pFileDialog->setFileMode(QFileDialog::ExistingFile); + if (m_bIsFolderPicker || m_pFileDialog->acceptMode() == QFileDialog::AcceptSave) + return; + + m_pFileDialog->setFileMode(multiSelect ? QFileDialog::ExistingFiles + : QFileDialog::ExistingFile); } void SAL_CALL Qt5FilePicker::setDefaultName(const OUString& name) diff --git a/vcl/unx/kde5/KDE5FilePicker.hxx b/vcl/unx/kde5/KDE5FilePicker.hxx index 6870a4d34da5..fb829c1ea6c6 100644 --- a/vcl/unx/kde5/KDE5FilePicker.hxx +++ b/vcl/unx/kde5/KDE5FilePicker.hxx @@ -54,9 +54,6 @@ protected: css::uno::Reference<css::ui::dialogs::XFilePickerListener> m_xListener; osl::Mutex _helperMutex; - //the dialog to display - QFileDialog* _dialog; - //running filter string to add to dialog QStringList _filters; // map of filter titles to full filter for selection @@ -75,7 +72,6 @@ protected: QGridLayout* _layout; bool allowRemoteUrls; - bool mbIsFolderPicker; public: explicit KDE5FilePicker(QFileDialog::FileMode); @@ -92,7 +88,6 @@ public: virtual sal_Int16 SAL_CALL execute() override; // XFilePicker functions - virtual void SAL_CALL setMultiSelectionMode(sal_Bool bMode) override; virtual void SAL_CALL setDefaultName(const OUString& rName) override; virtual void SAL_CALL setDisplayDirectory(const OUString& rDirectory) override; virtual OUString SAL_CALL getDisplayDirectory() override; @@ -186,7 +181,6 @@ Q_SIGNALS: OUString getCurrentFilterSignal(); css::uno::Sequence<OUString> getFilesSignal(); css::uno::Sequence<OUString> getSelectedFilesSignal(); - void setMultiSelectionSignal(bool bMulti); private Q_SLOTS: void setTitleSlot(const OUString& rTitle) { return setTitle(rTitle); } @@ -230,7 +224,6 @@ private Q_SLOTS: void setCurrentFilterSlot(const OUString& rFilter) { return setCurrentFilter(rFilter); } OUString getCurrentFilterSlot() { return getCurrentFilter(); } css::uno::Sequence<OUString> getSelectedFilesSlot() { return getFiles(); } - void setMultiSelectionSlot(bool bMulti) { return setMultiSelectionMode(bMulti); } }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde5/KDE5FilePicker2.cxx b/vcl/unx/kde5/KDE5FilePicker2.cxx index 748b0bbf3d27..398645c59dbb 100644 --- a/vcl/unx/kde5/KDE5FilePicker2.cxx +++ b/vcl/unx/kde5/KDE5FilePicker2.cxx @@ -83,13 +83,14 @@ uno::Sequence<OUString> FilePicker_getSupportedServiceNames() KDE5FilePicker::KDE5FilePicker(QFileDialog::FileMode eMode) : Qt5FilePicker(eMode) - , _dialog(new QFileDialog(nullptr, {}, QDir::homePath())) , _extraControls(new QWidget) , _layout(new QGridLayout(_extraControls)) , allowRemoteUrls(false) - , mbIsFolderPicker(eMode == QFileDialog::Directory) { - _dialog->setSupportedSchemes({ + // use native dialog + m_pFileDialog->setOption(QFileDialog::DontUseNativeDialog, false); + + m_pFileDialog->setSupportedSchemes({ QStringLiteral("file"), QStringLiteral("ftp"), QStringLiteral("http"), @@ -99,16 +100,10 @@ KDE5FilePicker::KDE5FilePicker(QFileDialog::FileMode eMode) QStringLiteral("smb"), }); - _dialog->setFileMode(eMode); - - if (mbIsFolderPicker) - { - _dialog->setOption(QFileDialog::ShowDirsOnly, true); - _dialog->setWindowTitle(toQString(VclResId(STR_FPICKER_FOLDER_DEFAULT_TITLE))); - } - - connect(_dialog, &QFileDialog::filterSelected, this, &KDE5FilePicker::filterChanged); - connect(_dialog, &QFileDialog::fileSelected, this, &KDE5FilePicker::selectionChanged); + connect(m_pFileDialog.get(), &QFileDialog::filterSelected, this, + &KDE5FilePicker::filterChanged); + connect(m_pFileDialog.get(), &QFileDialog::fileSelected, this, + &KDE5FilePicker::selectionChanged); connect(this, &KDE5FilePicker::executeSignal, this, &KDE5FilePicker::execute, Qt::BlockingQueuedConnection); @@ -116,8 +111,6 @@ KDE5FilePicker::KDE5FilePicker(QFileDialog::FileMode eMode) connect(this, &KDE5FilePicker::setTitleSignal, this, &KDE5FilePicker::setTitleSlot, Qt::BlockingQueuedConnection); // XFilePicker - connect(this, &KDE5FilePicker::setMultiSelectionSignal, this, - &KDE5FilePicker::setMultiSelectionSlot, Qt::BlockingQueuedConnection); connect(this, &KDE5FilePicker::setDefaultNameSignal, this, &KDE5FilePicker::setDefaultNameSlot, Qt::BlockingQueuedConnection); connect(this, &KDE5FilePicker::setDisplayDirectorySignal, this, @@ -158,11 +151,7 @@ KDE5FilePicker::KDE5FilePicker(QFileDialog::FileMode eMode) qApp->installEventFilter(this); } -KDE5FilePicker::~KDE5FilePicker() -{ - delete _extraControls; - delete _dialog; -} +KDE5FilePicker::~KDE5FilePicker() { delete _extraControls; } void SAL_CALL KDE5FilePicker::addFilePickerListener(const uno::Reference<XFilePickerListener>& xListener) @@ -186,7 +175,7 @@ void SAL_CALL KDE5FilePicker::setTitle(const OUString& title) return Q_EMIT setTitleSignal(title); } - _dialog->setWindowTitle(toQString(title)); + m_pFileDialog->setWindowTitle(toQString(title)); } sal_Int16 SAL_CALL KDE5FilePicker::execute() @@ -198,28 +187,13 @@ sal_Int16 SAL_CALL KDE5FilePicker::execute() } if (!_filters.isEmpty()) - _dialog->setNameFilters(_filters); + m_pFileDialog->setNameFilters(_filters); if (!_currentFilter.isEmpty()) - _dialog->selectNameFilter(_currentFilter); + m_pFileDialog->selectNameFilter(_currentFilter); - _dialog->show(); + m_pFileDialog->show(); //block and wait for user input - return _dialog->exec() == QFileDialog::Accepted ? 1 : 0; -} - -// XFilePicker -void SAL_CALL KDE5FilePicker::setMultiSelectionMode(sal_Bool multiSelect) -{ - if (qApp->thread() != QThread::currentThread()) - { - SolarMutexReleaser aReleaser; - return Q_EMIT setMultiSelectionSignal(multiSelect); - } - - if (mbIsFolderPicker || _dialog->acceptMode() == QFileDialog::AcceptSave) - return; - - _dialog->setFileMode(multiSelect ? QFileDialog::ExistingFiles : QFileDialog::ExistingFile); + return m_pFileDialog->exec() == QFileDialog::Accepted ? 1 : 0; } void SAL_CALL KDE5FilePicker::setDefaultName(const OUString& name) @@ -230,7 +204,7 @@ void SAL_CALL KDE5FilePicker::setDefaultName(const OUString& name) return Q_EMIT setDefaultNameSignal(name); } - _dialog->selectFile(toQString(name)); + m_pFileDialog->selectFile(toQString(name)); } void SAL_CALL KDE5FilePicker::setDisplayDirectory(const OUString& dir) @@ -242,7 +216,7 @@ void SAL_CALL KDE5FilePicker::setDisplayDirectory(const OUString& dir) } QString qDir(toQString(dir)); - _dialog->setDirectoryUrl(QUrl(qDir)); + m_pFileDialog->setDirectoryUrl(QUrl(qDir)); } OUString SAL_CALL KDE5FilePicker::getDisplayDirectory() @@ -279,7 +253,7 @@ uno::Sequence<OUString> SAL_CALL KDE5FilePicker::getSelectedFiles() return Q_EMIT getSelectedFilesSignal(); } - QList<QUrl> aURLs = _dialog->selectedUrls(); + QList<QUrl> aURLs = m_pFileDialog->selectedUrls(); uno::Sequence<OUString> seq(aURLs.size()); size_t i = 0; @@ -335,7 +309,7 @@ OUString SAL_CALL KDE5FilePicker::getCurrentFilter() return Q_EMIT getCurrentFilterSignal(); } - OUString filter = toOUString(_titleToFilters.key(_dialog->selectedNameFilter())); + OUString filter = toOUString(_titleToFilters.key(m_pFileDialog->selectedNameFilter())); //default if not found if (filter.isEmpty()) @@ -674,7 +648,7 @@ uno::Any KDE5FilePicker::handleGetListValue(QComboBox* pQComboBox, sal_Int16 nAc OUString KDE5FilePicker::implGetDirectory() { - OUString dir = toOUString(_dialog->directoryUrl().url()); + OUString dir = toOUString(m_pFileDialog->directoryUrl().url()); return dir; } @@ -787,12 +761,12 @@ void SAL_CALL KDE5FilePicker::initialize(const uno::Sequence<uno::Any>& args) QFileDialog::AcceptMode operationMode = saveDialog ? QFileDialog::AcceptSave : QFileDialog::AcceptOpen; - _dialog->setAcceptMode(operationMode); + m_pFileDialog->setAcceptMode(operationMode); if (saveDialog) { - _dialog->setConfirmOverwrite(true); - _dialog->setFileMode(QFileDialog::AnyFile); + m_pFileDialog->setConfirmOverwrite(true); + m_pFileDialog->setFileMode(QFileDialog::AnyFile); } setTitle(VclResId(saveDialog ? STR_FPICKER_SAVE : STR_FPICKER_OPEN)); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits