From f5dbc876378ae58a7bdfe1e9664fc81caca18dfb Mon Sep 17 00:00:00 2001 From: Kevin Ottens Date: Wed, 15 May 2013 16:22:39 +0200 Subject: Have QFileDialog use QUrl internally When using the native dialog and through the helper, we use QUrl in QFileDialog. It is preparatory work for having QUrl based methods on QFileDialog interface itself. Done-with: sean.harmer@kdab.com Done-with: faure@kde.org Change-Id: I61e99d498252241f38ec05724702a90ba050c4bb Reviewed-by: Friedemann Kleint --- src/gui/kernel/qplatformdialoghelper.cpp | 17 +- src/gui/kernel/qplatformdialoghelper.h | 27 +-- .../platforms/cocoa/qcocoafiledialoghelper.h | 8 +- .../platforms/cocoa/qcocoafiledialoghelper.mm | 48 ++--- src/plugins/platforms/qnx/qqnxfiledialoghelper.h | 10 +- .../platforms/qnx/qqnxfiledialoghelper_bb10.cpp | 30 +-- .../qnx/qqnxfiledialoghelper_playbook.cpp | 18 +- .../platforms/windows/qwindowsdialoghelpers.cpp | 211 ++++++++++----------- .../platformthemes/gtk2/qgtk2dialoghelpers.cpp | 28 +-- .../platformthemes/gtk2/qgtk2dialoghelpers.h | 12 +- src/widgets/dialogs/qfiledialog.cpp | 83 ++++++-- src/widgets/dialogs/qfiledialog.h | 5 +- src/widgets/dialogs/qfiledialog_p.h | 40 ++-- 13 files changed, 307 insertions(+), 230 deletions(-) diff --git a/src/gui/kernel/qplatformdialoghelper.cpp b/src/gui/kernel/qplatformdialoghelper.cpp index 0ee8e8b4aa..74442736c3 100644 --- a/src/gui/kernel/qplatformdialoghelper.cpp +++ b/src/gui/kernel/qplatformdialoghelper.cpp @@ -376,9 +376,9 @@ public: QStringList nameFilters; QString defaultSuffix; QStringList history; - QString initialDirectory; + QUrl initialDirectory; QString initiallySelectedNameFilter; - QStringList initiallySelectedFiles; + QList initiallySelectedFiles; }; QFileDialogOptions::QFileDialogOptions() : d(new QFileDialogOptionsPrivate) @@ -530,12 +530,12 @@ bool QFileDialogOptions::isLabelExplicitlySet(DialogLabel label) return label >= 0 && label < DialogLabelCount && !d->labels[label].isEmpty(); } -QString QFileDialogOptions::initialDirectory() const +QUrl QFileDialogOptions::initialDirectory() const { return d->initialDirectory; } -void QFileDialogOptions::setInitialDirectory(const QString &directory) +void QFileDialogOptions::setInitialDirectory(const QUrl &directory) { d->initialDirectory = directory; } @@ -550,16 +550,21 @@ void QFileDialogOptions::setInitiallySelectedNameFilter(const QString &filter) d->initiallySelectedNameFilter = filter; } -QStringList QFileDialogOptions::initiallySelectedFiles() const +QList QFileDialogOptions::initiallySelectedFiles() const { return d->initiallySelectedFiles; } -void QFileDialogOptions::setInitiallySelectedFiles(const QStringList &files) +void QFileDialogOptions::setInitiallySelectedFiles(const QList &files) { d->initiallySelectedFiles = files; } +bool QPlatformFileDialogHelper::isSupportedUrl(const QUrl &url) const +{ + return url.isLocalFile(); +} + /*! \class QPlatformFileDialogHelper \since 5.0 diff --git a/src/gui/kernel/qplatformdialoghelper.h b/src/gui/kernel/qplatformdialoghelper.h index 7412bdbec3..092839aaed 100644 --- a/src/gui/kernel/qplatformdialoghelper.h +++ b/src/gui/kernel/qplatformdialoghelper.h @@ -57,6 +57,7 @@ #include #include #include +#include #include QT_BEGIN_NAMESPACE @@ -275,14 +276,14 @@ public: QString labelText(DialogLabel label) const; bool isLabelExplicitlySet(DialogLabel label); - QString initialDirectory() const; - void setInitialDirectory(const QString &); + QUrl initialDirectory() const; + void setInitialDirectory(const QUrl &); QString initiallySelectedNameFilter() const; void setInitiallySelectedNameFilter(const QString &); - QStringList initiallySelectedFiles() const; - void setInitiallySelectedFiles(const QStringList &); + QList initiallySelectedFiles() const; + void setInitiallySelectedFiles(const QList &); private: QSharedDataPointer d; @@ -295,14 +296,16 @@ class Q_GUI_EXPORT QPlatformFileDialogHelper : public QPlatformDialogHelper Q_OBJECT public: virtual bool defaultNameFilterDisables() const = 0; - virtual void setDirectory(const QString &directory) = 0; - virtual QString directory() const = 0; - virtual void selectFile(const QString &filename) = 0; - virtual QStringList selectedFiles() const = 0; + virtual void setDirectory(const QUrl &directory) = 0; + virtual QUrl directory() const = 0; + virtual void selectFile(const QUrl &filename) = 0; + virtual QList selectedFiles() const = 0; virtual void setFilter() = 0; virtual void selectNameFilter(const QString &filter) = 0; virtual QString selectedNameFilter() const = 0; + virtual bool isSupportedUrl(const QUrl &url) const; + const QSharedPointer &options() const; void setOptions(const QSharedPointer &options); @@ -310,10 +313,10 @@ public: static const char *filterRegExp; Q_SIGNALS: - void fileSelected(const QString &file); - void filesSelected(const QStringList &files); - void currentChanged(const QString &path); - void directoryEntered(const QString &directory); + void fileSelected(const QUrl &file); + void filesSelected(const QList &files); + void currentChanged(const QUrl &path); + void directoryEntered(const QUrl &directory); void filterSelected(const QString &filter); private: diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h index 701e8e2dbf..8a8b1d946c 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h @@ -62,10 +62,10 @@ public: bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent); void hide(); - void setDirectory(const QString &directory); - QString directory() const; - void selectFile(const QString &filename); - QStringList selectedFiles() const; + void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; + QUrl directory() const Q_DECL_OVERRIDE; + void selectFile(const QUrl &filename) Q_DECL_OVERRIDE; + QList selectedFiles() const Q_DECL_OVERRIDE; void setFilter(); void selectNameFilter(const QString &filter); QString selectedNameFilter() const; diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm index 402e5b9b01..b3bc4a8ebf 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -393,18 +393,20 @@ static QString strippedText(QString s) return mNameFilterDropDownList->value([mPopUpButton indexOfSelectedItem]); } -- (QStringList)selectedFiles +- (QList)selectedFiles { if (mOpenPanel) { - QStringList result; + QList result; NSArray* array = [mOpenPanel URLs]; - for (NSUInteger i=0; i<[array count]; ++i) - result << QCFString::toQString([[array objectAtIndex:i] path]).normalized(QString::NormalizationForm_C); + for (NSUInteger i=0; i<[array count]; ++i) { + QString path = QCFString::toQString([[array objectAtIndex:i] path]).normalized(QString::NormalizationForm_C); + result << QUrl::fromLocalFile(path); + } return result; } else { - QStringList result; + QList result; QString filename = QCFString::toQString([[mSavePanel URL] path]).normalized(QString::NormalizationForm_C); - result << filename.remove(QLatin1String("___qt_very_unlikely_prefix_")); + result << QUrl::fromLocalFile(filename.remove(QLatin1String("___qt_very_unlikely_prefix_"))); return result; } } @@ -571,7 +573,7 @@ QCocoaFileDialogHelper::~QCocoaFileDialogHelper() void QCocoaFileDialogHelper::QNSOpenSavePanelDelegate_selectionChanged(const QString &newPath) { - emit currentChanged(newPath); + emit currentChanged(QUrl::fromLocalFile(newPath)); } void QCocoaFileDialogHelper::QNSOpenSavePanelDelegate_panelClosed(bool accepted) @@ -586,7 +588,7 @@ void QCocoaFileDialogHelper::QNSOpenSavePanelDelegate_panelClosed(bool accepted) void QCocoaFileDialogHelper::QNSOpenSavePanelDelegate_directoryEntered(const QString &newDir) { // ### fixme: priv->setLastVisitedDirectory(newDir); - emit directoryEntered(newDir); + emit directoryEntered(QUrl::fromLocalFile(newDir)); } void QCocoaFileDialogHelper::QNSOpenSavePanelDelegate_filterSelected(int menuIndex) @@ -598,38 +600,40 @@ void QCocoaFileDialogHelper::QNSOpenSavePanelDelegate_filterSelected(int menuInd extern OSErr qt_mac_create_fsref(const QString &, FSRef *); // qglobal.cpp extern void qt_mac_to_pascal_string(QString s, Str255 str, TextEncoding encoding=0, int len=-1); // qglobal.cpp -void QCocoaFileDialogHelper::setDirectory(const QString &directory) +void QCocoaFileDialogHelper::setDirectory(const QUrl &directory) { QNSOpenSavePanelDelegate *delegate = static_cast(mDelegate); if (delegate) - [delegate->mSavePanel setDirectoryURL:[NSURL fileURLWithPath:QCFString::toNSString(directory)]]; + [delegate->mSavePanel setDirectoryURL:[NSURL fileURLWithPath:QCFString::toNSString(directory.toLocalFile())]]; } -QString QCocoaFileDialogHelper::directory() const +QUrl QCocoaFileDialogHelper::directory() const { QNSOpenSavePanelDelegate *delegate = static_cast(mDelegate); - if (delegate) - return QCFString::toQString([[delegate->mSavePanel directoryURL] path]).normalized(QString::NormalizationForm_C); - return QString(); + if (delegate) { + QString path = QCFString::toQString([[delegate->mSavePanel directoryURL] path]).normalized(QString::NormalizationForm_C); + return QUrl::fromLocalFile(path); + } + return QUrl(); } -void QCocoaFileDialogHelper::selectFile(const QString &filename) +void QCocoaFileDialogHelper::selectFile(const QUrl &filename) { - QString filePath = filename; + QString filePath = filename.toLocalFile(); if (QDir::isRelativePath(filePath)) - filePath = QFileInfo(directory(), filePath).filePath(); + filePath = QFileInfo(directory().toLocalFile(), filePath).filePath(); // There seems to no way to select a file once the dialog is running. // So do the next best thing, set the file's directory: setDirectory(QFileInfo(filePath).absolutePath()); } -QStringList QCocoaFileDialogHelper::selectedFiles() const +QList QCocoaFileDialogHelper::selectedFiles() const { QNSOpenSavePanelDelegate *delegate = static_cast(mDelegate); if (delegate) return [delegate selectedFiles]; - return QStringList(); + return QList(); } void QCocoaFileDialogHelper::setFilter() @@ -697,10 +701,10 @@ void QCocoaFileDialogHelper::createNSOpenSavePanelDelegate() return; QCocoaAutoReleasePool pool; const SharedPointerFileDialogOptions &opts = options(); - const QStringList selectedFiles = opts->initiallySelectedFiles(); - const QString directory = opts->initialDirectory(); + const QList selectedFiles = opts->initiallySelectedFiles(); + const QUrl directory = opts->initialDirectory(); const bool selectDir = selectedFiles.isEmpty(); - QString selection(selectDir ? directory : selectedFiles.front()); + QString selection(selectDir ? directory.toLocalFile() : selectedFiles.front().toLocalFile()); QNSOpenSavePanelDelegate *delegate = [[QNSOpenSavePanelDelegate alloc] initWithAcceptMode: selection diff --git a/src/plugins/platforms/qnx/qqnxfiledialoghelper.h b/src/plugins/platforms/qnx/qqnxfiledialoghelper.h index ad2483365b..e7c68f6ff5 100644 --- a/src/plugins/platforms/qnx/qqnxfiledialoghelper.h +++ b/src/plugins/platforms/qnx/qqnxfiledialoghelper.h @@ -74,10 +74,10 @@ public: void hide(); bool defaultNameFilterDisables() const; - void setDirectory(const QString &directory); - QString directory() const; - void selectFile(const QString &fileName); - QStringList selectedFiles() const; + void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; + QUrl directory() const Q_DECL_OVERRIDE; + void selectFile(const QUrl &fileName) Q_DECL_OVERRIDE; + QList selectedFiles() const Q_DECL_OVERRIDE; void setFilter(); void selectNameFilter(const QString &filter); QString selectedNameFilter() const; @@ -98,7 +98,7 @@ private: QPlatformDialogHelper::DialogCode m_result; #if defined(Q_OS_BLACKBERRY_TABLET) - QStringList m_paths; + QList m_paths; #endif }; diff --git a/src/plugins/platforms/qnx/qqnxfiledialoghelper_bb10.cpp b/src/plugins/platforms/qnx/qqnxfiledialoghelper_bb10.cpp index f4c48610a6..dc841eb1a9 100644 --- a/src/plugins/platforms/qnx/qqnxfiledialoghelper_bb10.cpp +++ b/src/plugins/platforms/qnx/qqnxfiledialoghelper_bb10.cpp @@ -120,8 +120,12 @@ bool QQnxFileDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modali m_dialog->setMode(mode); - if (!opts->initiallySelectedFiles().isEmpty()) - m_dialog->setDefaultSaveFileNames(opts->initiallySelectedFiles()); + if (!opts->initiallySelectedFiles().isEmpty()) { + QStringList files; + Q_FOREACH ( const QUrl &url, opts->initiallySelectedFiles() ) + files.append(url.toLocalFile()); + m_dialog->setDefaultSaveFileNames(files); + } } // Cache the accept mode so we know which functions to use to get the results back @@ -144,29 +148,33 @@ bool QQnxFileDialogHelper::defaultNameFilterDisables() const return false; } -void QQnxFileDialogHelper::setDirectory(const QString &directory) +void QQnxFileDialogHelper::setDirectory(const QUrl &directory) { - m_dialog->addDirectory(directory); + m_dialog->addDirectory(directory.toLocalFile()); } -QString QQnxFileDialogHelper::directory() const +QUrl QQnxFileDialogHelper::directory() const { qFileDialogHelperDebug() << Q_FUNC_INFO; if (!m_dialog->directories().isEmpty()) - return m_dialog->directories().first(); + return QUrl::fromLocalFile(m_dialog->directories().first()); - return QString(); + return QUrl(); } -void QQnxFileDialogHelper::selectFile(const QString &fileName) +void QQnxFileDialogHelper::selectFile(const QUrl &fileName) { - m_dialog->addDefaultSaveFileName(fileName); + m_dialog->addDefaultSaveFileName(fileName.toLocalFile()); } -QStringList QQnxFileDialogHelper::selectedFiles() const +QList QQnxFileDialogHelper::selectedFiles() const { qFileDialogHelperDebug() << Q_FUNC_INFO; - return m_dialog->selectedFiles(); + QList urls; + QStringList files = m_dialog->selectedFiles(); + Q_FOREACH (const QString &file, files) + urls.append(QUrl::fromLocalFile(file)); + return urls; } void QQnxFileDialogHelper::setFilter() diff --git a/src/plugins/platforms/qnx/qqnxfiledialoghelper_playbook.cpp b/src/plugins/platforms/qnx/qqnxfiledialoghelper_playbook.cpp index 12e8d8afbf..2a743d03f7 100644 --- a/src/plugins/platforms/qnx/qqnxfiledialoghelper_playbook.cpp +++ b/src/plugins/platforms/qnx/qqnxfiledialoghelper_playbook.cpp @@ -102,7 +102,7 @@ bool QQnxFileDialogHelper::handleEvent(bps_event_t *event) for (int i = 0; i < pathCount; ++i) { QString path = QFile::decodeName(filePaths[i]); - m_paths.append(path); + m_paths.append(QUrl::fromLocalFile(path)); qFileDialogHelperDebug() << "path =" << path; } @@ -112,7 +112,7 @@ bool QQnxFileDialogHelper::handleEvent(bps_event_t *event) const char *filePath = dialog_event_get_filesave_filepath(event); QString path = QFile::decodeName(filePath); qFileDialogHelperDebug() << "path =" << path; - m_paths.append(path); + m_paths.append(QUrl::fromLocalFile(path)); } } else { // Cancel m_result = QPlatformDialogHelper::Rejected; @@ -188,7 +188,7 @@ bool QQnxFileDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modali // Maybe pre-select a filename if (!opts->initiallySelectedFiles().isEmpty()) { - QString fileName = opts->initiallySelectedFiles().first(); + QString fileName = opts->initiallySelectedFiles().first().toLocalFile(); dialog_set_filesave_filename(m_dialog, QFile::encodeName(fileName).constData()); } @@ -240,29 +240,29 @@ bool QQnxFileDialogHelper::defaultNameFilterDisables() const return false; } -void QQnxFileDialogHelper::setDirectory(const QString &directory) +void QQnxFileDialogHelper::setDirectory(const QUrl &directory) { qFileDialogHelperDebug() << Q_FUNC_INFO << "directory =" << directory; // No native API for setting the directory(!). The best we can do is to // set it as the file name but even then only with a file save dialog. if (m_dialog && m_acceptMode == QFileDialogOptions::AcceptSave) - dialog_set_filesave_filename(m_dialog, QFile::encodeName(directory).constData()); + dialog_set_filesave_filename(m_dialog, QFile::encodeName(directory.toLocalFile()).constData()); } -QString QQnxFileDialogHelper::directory() const +QUrl QQnxFileDialogHelper::directory() const { qFileDialogHelperDebug() << Q_FUNC_INFO; return m_paths.first(); } -void QQnxFileDialogHelper::selectFile(const QString &fileName) +void QQnxFileDialogHelper::selectFile(const QUrl &fileName) { qFileDialogHelperDebug() << Q_FUNC_INFO << "filename =" << fileName; if (m_dialog && m_acceptMode == QFileDialogOptions::AcceptSave) - dialog_set_filesave_filename(m_dialog, QFile::encodeName(fileName).constData()); + dialog_set_filesave_filename(m_dialog, QFile::encodeName(fileName.toLocalFile()).constData()); } -QStringList QQnxFileDialogHelper::selectedFiles() const +QList QQnxFileDialogHelper::selectedFiles() const { qFileDialogHelperDebug() << Q_FUNC_INFO; return m_paths; diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp index 33bed61398..17a6cd6579 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp @@ -39,6 +39,8 @@ ** ****************************************************************************/ +#define QT_NO_URL_CAST_FROM_STRING 1 + #include "qwindowsdialoghelpers.h" #include "qwindowscontext.h" @@ -651,34 +653,34 @@ public: QWindowsFileDialogSharedData() : m_data(new Data) {} void fromOptions(const QSharedPointer &o); - QString directory() const; - void setDirectory(const QString &); + QUrl directory() const; + void setDirectory(const QUrl &); QString selectedNameFilter() const; void setSelectedNameFilter(const QString &); - QStringList selectedFiles() const; - void setSelectedFiles(const QStringList &); + QList selectedFiles() const; + void setSelectedFiles(const QList &); QString selectedFile() const; private: class Data : public QSharedData { public: - QString directory; + QUrl directory; QString selectedNameFilter; - QStringList selectedFiles; + QList selectedFiles; QMutex mutex; }; QExplicitlySharedDataPointer m_data; }; -inline QString QWindowsFileDialogSharedData::directory() const +inline QUrl QWindowsFileDialogSharedData::directory() const { m_data->mutex.lock(); - const QString result = m_data->directory; + const QUrl result = m_data->directory; m_data->mutex.unlock(); return result; } -inline void QWindowsFileDialogSharedData::setDirectory(const QString &d) +inline void QWindowsFileDialogSharedData::setDirectory(const QUrl &d) { QMutexLocker (&m_data->mutex); m_data->directory = d; @@ -698,24 +700,24 @@ inline void QWindowsFileDialogSharedData::setSelectedNameFilter(const QString &f m_data->selectedNameFilter = f; } -inline QStringList QWindowsFileDialogSharedData::selectedFiles() const +inline QList QWindowsFileDialogSharedData::selectedFiles() const { m_data->mutex.lock(); - const QStringList result = m_data->selectedFiles; + const QList result = m_data->selectedFiles; m_data->mutex.unlock(); return result; } inline QString QWindowsFileDialogSharedData::selectedFile() const { - const QStringList files = selectedFiles(); - return files.isEmpty() ? QString() : files.front(); + const QList files = selectedFiles(); + return files.isEmpty() ? QString() : files.front().toLocalFile(); } -inline void QWindowsFileDialogSharedData::setSelectedFiles(const QStringList &f) +inline void QWindowsFileDialogSharedData::setSelectedFiles(const QList &urls) { QMutexLocker (&m_data->mutex); - m_data->selectedFiles = f; + m_data->selectedFiles = urls; } inline void QWindowsFileDialogSharedData::fromOptions(const QSharedPointer &o) @@ -822,7 +824,7 @@ public: virtual void setWindowTitle(const QString &title); inline void setMode(QFileDialogOptions::FileMode mode, QFileDialogOptions::FileDialogOptions options); inline void setDirectory(const QString &directory); - inline void updateDirectory() { setDirectory(m_data.directory()); } + inline void updateDirectory() { setDirectory(m_data.directory().toLocalFile()); } inline QString directory() const; virtual void exec(HWND owner = 0); virtual void setNameFilters(const QStringList &f); @@ -837,10 +839,10 @@ public: inline void setLabelText(QFileDialogOptions::DialogLabel l, const QString &text); // Return the selected files for tracking in OnSelectionChanged(). - virtual QStringList selectedFiles() const = 0; + virtual QList selectedFiles() const = 0; // Return the result for tracking in OnFileOk(). Differs from selection for // example by appended default suffixes, etc. - virtual QStringList dialogResult() const = 0; + virtual QList dialogResult() const = 0; inline void onFolderChange(IShellItem *); inline void onSelectionChange(); @@ -848,8 +850,8 @@ public: inline bool onFileOk(); signals: - void directoryEntered(const QString& directory); - void currentChanged(const QString& file); + void directoryEntered(const QUrl &directory); + void currentChanged(const QUrl &file); void filterSelected(const QString & filter); public slots: @@ -861,9 +863,9 @@ protected: void setDefaultSuffixSys(const QString &s); inline IFileDialog * fileDialog() const { return m_fileDialog; } static QString itemPath(IShellItem *item); - static QStringList libraryItemFolders(IShellItem *item); + static QList libraryItemFolders(IShellItem *item); static QString libraryItemDefaultSaveFolder(IShellItem *item); - static int itemPaths(IShellItemArray *items, QStringList *fileResult = 0); + static int itemPaths(IShellItemArray *items, QList *fileResult = 0); static IShellItem *shellItem(const QString &path); const QWindowsFileDialogSharedData &data() const { return m_data; } @@ -1031,9 +1033,9 @@ static IShellLibrary *sHLoadLibraryFromItem(IShellItem *libraryItem, DWORD mode) } // Return all folders of a library-type item. -QStringList QWindowsNativeFileDialogBase::libraryItemFolders(IShellItem *item) +QList QWindowsNativeFileDialogBase::libraryItemFolders(IShellItem *item) { - QStringList result; + QList result; if (IShellLibrary *library = sHLoadLibraryFromItem(item, STGM_READ | STGM_SHARE_DENY_WRITE)) { IShellItemArray *itemArray = 0; if (SUCCEEDED(library->GetFolders(LFF_FORCEFILESYSTEM, IID_IShellItemArray, reinterpret_cast(&itemArray)))) { @@ -1062,9 +1064,9 @@ QString QWindowsNativeFileDialogBase::libraryItemDefaultSaveFolder(IShellItem *i #else // !Q_OS_WINCE && __IShellLibrary_INTERFACE_DEFINED__ -QStringList QWindowsNativeFileDialogBase::libraryItemFolders(IShellItem *) +QList QWindowsNativeFileDialogBase::libraryItemFolders(IShellItem *) { - return QStringList(); + return QList(); } QString QWindowsNativeFileDialogBase::libraryItemDefaultSaveFolder(IShellItem *) @@ -1096,7 +1098,7 @@ QString QWindowsNativeFileDialogBase::itemPath(IShellItem *item) } int QWindowsNativeFileDialogBase::itemPaths(IShellItemArray *items, - QStringList *result /* = 0 */) + QList *result /* = 0 */) { DWORD itemCount = 0; if (result) @@ -1108,7 +1110,7 @@ int QWindowsNativeFileDialogBase::itemPaths(IShellItemArray *items, for (DWORD i = 0; i < itemCount; ++i) { IShellItem *item = 0; if (SUCCEEDED(items->GetItemAt(i, &item))) - result->push_back(QWindowsNativeFileDialogBase::itemPath(item)); + result->push_back(QUrl::fromLocalFile(QWindowsNativeFileDialogBase::itemPath(item))); } } return itemCount; @@ -1270,7 +1272,7 @@ QString QWindowsNativeFileDialogBase::selectedNameFilter() const void QWindowsNativeFileDialogBase::onFolderChange(IShellItem *item) { if (item) { - const QString directory = QWindowsNativeFileDialogBase::itemPath(item); + const QUrl directory = QUrl::fromLocalFile(QWindowsNativeFileDialogBase::itemPath(item)); m_data.setDirectory(directory); emit directoryEntered(directory); } @@ -1278,7 +1280,7 @@ void QWindowsNativeFileDialogBase::onFolderChange(IShellItem *item) void QWindowsNativeFileDialogBase::onSelectionChange() { - const QStringList current = selectedFiles(); + const QList current = selectedFiles(); m_data.setSelectedFiles(current); if (current.size() == 1) emit currentChanged(current.front()); @@ -1338,8 +1340,8 @@ public: explicit QWindowsNativeSaveFileDialog(const QWindowsFileDialogSharedData &data) : QWindowsNativeFileDialogBase(data) {} virtual void setNameFilters(const QStringList &f); - virtual QStringList selectedFiles() const; - virtual QStringList dialogResult() const; + virtual QList selectedFiles() const; + virtual QList dialogResult() const; }; // Return the first suffix from the name filter "Foo files (*.foo;*.bar)" -> "foo". @@ -1374,22 +1376,22 @@ void QWindowsNativeSaveFileDialog::setNameFilters(const QStringList &f) } // m_hasDefaultSuffix } -QStringList QWindowsNativeSaveFileDialog::dialogResult() const +QList QWindowsNativeSaveFileDialog::dialogResult() const { - QStringList result; + QList result; IShellItem *item = 0; if (SUCCEEDED(fileDialog()->GetResult(&item)) && item) - result.push_back(QWindowsNativeFileDialogBase::itemPath(item)); + result.push_back(QUrl::fromLocalFile(QWindowsNativeFileDialogBase::itemPath(item))); return result; } -QStringList QWindowsNativeSaveFileDialog::selectedFiles() const +QList QWindowsNativeSaveFileDialog::selectedFiles() const { - QStringList result; + QList result; IShellItem *item = 0; const HRESULT hr = fileDialog()->GetCurrentSelection(&item); if (SUCCEEDED(hr) && item) - result.push_back(QWindowsNativeSaveFileDialog::itemPath(item)); + result.push_back(QUrl::fromLocalFile(QWindowsNativeSaveFileDialog::itemPath(item))); return result; } @@ -1408,26 +1410,26 @@ class QWindowsNativeOpenFileDialog : public QWindowsNativeFileDialogBase public: explicit QWindowsNativeOpenFileDialog(const QWindowsFileDialogSharedData &data) : QWindowsNativeFileDialogBase(data) {} - virtual QStringList selectedFiles() const; - virtual QStringList dialogResult() const; + virtual QList selectedFiles() const; + virtual QList dialogResult() const; private: inline IFileOpenDialog *openFileDialog() const { return static_cast(fileDialog()); } }; -QStringList QWindowsNativeOpenFileDialog::dialogResult() const +QList QWindowsNativeOpenFileDialog::dialogResult() const { - QStringList result; + QList result; IShellItemArray *items = 0; if (SUCCEEDED(openFileDialog()->GetResults(&items)) && items) QWindowsNativeFileDialogBase::itemPaths(items, &result); return result; } -QStringList QWindowsNativeOpenFileDialog::selectedFiles() const +QList QWindowsNativeOpenFileDialog::selectedFiles() const { - QStringList result; + QList result; IShellItemArray *items = 0; const HRESULT hr = openFileDialog()->GetSelectedItems(&items); if (SUCCEEDED(hr) && items) @@ -1484,14 +1486,13 @@ public: virtual bool supportsNonModalDialog(const QWindow * /* parent */ = 0) const { return false; } virtual bool defaultNameFilterDisables() const { return true; } - virtual void setDirectory(const QString &directory); - virtual QString directory() const; - virtual void selectFile(const QString &filename); - virtual QStringList selectedFiles() const; - virtual void setFilter(); - virtual void setNameFilters(const QStringList &filters); - virtual void selectNameFilter(const QString &filter); - virtual QString selectedNameFilter() const; + virtual void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; + virtual QUrl directory() const Q_DECL_OVERRIDE; + virtual void selectFile(const QUrl &filename) Q_DECL_OVERRIDE; + virtual QList selectedFiles() const Q_DECL_OVERRIDE; + virtual void setFilter() Q_DECL_OVERRIDE; + virtual void selectNameFilter(const QString &filter) Q_DECL_OVERRIDE; + virtual QString selectedNameFilter() const Q_DECL_OVERRIDE; private: virtual QWindowsNativeDialogBase *createNativeDialog(); @@ -1509,10 +1510,10 @@ QWindowsNativeDialogBase *QWindowsFileDialogHelper::createNativeDialog() return 0; QObject::connect(result, SIGNAL(accepted()), this, SIGNAL(accept())); QObject::connect(result, SIGNAL(rejected()), this, SIGNAL(reject())); - QObject::connect(result, SIGNAL(directoryEntered(QString)), - this, SIGNAL(directoryEntered(QString))); - QObject::connect(result, SIGNAL(currentChanged(QString)), - this, SIGNAL(currentChanged(QString))); + QObject::connect(result, SIGNAL(directoryEntered(QUrl)), + this, SIGNAL(directoryEntered(QUrl))); + QObject::connect(result, SIGNAL(currentChanged(QUrl)), + this, SIGNAL(currentChanged(QUrl))); QObject::connect(result, SIGNAL(filterSelected(QString)), this, SIGNAL(filterSelected(QString))); @@ -1532,11 +1533,16 @@ QWindowsNativeDialogBase *QWindowsFileDialogHelper::createNativeDialog() result->setLabelText(QFileDialogOptions::Accept, opts->labelText(QFileDialogOptions::Accept)); result->updateDirectory(); result->updateSelectedNameFilter(); - const QStringList initialSelection = opts->initiallySelectedFiles(); + const QList initialSelection = opts->initiallySelectedFiles(); if (initialSelection.size() > 0) { - QFileInfo info(initialSelection.front()); - if (!info.isDir()) - result->selectFile(info.fileName()); + const QUrl url = initialSelection.front(); + if (url.isLocalFile()) { + QFileInfo info(url.toLocalFile()); + if (!info.isDir()) + result->selectFile(info.fileName()); + } else { + result->selectFile(url.path()); // TODO url.fileName() once it exists + } } // No need to select initialNameFilter if mode is Dir if (mode != QFileDialogOptions::Directory && mode != QFileDialogOptions::DirectoryOnly) { @@ -1550,31 +1556,31 @@ QWindowsNativeDialogBase *QWindowsFileDialogHelper::createNativeDialog() return result; } -void QWindowsFileDialogHelper::setDirectory(const QString &directory) +void QWindowsFileDialogHelper::setDirectory(const QUrl &directory) { if (QWindowsContext::verboseDialogs) - qDebug("%s %s" , __FUNCTION__, qPrintable(directory)); + qDebug("%s %s" , __FUNCTION__, qPrintable(directory.toString())); m_data.setDirectory(directory); if (hasNativeDialog()) nativeFileDialog()->updateDirectory(); } -QString QWindowsFileDialogHelper::directory() const +QUrl QWindowsFileDialogHelper::directory() const { return m_data.directory(); } -void QWindowsFileDialogHelper::selectFile(const QString &fileName) +void QWindowsFileDialogHelper::selectFile(const QUrl &fileName) { if (QWindowsContext::verboseDialogs) - qDebug("%s %s" , __FUNCTION__, qPrintable(fileName)); + qDebug("%s %s" , __FUNCTION__, qPrintable(fileName.toString())); if (QWindowsNativeFileDialogBase *nfd = nativeFileDialog()) - nfd->selectFile(fileName); + nfd->selectFile(fileName.toLocalFile()); // ## should use QUrl::fileName() once it exists } -QStringList QWindowsFileDialogHelper::selectedFiles() const +QList QWindowsFileDialogHelper::selectedFiles() const { return m_data.selectedFiles(); } @@ -1585,14 +1591,6 @@ void QWindowsFileDialogHelper::setFilter() qDebug("%s" , __FUNCTION__); } -void QWindowsFileDialogHelper::setNameFilters(const QStringList &filters) -{ - if (QWindowsContext::verboseDialogs) - qDebug("%s" , __FUNCTION__); - if (QWindowsNativeFileDialogBase *nfd = nativeFileDialog()) - nfd->setNameFilters(filters); -} - void QWindowsFileDialogHelper::selectNameFilter(const QString &filter) { m_data.setSelectedNameFilter(filter); @@ -1643,8 +1641,8 @@ private: explicit QWindowsXpNativeFileDialog(const OptionsPtr &options, const QWindowsFileDialogSharedData &data); void populateOpenFileName(OPENFILENAME *ofn, HWND owner) const; - QStringList execExistingDir(HWND owner); - QStringList execFileNames(HWND owner, int *selectedFilterIndex) const; + QList execExistingDir(HWND owner); + QList execFileNames(HWND owner, int *selectedFilterIndex) const; const OptionsPtr m_options; QString m_title; @@ -1683,7 +1681,7 @@ QWindowsXpNativeFileDialog::QWindowsXpNativeFileDialog(const OptionsPtr &options void QWindowsXpNativeFileDialog::exec(HWND owner) { int selectedFilterIndex = -1; - const QStringList selectedFiles = + const QList selectedFiles = m_options->fileMode() == QFileDialogOptions::DirectoryOnly ? execExistingDir(owner) : execFileNames(owner, &selectedFilterIndex); m_data.setSelectedFiles(selectedFiles); @@ -1695,7 +1693,8 @@ void QWindowsXpNativeFileDialog::exec(HWND owner) const QStringList nameFilters = m_options->nameFilters(); if (selectedFilterIndex >= 0 && selectedFilterIndex < nameFilters.size()) m_data.setSelectedNameFilter(nameFilters.at(selectedFilterIndex)); - m_data.setDirectory(QFileInfo(selectedFiles.front()).absolutePath()); + QUrl firstFile = selectedFiles.front(); + m_data.setDirectory(firstFile.adjusted(QUrl::RemoveFilename)); m_result = QPlatformDialogHelper::Accepted; emit accepted(); } @@ -1722,7 +1721,7 @@ int QWindowsXpNativeFileDialog::existingDirCallback(HWND hwnd, UINT uMsg, LPARAM case BFFM_INITIALIZED: { if (!m_title.isEmpty()) SetWindowText(hwnd, (wchar_t *)m_title.utf16()); - const QString initialFile = QDir::toNativeSeparators(m_data.directory()); + const QString initialFile = QDir::toNativeSeparators(m_data.directory().toLocalFile()); if (!initialFile.isEmpty()) SendMessage(hwnd, BFFM_SETSELECTION, TRUE, LPARAM(initialFile.utf16())); } @@ -1738,7 +1737,7 @@ int QWindowsXpNativeFileDialog::existingDirCallback(HWND hwnd, UINT uMsg, LPARAM return 0; } -QStringList QWindowsXpNativeFileDialog::execExistingDir(HWND owner) +QList QWindowsXpNativeFileDialog::execExistingDir(HWND owner) { BROWSEINFO bi; wchar_t initPath[MAX_PATH]; @@ -1750,12 +1749,12 @@ QStringList QWindowsXpNativeFileDialog::execExistingDir(HWND owner) bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_NEWDIALOGSTYLE; bi.lpfn = xpFileDialogGetExistingDirCallbackProc; bi.lParam = LPARAM(this); - QStringList selectedFiles; + QList selectedFiles; if (qt_LpItemIdList pItemIDList = SHBrowseForFolder(&bi)) { wchar_t path[MAX_PATH]; path[0] = 0; if (SHGetPathFromIDList(pItemIDList, path) && path[0]) - selectedFiles.push_back(QDir::cleanPath(QString::fromWCharArray(path))); + selectedFiles.push_back(QUrl::fromLocalFile(QDir::cleanPath(QString::fromWCharArray(path)))); IMalloc *pMalloc; if (SHGetMalloc(&pMalloc) == NOERROR) { pMalloc->Free(pItemIDList); @@ -1807,7 +1806,7 @@ void QWindowsXpNativeFileDialog::populateOpenFileName(OPENFILENAME *ofn, HWND ow QDir::toNativeSeparators(m_data.selectedFile()).remove(QLatin1Char('<')). remove(QLatin1Char('>')).remove(QLatin1Char('"')).remove(QLatin1Char('|')); ofn->lpstrFile = qStringToWCharArray(initiallySelectedFile, ofn->nMaxFile); - ofn->lpstrInitialDir = qStringToWCharArray(QDir::toNativeSeparators(m_data.directory())); + ofn->lpstrInitialDir = qStringToWCharArray(QDir::toNativeSeparators(m_data.directory().toLocalFile())); ofn->lpstrTitle = (wchar_t*)m_title.utf16(); // Determine lpstrDefExt. Note that the current MSDN docs document this // member wrong. It should rather be documented as "the default extension @@ -1832,25 +1831,27 @@ void QWindowsXpNativeFileDialog::populateOpenFileName(OPENFILENAME *ofn, HWND ow ofn->Flags |= OFN_OVERWRITEPROMPT; } -QStringList QWindowsXpNativeFileDialog::execFileNames(HWND owner, int *selectedFilterIndex) const +QList QWindowsXpNativeFileDialog::execFileNames(HWND owner, int *selectedFilterIndex) const { *selectedFilterIndex = -1; OPENFILENAME ofn; populateOpenFileName(&ofn, owner); - QStringList result; + QList result; const bool isSave = m_options->acceptMode() == QFileDialogOptions::AcceptSave; if (isSave ? m_getSaveFileNameW(&ofn) : m_getOpenFileNameW(&ofn)) { *selectedFilterIndex = ofn.nFilterIndex - 1; - result.push_back(QDir::cleanPath(QString::fromWCharArray(ofn.lpstrFile))); + const QString dir = QDir::cleanPath(QString::fromWCharArray(ofn.lpstrFile)); + result.push_back(QUrl::fromLocalFile(dir)); // For multiselection, the first item is the path followed // by "\0\0\0\0". if (ofn.Flags & (OFN_ALLOWMULTISELECT)) { - wchar_t *ptr = ofn.lpstrFile + result.front().size() + 1; + wchar_t *ptr = ofn.lpstrFile + dir.size() + 1; if (*ptr) { - const QString path = result.takeAt(0) + QLatin1Char('/'); + result.pop_front(); + const QString path = dir + QLatin1Char('/'); while (*ptr) { const QString fileName = QString::fromWCharArray(ptr); - result.push_back(path + fileName); + result.push_back(QUrl::fromLocalFile(path + fileName)); ptr += fileName.size() + 1; } // extract multiple files } // has multiple files @@ -1879,14 +1880,13 @@ public: virtual bool supportsNonModalDialog(const QWindow * /* parent */ = 0) const { return false; } virtual bool defaultNameFilterDisables() const { return true; } - virtual void setDirectory(const QString &directory); - virtual QString directory() const; - virtual void selectFile(const QString &filename); - virtual QStringList selectedFiles() const; - virtual void setFilter() {} - virtual void setNameFilters(const QStringList &); - virtual void selectNameFilter(const QString &); - virtual QString selectedNameFilter() const; + virtual void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; + virtual QUrl directory() const Q_DECL_OVERRIDE; + virtual void selectFile(const QUrl &url) Q_DECL_OVERRIDE; + virtual QList selectedFiles() const Q_DECL_OVERRIDE; + virtual void setFilter() Q_DECL_OVERRIDE {} + virtual void selectNameFilter(const QString &) Q_DECL_OVERRIDE; + virtual QString selectedNameFilter() const Q_DECL_OVERRIDE; private: virtual QWindowsNativeDialogBase *createNativeDialog(); @@ -1907,31 +1907,26 @@ QWindowsNativeDialogBase *QWindowsXpFileDialogHelper::createNativeDialog() return 0; } -void QWindowsXpFileDialogHelper::setDirectory(const QString &directory) +void QWindowsXpFileDialogHelper::setDirectory(const QUrl &directory) { m_data.setDirectory(directory); // Dialog cannot be updated at run-time. } -QString QWindowsXpFileDialogHelper::directory() const +QUrl QWindowsXpFileDialogHelper::directory() const { return m_data.directory(); } -void QWindowsXpFileDialogHelper::selectFile(const QString &filename) +void QWindowsXpFileDialogHelper::selectFile(const QUrl &url) { - m_data.setSelectedFiles(QStringList(filename)); // Dialog cannot be updated at run-time. + m_data.setSelectedFiles(QList() << url); // Dialog cannot be updated at run-time. } -QStringList QWindowsXpFileDialogHelper::selectedFiles() const +QList QWindowsXpFileDialogHelper::selectedFiles() const { return m_data.selectedFiles(); } -void QWindowsXpFileDialogHelper::setNameFilters(const QStringList &) -{ - // Dialog cannot be updated at run-time. -} - void QWindowsXpFileDialogHelper::selectNameFilter(const QString &f) { m_data.setSelectedNameFilter(f); // Dialog cannot be updated at run-time. diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp index 77a78d2140..4e9cc446b3 100644 --- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp +++ b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp @@ -282,13 +282,13 @@ bool QGtk2FileDialogHelper::defaultNameFilterDisables() const return false; } -void QGtk2FileDialogHelper::setDirectory(const QString &directory) +void QGtk2FileDialogHelper::setDirectory(const QUrl &directory) { GtkDialog *gtkDialog = d->gtkDialog(); - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(gtkDialog), directory.toUtf8()); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(gtkDialog), directory.toLocalFile().toUtf8()); } -QString QGtk2FileDialogHelper::directory() const +QUrl QGtk2FileDialogHelper::directory() const { // While GtkFileChooserDialog is hidden, gtk_file_chooser_get_current_folder() // returns a bogus value -> return the cached value before hiding @@ -302,27 +302,27 @@ QString QGtk2FileDialogHelper::directory() const ret = QString::fromUtf8(folder); g_free(folder); } - return ret; + return QUrl::fromLocalFile(ret); } -void QGtk2FileDialogHelper::selectFile(const QString &filename) +void QGtk2FileDialogHelper::selectFile(const QUrl &filename) { GtkDialog *gtkDialog = d->gtkDialog(); - gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(gtkDialog), filename.toUtf8()); + gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(gtkDialog), filename.toLocalFile().toUtf8()); } -QStringList QGtk2FileDialogHelper::selectedFiles() const +QList QGtk2FileDialogHelper::selectedFiles() const { // While GtkFileChooserDialog is hidden, gtk_file_chooser_get_filenames() // returns a bogus value -> return the cached value before hiding if (!_selection.isEmpty()) return _selection; - QStringList selection; + QList selection; GtkDialog *gtkDialog = d->gtkDialog(); GSList *filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(gtkDialog)); for (GSList *it = filenames; it; it = it->next) - selection += QString::fromUtf8((const char*)it->data); + selection += QUrl::fromLocalFile(QString::fromUtf8((const char*)it->data)); g_slist_free(filenames); return selection; } @@ -356,7 +356,7 @@ void QGtk2FileDialogHelper::onAccepted() if (filter.isEmpty()) emit filterSelected(filter); - QStringList files = selectedFiles(); + QList files = selectedFiles(); emit filesSelected(files); if (files.count() == 1) emit fileSelected(files.first()); @@ -370,7 +370,7 @@ void QGtk2FileDialogHelper::onSelectionChanged(GtkDialog *gtkDialog, QGtk2FileDi selection = QString::fromUtf8(filename); g_free(filename); } - emit helper->currentChanged(selection); + emit helper->currentChanged(QUrl::fromLocalFile(selection)); } void QGtk2FileDialogHelper::onCurrentFolderChanged(QGtk2FileDialogHelper *dialog) @@ -419,12 +419,12 @@ void QGtk2FileDialogHelper::applyOptions() if (!nameFilters.isEmpty()) setNameFilters(nameFilters); - const QString initialDirectory = opts->initialDirectory(); + const QString initialDirectory = opts->initialDirectory().toLocalFile(); if (!initialDirectory.isEmpty()) setDirectory(initialDirectory); - foreach (const QString &filename, opts->initiallySelectedFiles()) - selectFile(filename); + foreach (const QUrl &filename, opts->initiallySelectedFiles()) + selectFile(filename.toLocalFile()); const QString initialNameFilter = opts->initiallySelectedNameFilter(); if (!initialNameFilter.isEmpty()) diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.h b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.h index c2d12625f5..47a6153fbc 100644 --- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.h +++ b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.h @@ -90,10 +90,10 @@ public: void hide(); bool defaultNameFilterDisables() const; - void setDirectory(const QString &directory); - QString directory() const; - void selectFile(const QString &filename); - QStringList selectedFiles() const; + void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; + QUrl directory() const Q_DECL_OVERRIDE; + void selectFile(const QUrl &filename) Q_DECL_OVERRIDE; + QList selectedFiles() const Q_DECL_OVERRIDE; void setFilter(); void selectNameFilter(const QString &filter); QString selectedNameFilter() const; @@ -107,8 +107,8 @@ private: void applyOptions(); void setNameFilters(const QStringList &filters); - QString _dir; - QStringList _selection; + QUrl _dir; + QList _selection; QHash _filters; QHash _filterNames; QScopedPointer d; diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index ff8303bca4..70bcdbb994 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -549,11 +549,10 @@ QFileDialogPrivate::~QFileDialogPrivate() void QFileDialogPrivate::initHelper(QPlatformDialogHelper *h) { QFileDialog *d = q_func(); - QObject::connect(h, SIGNAL(fileSelected(QString)), d, SIGNAL(fileSelected(QString))); - QObject::connect(h, SIGNAL(filesSelected(QStringList)), d, SIGNAL(filesSelected(QStringList))); - QObject::connect(h, SIGNAL(currentChanged(QString)), d, SIGNAL(currentChanged(QString))); - QObject::connect(h, SIGNAL(directoryEntered(QString)), d, SIGNAL(directoryEntered(QString))); - QObject::connect(h, SIGNAL(directoryEntered(QString)), d, SLOT(_q_nativeEnterDirectory(QString))); + QObject::connect(h, SIGNAL(fileSelected(QUrl)), d, SLOT(_q_nativeFileSelected(QUrl))); + QObject::connect(h, SIGNAL(filesSelected(QList)), d, SLOT(_q_nativeFilesSelected(QList))); + QObject::connect(h, SIGNAL(currentChanged(QUrl)), d, SLOT(_q_nativeCurrentChanged(QUrl))); + QObject::connect(h, SIGNAL(directoryEntered(QUrl)), d, SLOT(_q_nativeEnterDirectory(QUrl))); QObject::connect(h, SIGNAL(filterSelected(QString)), d, SIGNAL(filterSelected(QString))); static_cast(h)->setOptions(options); } @@ -567,8 +566,8 @@ void QFileDialogPrivate::helperPrepareShow(QPlatformDialogHelper *) options->setSidebarUrls(qFileDialogUi->sidebar->urls()); const QDir directory = q->directory(); options->setInitialDirectory(directory.exists() ? - directory.absolutePath() : - QString()); + QUrl::fromLocalFile(directory.absolutePath()) : + QUrl()); options->setInitiallySelectedNameFilter(q->selectedNameFilter()); options->setInitiallySelectedFiles(userSelectedFiles()); } @@ -876,7 +875,7 @@ void QFileDialog::setDirectory(const QString &directory) d->setLastVisitedDirectory(newDirectory); if (d->nativeDialogInUse){ - d->setDirectory_sys(newDirectory); + d->setDirectory_sys(QUrl::fromLocalFile(newDirectory)); return; } if (d->rootPath() == newDirectory) @@ -901,7 +900,7 @@ void QFileDialog::setDirectory(const QString &directory) QDir QFileDialog::directory() const { Q_D(const QFileDialog); - return QDir(d->nativeDialogInUse ? d->directory_sys() : d->rootPath()); + return QDir(d->nativeDialogInUse ? d->directory_sys().toLocalFile() : d->rootPath()); } /*! @@ -916,7 +915,7 @@ void QFileDialog::selectFile(const QString &filename) return; if (d->nativeDialogInUse){ - d->selectFile_sys(filename); + d->selectFile_sys(QUrl::fromLocalFile(filename)); return; } @@ -1041,17 +1040,19 @@ QStringList QFileDialogPrivate::typedFiles() const // Return selected files without defaulting to the root of the file system model // used for initializing QFileDialogOptions for native dialogs. The default is // not suitable for native dialogs since it mostly equals directory(). -QStringList QFileDialogPrivate::userSelectedFiles() const +QList QFileDialogPrivate::userSelectedFiles() const { + QList files; + if (nativeDialogInUse) - return addDefaultSuffixToFiles(selectedFiles_sys()); + return addDefaultSuffixToUrls(selectedFiles_sys()); - QStringList files; foreach (const QModelIndex &index, qFileDialogUi->listView->selectionModel()->selectedRows()) - files.append(index.data(QFileSystemModel::FilePathRole).toString()); + files.append(QUrl::fromLocalFile(index.data(QFileSystemModel::FilePathRole).toString())); if (files.isEmpty() && !lineEdit()->text().isEmpty()) - files = typedFiles(); + foreach (const QString &path, typedFiles()) + files.append(QUrl::fromLocalFile(path)); return files; } @@ -1082,6 +1083,20 @@ QStringList QFileDialogPrivate::addDefaultSuffixToFiles(const QStringList filesT return files; } +QList QFileDialogPrivate::addDefaultSuffixToUrls(const QList &urlsToFix) const +{ + QList urls; + for (int i=0; idefaultSuffix(); + if (!defaultSuffix.isEmpty() && !url.path().endsWith(QLatin1Char('/')) && url.path().lastIndexOf(QLatin1Char('.')) == -1) + url.setPath(url.path() + QLatin1Char('.') + defaultSuffix); + urls.append(url); + } + return urls; +} + /*! Returns a list of strings containing the absolute paths of the @@ -1094,7 +1109,9 @@ QStringList QFileDialog::selectedFiles() const { Q_D(const QFileDialog); - QStringList files = d->userSelectedFiles(); + QStringList files; + foreach (const QUrl &file, d->userSelectedFiles()) + files.append(file.toLocalFile()); if (files.isEmpty()) { const FileMode fm = fileMode(); if (fm != ExistingFile && fm != ExistingFiles) @@ -3320,10 +3337,38 @@ void QFileDialogPrivate::_q_fileRenamed(const QString &path, const QString oldNa } } -void QFileDialogPrivate::_q_nativeEnterDirectory(const QString &directory) +void QFileDialogPrivate::_q_nativeFileSelected(const QUrl &file) { - if (!directory.isEmpty()) // Windows native dialogs occasionally emit signals with empty strings. - *lastVisitedDir() = directory; + Q_Q(QFileDialog); + if (file.isLocalFile()) + emit q->fileSelected(file.toLocalFile()); +} + +void QFileDialogPrivate::_q_nativeFilesSelected(const QList &files) +{ + Q_Q(QFileDialog); + QStringList localFiles; + foreach (const QUrl &file, files) + if (file.isLocalFile()) + localFiles.append(file.toLocalFile()); + if (!localFiles.isEmpty()) + emit q->filesSelected(localFiles); +} + +void QFileDialogPrivate::_q_nativeCurrentChanged(const QUrl &file) +{ + Q_Q(QFileDialog); + if (file.isLocalFile()) + emit q->currentChanged(file.toLocalFile()); +} + +void QFileDialogPrivate::_q_nativeEnterDirectory(const QUrl &directory) +{ + Q_Q(QFileDialog); + if (!directory.isEmpty() && directory.isLocalFile()) { // Windows native dialogs occasionally emit signals with empty strings. + *lastVisitedDir() = directory.toLocalFile(); + emit q->directoryEntered(directory.toLocalFile()); + } } /*! diff --git a/src/widgets/dialogs/qfiledialog.h b/src/widgets/dialogs/qfiledialog.h index 6b12a00ae6..2c0f6f702d 100644 --- a/src/widgets/dialogs/qfiledialog.h +++ b/src/widgets/dialogs/qfiledialog.h @@ -271,7 +271,10 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_updateOkButton()) Q_PRIVATE_SLOT(d_func(), void _q_currentChanged(const QModelIndex &index)) Q_PRIVATE_SLOT(d_func(), void _q_enterDirectory(const QModelIndex &index)) - Q_PRIVATE_SLOT(d_func(), void _q_nativeEnterDirectory(const QString&)) + Q_PRIVATE_SLOT(d_func(), void _q_nativeFileSelected(const QUrl &)) + Q_PRIVATE_SLOT(d_func(), void _q_nativeFilesSelected(const QList &)) + Q_PRIVATE_SLOT(d_func(), void _q_nativeCurrentChanged(const QUrl &)) + Q_PRIVATE_SLOT(d_func(), void _q_nativeEnterDirectory(const QUrl&)) Q_PRIVATE_SLOT(d_func(), void _q_goToDirectory(const QString &path)) Q_PRIVATE_SLOT(d_func(), void _q_useNameFilter(int index)) Q_PRIVATE_SLOT(d_func(), void _q_selectionChanged()) diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index f8f33eb18d..e5a558bb91 100644 --- a/src/widgets/dialogs/qfiledialog_p.h +++ b/src/widgets/dialogs/qfiledialog_p.h @@ -130,8 +130,9 @@ public: static QString workingDirectory(const QString &path); static QString initialSelection(const QString &path); QStringList typedFiles() const; - QStringList userSelectedFiles() const; + QList userSelectedFiles() const; QStringList addDefaultSuffixToFiles(const QStringList filesToFix) const; + QList addDefaultSuffixToUrls(const QList &urlsToFix) const; bool removeDirectory(const QString &path); void setLabelTextControl(QFileDialog::DialogLabel label, const QString &text); inline void updateFileNameLabel(); @@ -206,7 +207,10 @@ public: void _q_updateOkButton(); void _q_currentChanged(const QModelIndex &index); void _q_enterDirectory(const QModelIndex &index); - void _q_nativeEnterDirectory(const QString &directory); + void _q_nativeFileSelected(const QUrl &file); + void _q_nativeFilesSelected(const QList &files); + void _q_nativeCurrentChanged(const QUrl &file); + void _q_nativeEnterDirectory(const QUrl &directory); void _q_goToDirectory(const QString &); void _q_useNameFilter(int index); void _q_selectionChanged(); @@ -246,10 +250,10 @@ public: // used instead. bool canBeNativeDialog(); - void setDirectory_sys(const QString &directory); - QString directory_sys() const; - void selectFile_sys(const QString &filename); - QStringList selectedFiles_sys() const; + void setDirectory_sys(const QUrl &directory); + QUrl directory_sys() const; + void selectFile_sys(const QUrl &filename); + QList selectedFiles_sys() const; void setFilter_sys(); void selectNameFilter_sys(const QString &filter); QString selectedNameFilter_sys() const; @@ -346,30 +350,40 @@ inline QString QFileDialogPrivate::rootPath() const { return model->rootPath(); } -inline void QFileDialogPrivate::setDirectory_sys(const QString &directory) +inline void QFileDialogPrivate::setDirectory_sys(const QUrl &directory) { - if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) + QPlatformFileDialogHelper *helper = platformFileDialogHelper(); + + if (!helper) + return; + + if (helper->isSupportedUrl(directory)) helper->setDirectory(directory); } -inline QString QFileDialogPrivate::directory_sys() const +inline QUrl QFileDialogPrivate::directory_sys() const { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) return helper->directory(); return QString(); } -inline void QFileDialogPrivate::selectFile_sys(const QString &filename) +inline void QFileDialogPrivate::selectFile_sys(const QUrl &filename) { - if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) + QPlatformFileDialogHelper *helper = platformFileDialogHelper(); + + if (!helper) + return; + + if (helper->isSupportedUrl(filename)) helper->selectFile(filename); } -inline QStringList QFileDialogPrivate::selectedFiles_sys() const +inline QList QFileDialogPrivate::selectedFiles_sys() const { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) return helper->selectedFiles(); - return QStringList(); + return QList(); } inline void QFileDialogPrivate::setFilter_sys() -- cgit v1.2.3