diff --git a/qt5-qtbase.spec b/qt5-qtbase.spec index 7048cb5..3ee5722 100644 --- a/qt5-qtbase.spec +++ b/qt5-qtbase.spec @@ -29,7 +29,7 @@ Summary: Qt5 - QtBase components Name: qt5-qtbase Version: 5.3.2 -Release: 2%{?dist} +Release: 3%{?dist} # See LGPL_EXCEPTIONS.txt, LICENSE.GPL3, respectively, for exception details License: LGPLv2 with exceptions or GPLv3 with exceptions @@ -78,6 +78,7 @@ Patch12: qtbase-opensource-src-5.2.0-enable_ft_lcdfilter.patch Patch50: qt5-poll.patch ##upstream patches +Patch100: qtbase-qfiledialog-implement-getopenfileurl-and-friends.patch # macros %define _qt5 %{name} @@ -308,6 +309,8 @@ rm -fv mkspecs/linux-g++*/qmake.conf.multilib-optflags #patch50 -p1 -b .poll +%patch100 -p1 -b .qfiledialog-implement-getopenfileurl-and-friends + # drop -fexceptions from $RPM_OPT_FLAGS RPM_OPT_FLAGS=`echo $RPM_OPT_FLAGS | sed 's|-fexceptions||g'` @@ -758,6 +761,9 @@ fi %changelog +* Mon Oct 13 2014 Jan Grulich 5.3.2-3 +- QFileDialog: implement getOpenFileUrl and friends for real + * Thu Oct 09 2014 Rex Dieter 5.3.2-2 - use linux-g++ platform unconditionally diff --git a/qtbase-qfiledialog-implement-getopenfileurl-and-friends.patch b/qtbase-qfiledialog-implement-getopenfileurl-and-friends.patch new file mode 100644 index 0000000..f5820ac --- /dev/null +++ b/qtbase-qfiledialog-implement-getopenfileurl-and-friends.patch @@ -0,0 +1,261 @@ +diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp +index 9219757..9c2956a 100644 +--- a/src/widgets/dialogs/qfiledialog.cpp ++++ b/src/widgets/dialogs/qfiledialog.cpp +@@ -2100,35 +2100,9 @@ QString QFileDialog::getOpenFileName(QWidget *parent, + QString *selectedFilter, + Options options) + { +- QFileDialogArgs args; +- args.parent = parent; +- args.caption = caption; +- args.directory = QFileDialogPrivate::workingDirectory(dir); +- args.selection = QFileDialogPrivate::initialSelection(dir); +- args.filter = filter; +- args.mode = ExistingFile; +- args.options = options; +-#if defined(Q_WS_WIN) +- if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog)) { +- return qt_win_get_open_file_name(args, &(args.directory), selectedFilter); +- } +-#endif +- +- // create a qt dialog +- QFileDialog dialog(args); +- if (selectedFilter && !selectedFilter->isEmpty()) +- dialog.selectNameFilter(*selectedFilter); +- if (dialog.exec() == QDialog::Accepted) { +- if (selectedFilter) +- *selectedFilter = dialog.selectedNameFilter(); +- return dialog.selectedFiles().value(0); +- } +- return QString(); +-} +- +-static inline QUrl dialogResultToUrl(const QString &file) +-{ +- return file.isEmpty() ? QUrl() : QUrl::fromLocalFile(file); ++ const QStringList schemes = QStringList(QStringLiteral("file")); ++ const QUrl selectedUrl = getOpenFileUrl(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes); ++ return selectedUrl.toLocalFile(); + } + + /*! +@@ -2166,10 +2140,26 @@ QUrl QFileDialog::getOpenFileUrl(QWidget *parent, + Options options, + const QStringList &supportedSchemes) + { +- Q_UNUSED(supportedSchemes); ++ Q_UNUSED(supportedSchemes); // TODO ++ ++ QFileDialogArgs args; ++ args.parent = parent; ++ args.caption = caption; ++ args.directory = QFileDialogPrivate::workingDirectory(dir); ++ args.selection = QFileDialogPrivate::initialSelection(dir); ++ args.filter = filter; ++ args.mode = ExistingFile; ++ args.options = options; + +- // Falls back to local file +- return dialogResultToUrl(getOpenFileName(parent, caption, dir.toLocalFile(), filter, selectedFilter, options)); ++ QFileDialog dialog(args); ++ if (selectedFilter && !selectedFilter->isEmpty()) ++ dialog.selectNameFilter(*selectedFilter); ++ if (dialog.exec() == QDialog::Accepted) { ++ if (selectedFilter) ++ *selectedFilter = dialog.selectedNameFilter(); ++ return dialog.selectedUrls().value(0); ++ } ++ return QUrl(); + } + + /*! +@@ -2228,31 +2218,12 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent, + QString *selectedFilter, + Options options) + { +- QFileDialogArgs args; +- args.parent = parent; +- args.caption = caption; +- args.directory = QFileDialogPrivate::workingDirectory(dir); +- args.selection = QFileDialogPrivate::initialSelection(dir); +- args.filter = filter; +- args.mode = ExistingFiles; +- args.options = options; +- +-#if defined(Q_WS_WIN) +- if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog)) { +- return qt_win_get_open_file_names(args, &(args.directory), selectedFilter); +- } +-#endif +- +- // create a qt dialog +- QFileDialog dialog(args); +- if (selectedFilter && !selectedFilter->isEmpty()) +- dialog.selectNameFilter(*selectedFilter); +- if (dialog.exec() == QDialog::Accepted) { +- if (selectedFilter) +- *selectedFilter = dialog.selectedNameFilter(); +- return dialog.selectedFiles(); +- } +- return QStringList(); ++ const QStringList schemes = QStringList(QStringLiteral("file")); ++ const QList selectedUrls = getOpenFileUrls(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes); ++ QStringList fileNames; ++ foreach (const QUrl &url, selectedUrls) ++ fileNames << url.toLocalFile(); ++ return fileNames; + } + + /*! +@@ -2293,14 +2264,24 @@ QList QFileDialog::getOpenFileUrls(QWidget *parent, + { + Q_UNUSED(supportedSchemes); + +- // Falls back to local files +- QList urls; +- +- const QStringList fileNames = getOpenFileNames(parent, caption, dir.toLocalFile(), filter, selectedFilter, options); +- foreach (const QString &fileName, fileNames) +- urls << QUrl::fromLocalFile(fileName); ++ QFileDialogArgs args; ++ args.parent = parent; ++ args.caption = caption; ++ args.directory = QFileDialogPrivate::workingDirectory(dir); ++ args.selection = QFileDialogPrivate::initialSelection(dir); ++ args.filter = filter; ++ args.mode = ExistingFiles; ++ args.options = options; + +- return urls; ++ QFileDialog dialog(args); ++ if (selectedFilter && !selectedFilter->isEmpty()) ++ dialog.selectNameFilter(*selectedFilter); ++ if (dialog.exec() == QDialog::Accepted) { ++ if (selectedFilter) ++ *selectedFilter = dialog.selectedNameFilter(); ++ return dialog.selectedUrls(); ++ } ++ return QList(); + } + + /*! +@@ -2360,33 +2341,9 @@ QString QFileDialog::getSaveFileName(QWidget *parent, + QString *selectedFilter, + Options options) + { +- QFileDialogArgs args; +- args.parent = parent; +- args.caption = caption; +- args.directory = QFileDialogPrivate::workingDirectory(dir); +- args.selection = QFileDialogPrivate::initialSelection(dir); +- args.filter = filter; +- args.mode = AnyFile; +- args.options = options; +- +-#if defined(Q_WS_WIN) +- if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog)) { +- return qt_win_get_save_file_name(args, &(args.directory), selectedFilter); +- } +-#endif +- +- // create a qt dialog +- QFileDialog dialog(args); +- dialog.setAcceptMode(AcceptSave); +- if (selectedFilter && !selectedFilter->isEmpty()) +- dialog.selectNameFilter(*selectedFilter); +- if (dialog.exec() == QDialog::Accepted) { +- if (selectedFilter) +- *selectedFilter = dialog.selectedNameFilter(); +- return dialog.selectedFiles().value(0); +- } +- +- return QString(); ++ const QStringList schemes = QStringList(QStringLiteral("file")); ++ const QUrl selectedUrl = getSaveFileUrl(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes); ++ return selectedUrl.toLocalFile(); + } + + /*! +@@ -2426,8 +2383,25 @@ QUrl QFileDialog::getSaveFileUrl(QWidget *parent, + { + Q_UNUSED(supportedSchemes); + +- // Falls back to local file +- return dialogResultToUrl(getSaveFileName(parent, caption, dir.toLocalFile(), filter, selectedFilter, options)); ++ QFileDialogArgs args; ++ args.parent = parent; ++ args.caption = caption; ++ args.directory = QFileDialogPrivate::workingDirectory(dir); ++ args.selection = QFileDialogPrivate::initialSelection(dir); ++ args.filter = filter; ++ args.mode = AnyFile; ++ args.options = options; ++ ++ QFileDialog dialog(args); ++ dialog.setAcceptMode(AcceptSave); ++ if (selectedFilter && !selectedFilter->isEmpty()) ++ dialog.selectNameFilter(*selectedFilter); ++ if (dialog.exec() == QDialog::Accepted) { ++ if (selectedFilter) ++ *selectedFilter = dialog.selectedNameFilter(); ++ return dialog.selectedUrls().value(0); ++ } ++ return QUrl(); + } + + /*! +@@ -2474,29 +2448,9 @@ QString QFileDialog::getExistingDirectory(QWidget *parent, + const QString &dir, + Options options) + { +- QFileDialogArgs args; +- args.parent = parent; +- args.caption = caption; +- args.directory = QFileDialogPrivate::workingDirectory(dir); +- args.mode = (options & ShowDirsOnly ? DirectoryOnly : Directory); +- args.options = options; +- +-#if defined(Q_WS_WIN) +- if (QGuiApplicationPrivate::platformIntegration()->usePlatformNativeDialog() && !(args.options & DontUseNativeDialog) && (options & ShowDirsOnly) +-#if defined(Q_OS_WINCE) +- && qt_priv_ptr_valid +-#endif +- ) { +- return qt_win_get_existing_directory(args); +- } +-#endif +- +- // create a qt dialog +- QFileDialog dialog(args); +- if (dialog.exec() == QDialog::Accepted) { +- return dialog.selectedFiles().value(0); +- } +- return QString(); ++ const QStringList schemes = QStringList(QStringLiteral("file")); ++ const QUrl selectedUrl = getExistingDirectoryUrl(parent, caption, QUrl::fromLocalFile(dir), options, schemes); ++ return selectedUrl.toLocalFile(); + } + + /*! +@@ -2534,8 +2488,17 @@ QUrl QFileDialog::getExistingDirectoryUrl(QWidget *parent, + { + Q_UNUSED(supportedSchemes); + +- // Falls back to local file +- return dialogResultToUrl(getExistingDirectory(parent, caption, dir.toLocalFile(), options)); ++ QFileDialogArgs args; ++ args.parent = parent; ++ args.caption = caption; ++ args.directory = QFileDialogPrivate::workingDirectory(dir); ++ args.mode = (options & ShowDirsOnly ? DirectoryOnly : Directory); ++ args.options = options; ++ ++ QFileDialog dialog(args); ++ if (dialog.exec() == QDialog::Accepted) ++ return dialog.selectedUrls().value(0); ++ return QUrl(); + } + + inline static QString _qt_get_directory(const QString &path)