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 <Friedemann.Kleint@digia.com>
bb10
Kevin Ottens 2013-05-15 16:22:39 +02:00 committed by The Qt Project
parent c96a6ab627
commit f5dbc87637
13 changed files with 308 additions and 231 deletions

View File

@ -376,9 +376,9 @@ public:
QStringList nameFilters;
QString defaultSuffix;
QStringList history;
QString initialDirectory;
QUrl initialDirectory;
QString initiallySelectedNameFilter;
QStringList initiallySelectedFiles;
QList<QUrl> 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<QUrl> QFileDialogOptions::initiallySelectedFiles() const
{
return d->initiallySelectedFiles;
}
void QFileDialogOptions::setInitiallySelectedFiles(const QStringList &files)
void QFileDialogOptions::setInitiallySelectedFiles(const QList<QUrl> &files)
{
d->initiallySelectedFiles = files;
}
bool QPlatformFileDialogHelper::isSupportedUrl(const QUrl &url) const
{
return url.isLocalFile();
}
/*!
\class QPlatformFileDialogHelper
\since 5.0

View File

@ -57,6 +57,7 @@
#include <QtCore/QSharedDataPointer>
#include <QtCore/QSharedPointer>
#include <QtCore/QDir>
#include <QtCore/QUrl>
#include <QtGui/QRgb>
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<QUrl> initiallySelectedFiles() const;
void setInitiallySelectedFiles(const QList<QUrl> &);
private:
QSharedDataPointer<QFileDialogOptionsPrivate> 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<QUrl> 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<QFileDialogOptions> &options() const;
void setOptions(const QSharedPointer<QFileDialogOptions> &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<QUrl> &files);
void currentChanged(const QUrl &path);
void directoryEntered(const QUrl &directory);
void filterSelected(const QString &filter);
private:

View File

@ -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<QUrl> selectedFiles() const Q_DECL_OVERRIDE;
void setFilter();
void selectNameFilter(const QString &filter);
QString selectedNameFilter() const;

View File

@ -393,18 +393,20 @@ static QString strippedText(QString s)
return mNameFilterDropDownList->value([mPopUpButton indexOfSelectedItem]);
}
- (QStringList)selectedFiles
- (QList<QUrl>)selectedFiles
{
if (mOpenPanel) {
QStringList result;
QList<QUrl> 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<QUrl> 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<QNSOpenSavePanelDelegate *>(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<QNSOpenSavePanelDelegate *>(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<QUrl> QCocoaFileDialogHelper::selectedFiles() const
{
QNSOpenSavePanelDelegate *delegate = static_cast<QNSOpenSavePanelDelegate *>(mDelegate);
if (delegate)
return [delegate selectedFiles];
return QStringList();
return QList<QUrl>();
}
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<QUrl> 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

View File

@ -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<QUrl> 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<QUrl> m_paths;
#endif
};

View File

@ -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<QUrl> QQnxFileDialogHelper::selectedFiles() const
{
qFileDialogHelperDebug() << Q_FUNC_INFO;
return m_dialog->selectedFiles();
QList<QUrl> urls;
QStringList files = m_dialog->selectedFiles();
Q_FOREACH (const QString &file, files)
urls.append(QUrl::fromLocalFile(file));
return urls;
}
void QQnxFileDialogHelper::setFilter()

View File

@ -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<QUrl> QQnxFileDialogHelper::selectedFiles() const
{
qFileDialogHelperDebug() << Q_FUNC_INFO;
return m_paths;

View File

@ -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<QFileDialogOptions> &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<QUrl> selectedFiles() const;
void setSelectedFiles(const QList<QUrl> &);
QString selectedFile() const;
private:
class Data : public QSharedData {
public:
QString directory;
QUrl directory;
QString selectedNameFilter;
QStringList selectedFiles;
QList<QUrl> selectedFiles;
QMutex mutex;
};
QExplicitlySharedDataPointer<Data> 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<QUrl> QWindowsFileDialogSharedData::selectedFiles() const
{
m_data->mutex.lock();
const QStringList result = m_data->selectedFiles;
const QList<QUrl> 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<QUrl> files = selectedFiles();
return files.isEmpty() ? QString() : files.front().toLocalFile();
}
inline void QWindowsFileDialogSharedData::setSelectedFiles(const QStringList &f)
inline void QWindowsFileDialogSharedData::setSelectedFiles(const QList<QUrl> &urls)
{
QMutexLocker (&m_data->mutex);
m_data->selectedFiles = f;
m_data->selectedFiles = urls;
}
inline void QWindowsFileDialogSharedData::fromOptions(const QSharedPointer<QFileDialogOptions> &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<QUrl> 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<QUrl> 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<QUrl> libraryItemFolders(IShellItem *item);
static QString libraryItemDefaultSaveFolder(IShellItem *item);
static int itemPaths(IShellItemArray *items, QStringList *fileResult = 0);
static int itemPaths(IShellItemArray *items, QList<QUrl> *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<QUrl> QWindowsNativeFileDialogBase::libraryItemFolders(IShellItem *item)
{
QStringList result;
QList<QUrl> 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<void **>(&itemArray)))) {
@ -1062,9 +1064,9 @@ QString QWindowsNativeFileDialogBase::libraryItemDefaultSaveFolder(IShellItem *i
#else // !Q_OS_WINCE && __IShellLibrary_INTERFACE_DEFINED__
QStringList QWindowsNativeFileDialogBase::libraryItemFolders(IShellItem *)
QList<QUrl> QWindowsNativeFileDialogBase::libraryItemFolders(IShellItem *)
{
return QStringList();
return QList<QUrl>();
}
QString QWindowsNativeFileDialogBase::libraryItemDefaultSaveFolder(IShellItem *)
@ -1096,7 +1098,7 @@ QString QWindowsNativeFileDialogBase::itemPath(IShellItem *item)
}
int QWindowsNativeFileDialogBase::itemPaths(IShellItemArray *items,
QStringList *result /* = 0 */)
QList<QUrl> *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<QUrl> 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<QUrl> selectedFiles() const;
virtual QList<QUrl> 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<QUrl> QWindowsNativeSaveFileDialog::dialogResult() const
{
QStringList result;
QList<QUrl> 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<QUrl> QWindowsNativeSaveFileDialog::selectedFiles() const
{
QStringList result;
QList<QUrl> 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<QUrl> selectedFiles() const;
virtual QList<QUrl> dialogResult() const;
private:
inline IFileOpenDialog *openFileDialog() const
{ return static_cast<IFileOpenDialog *>(fileDialog()); }
};
QStringList QWindowsNativeOpenFileDialog::dialogResult() const
QList<QUrl> QWindowsNativeOpenFileDialog::dialogResult() const
{
QStringList result;
QList<QUrl> result;
IShellItemArray *items = 0;
if (SUCCEEDED(openFileDialog()->GetResults(&items)) && items)
QWindowsNativeFileDialogBase::itemPaths(items, &result);
return result;
}
QStringList QWindowsNativeOpenFileDialog::selectedFiles() const
QList<QUrl> QWindowsNativeOpenFileDialog::selectedFiles() const
{
QStringList result;
QList<QUrl> 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<QUrl> 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<QUrl> 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<QUrl> 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<QUrl> execExistingDir(HWND owner);
QList<QUrl> 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<QUrl> 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<QUrl> 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<QUrl> 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<QUrl> QWindowsXpNativeFileDialog::execFileNames(HWND owner, int *selectedFilterIndex) const
{
*selectedFilterIndex = -1;
OPENFILENAME ofn;
populateOpenFileName(&ofn, owner);
QStringList result;
QList<QUrl> 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<file1>\0<file2>\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<QUrl> 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<QUrl>() << url); // Dialog cannot be updated at run-time.
}
QStringList QWindowsXpFileDialogHelper::selectedFiles() const
QList<QUrl> 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.

View File

@ -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<QUrl> 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<QUrl> 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<QUrl> 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())

View File

@ -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<QUrl> 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<QUrl> _selection;
QHash<QString, GtkFileFilter*> _filters;
QHash<GtkFileFilter*, QString> _filterNames;
QScopedPointer<QGtk2Dialog> d;

View File

@ -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<QUrl>)), d, SLOT(_q_nativeFilesSelected(QList<QUrl>)));
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<QPlatformFileDialogHelper *>(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<QUrl> QFileDialogPrivate::userSelectedFiles() const
{
if (nativeDialogInUse)
return addDefaultSuffixToFiles(selectedFiles_sys());
QList<QUrl> files;
if (nativeDialogInUse)
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<QUrl> QFileDialogPrivate::addDefaultSuffixToUrls(const QList<QUrl> &urlsToFix) const
{
QList<QUrl> urls;
for (int i=0; i<urlsToFix.size(); ++i) {
QUrl url = urlsToFix.at(i);
// if the filename has no suffix, add the default suffix
const QString defaultSuffix = options->defaultSuffix();
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<QUrl> &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());
}
}
/*!

View File

@ -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<QUrl> &))
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())

View File

@ -130,8 +130,9 @@ public:
static QString workingDirectory(const QString &path);
static QString initialSelection(const QString &path);
QStringList typedFiles() const;
QStringList userSelectedFiles() const;
QList<QUrl> userSelectedFiles() const;
QStringList addDefaultSuffixToFiles(const QStringList filesToFix) const;
QList<QUrl> addDefaultSuffixToUrls(const QList<QUrl> &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<QUrl> &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<QUrl> 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<QUrl> QFileDialogPrivate::selectedFiles_sys() const
{
if (QPlatformFileDialogHelper *helper = platformFileDialogHelper())
return helper->selectedFiles();
return QStringList();
return QList<QUrl>();
}
inline void QFileDialogPrivate::setFilter_sys()