From 41d813908a6d178ce15baba32cedef383fa65a51 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Thu, 1 Aug 2013 15:39:56 +0200 Subject: [PATCH] More QUrl/QString conversion in FileDialog implementation MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Followup to 6499098a04c7a8a1193413500cd562f781df38bb : because the signals in QPlatformFileDialogHelper emit URLs and QFileDialog does not provide compatible signals, the bridge class QFileDialogHelper must provide slots to convert strings to URLs and emit the signals. Therefore QFileDialogHelper needs the Q_OBJECT macro, and therefore it helps to move its declaration to the private header to avoid confusing moc. Change-Id: I088ff73d107a460af3f8695401276b45a66b5d59 Reviewed-by: Jan Arve Sæther --- src/imports/dialogs/qquickabstractfiledialog.cpp | 9 +- src/imports/widgets/qquickqfiledialog.cpp | 132 ++++++++++++----------- src/imports/widgets/qquickqfiledialog_p.h | 29 +++++ 3 files changed, 102 insertions(+), 68 deletions(-) diff --git a/src/imports/dialogs/qquickabstractfiledialog.cpp b/src/imports/dialogs/qquickabstractfiledialog.cpp index e415ebc..3a0d5baa 100644 --- a/src/imports/dialogs/qquickabstractfiledialog.cpp +++ b/src/imports/dialogs/qquickabstractfiledialog.cpp @@ -115,10 +115,9 @@ QUrl QQuickAbstractFileDialog::folder() void QQuickAbstractFileDialog::setFolder(const QUrl &f) { - QString dir = f.path(); if (m_dlgHelper) - m_dlgHelper->setDirectory(dir); - m_options->setInitialDirectory(dir); + m_dlgHelper->setDirectory(f); + m_options->setInitialDirectory(f); emit folderChanged(); } @@ -159,7 +158,9 @@ QUrl QQuickAbstractFileDialog::fileUrl() QList QQuickAbstractFileDialog::fileUrls() { - return m_dlgHelper->selectedFiles(); + if (m_dlgHelper) + return m_dlgHelper->selectedFiles(); + return QList(); } void QQuickAbstractFileDialog::updateModes() diff --git a/src/imports/widgets/qquickqfiledialog.cpp b/src/imports/widgets/qquickqfiledialog.cpp index 7446887..c3991b4 100644 --- a/src/imports/widgets/qquickqfiledialog.cpp +++ b/src/imports/widgets/qquickqfiledialog.cpp @@ -50,68 +50,6 @@ QT_BEGIN_NAMESPACE -class QFileDialogHelper : public QPlatformFileDialogHelper -{ -public: - QFileDialogHelper() : - QPlatformFileDialogHelper() - { - connect(&m_dialog, SIGNAL(currentChanged(const QString&)), this, SIGNAL(currentChanged(const QString&))); - connect(&m_dialog, SIGNAL(directoryEntered(const QString&)), this, SIGNAL(directoryEntered(const QString&))); - connect(&m_dialog, SIGNAL(fileSelected(const QString&)), this, SIGNAL(fileSelected(const QString&))); - connect(&m_dialog, SIGNAL(filesSelected(const QStringList&)), this, SIGNAL(filesSelected(const QStringList&))); - connect(&m_dialog, SIGNAL(filterSelected(const QString&)), this, SIGNAL(filterSelected(const QString&))); - connect(&m_dialog, SIGNAL(accepted()), this, SIGNAL(accept())); - connect(&m_dialog, SIGNAL(rejected()), this, SIGNAL(reject())); - } - - virtual bool defaultNameFilterDisables() const { return true; } - virtual void setDirectory(const QUrl &dir) { m_dialog.setDirectoryUrl(dir); } - virtual QUrl directory() const { return m_dialog.directoryUrl(); } - virtual void selectFile(const QUrl &f) { m_dialog.selectUrl(f); } - virtual QList selectedFiles() const; - - virtual void setFilter() { - m_dialog.setWindowTitle(QPlatformFileDialogHelper::options()->windowTitle()); - if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::LookIn)) - m_dialog.setLabelText(m_dialog.LookIn, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::LookIn)); - if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::FileName)) - m_dialog.setLabelText(m_dialog.FileName, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::FileName)); - if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::FileType)) - m_dialog.setLabelText(m_dialog.FileType, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::FileType)); - if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::Accept)) - m_dialog.setLabelText(m_dialog.Accept, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::Accept)); - if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::Reject)) - m_dialog.setLabelText(m_dialog.Reject, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::Reject)); - m_dialog.setFilter(QPlatformFileDialogHelper::options()->filter()); - m_dialog.setNameFilters(QPlatformFileDialogHelper::options()->nameFilters()); - m_dialog.selectNameFilter(QPlatformFileDialogHelper::options()->initiallySelectedNameFilter()); - m_dialog.setFileMode(QFileDialog::FileMode(QPlatformFileDialogHelper::options()->fileMode())); - m_dialog.setOptions((QFileDialog::Options)((int)(QPlatformFileDialogHelper::options()->options()))); - m_dialog.setAcceptMode(QFileDialog::AcceptMode(QPlatformFileDialogHelper::options()->acceptMode())); - } - - virtual void selectNameFilter(const QString &f) { m_dialog.selectNameFilter(f); } - virtual QString selectedNameFilter() const { return m_dialog.selectedNameFilter(); } - virtual void exec() { m_dialog.exec(); } - - virtual bool show(Qt::WindowFlags f, Qt::WindowModality m, QWindow *parent) { - m_dialog.winId(); - QWindow *window = m_dialog.windowHandle(); - Q_ASSERT(window); - window->setTransientParent(parent); - window->setFlags(f); - m_dialog.setWindowModality(m); - m_dialog.show(); - return m_dialog.isVisible(); - } - - virtual void hide() { m_dialog.hide(); } - -private: - QFileDialog m_dialog; -}; - /*! \qmltype QtFileDialog \instantiates QQuickQFileDialog @@ -190,8 +128,8 @@ QPlatformFileDialogHelper *QQuickQFileDialog::helper() if (!m_dlgHelper) { m_dlgHelper = new QFileDialogHelper(); - connect(m_dlgHelper, SIGNAL(directoryEntered(QString)), this, SIGNAL(folderChanged())); - connect(m_dlgHelper, SIGNAL(filterSelected(QString)), this, SIGNAL(filterSelected())); + connect(m_dlgHelper, SIGNAL(directoryEntered(const QUrl &)), this, SIGNAL(folderChanged())); + connect(m_dlgHelper, SIGNAL(filterSelected(const QString &)), this, SIGNAL(filterSelected())); connect(m_dlgHelper, SIGNAL(accept()), this, SLOT(accept())); connect(m_dlgHelper, SIGNAL(reject()), this, SLOT(reject())); } @@ -199,9 +137,75 @@ QPlatformFileDialogHelper *QQuickQFileDialog::helper() return m_dlgHelper; } +QFileDialogHelper::QFileDialogHelper() : + QPlatformFileDialogHelper() +{ + connect(&m_dialog, SIGNAL(currentChanged(const QString&)), this, SLOT(currentChanged(const QString&))); + connect(&m_dialog, SIGNAL(directoryEntered(const QString&)), this, SLOT(directoryEntered(const QString&))); + connect(&m_dialog, SIGNAL(fileSelected(const QString&)), this, SLOT(fileSelected(const QString&))); + connect(&m_dialog, SIGNAL(filesSelected(const QStringList&)), this, SLOT(filesSelected(const QStringList&))); + connect(&m_dialog, SIGNAL(filterSelected(const QString&)), this, SIGNAL(filterSelected(const QString&))); + connect(&m_dialog, SIGNAL(accepted()), this, SIGNAL(accept())); + connect(&m_dialog, SIGNAL(rejected()), this, SIGNAL(reject())); +} + QList QFileDialogHelper::selectedFiles() const { return m_dialog.selectedUrls(); } +void QFileDialogHelper::setFilter() { + m_dialog.setWindowTitle(QPlatformFileDialogHelper::options()->windowTitle()); + if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::LookIn)) + m_dialog.setLabelText(m_dialog.LookIn, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::LookIn)); + if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::FileName)) + m_dialog.setLabelText(m_dialog.FileName, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::FileName)); + if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::FileType)) + m_dialog.setLabelText(m_dialog.FileType, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::FileType)); + if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::Accept)) + m_dialog.setLabelText(m_dialog.Accept, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::Accept)); + if (QPlatformFileDialogHelper::options()->isLabelExplicitlySet(QFileDialogOptions::Reject)) + m_dialog.setLabelText(m_dialog.Reject, QPlatformFileDialogHelper::options()->labelText(QFileDialogOptions::Reject)); + m_dialog.setFilter(QPlatformFileDialogHelper::options()->filter()); + m_dialog.setNameFilters(QPlatformFileDialogHelper::options()->nameFilters()); + m_dialog.selectNameFilter(QPlatformFileDialogHelper::options()->initiallySelectedNameFilter()); + m_dialog.setFileMode(QFileDialog::FileMode(QPlatformFileDialogHelper::options()->fileMode())); + m_dialog.setOptions((QFileDialog::Options)((int)(QPlatformFileDialogHelper::options()->options()))); + m_dialog.setAcceptMode(QFileDialog::AcceptMode(QPlatformFileDialogHelper::options()->acceptMode())); +} + +bool QFileDialogHelper::show(Qt::WindowFlags f, Qt::WindowModality m, QWindow *parent) { + m_dialog.winId(); + QWindow *window = m_dialog.windowHandle(); + Q_ASSERT(window); + window->setTransientParent(parent); + window->setFlags(f); + m_dialog.setWindowModality(m); + m_dialog.show(); + return m_dialog.isVisible(); +} + +void QFileDialogHelper::currentChanged(const QString& path) +{ + emit QPlatformFileDialogHelper::currentChanged(QUrl::fromLocalFile(path)); +} + +void QFileDialogHelper::directoryEntered(const QString& path) +{ + emit QPlatformFileDialogHelper::directoryEntered(QUrl::fromLocalFile(path)); +} + +void QFileDialogHelper::fileSelected(const QString& path) +{ + emit QPlatformFileDialogHelper::fileSelected(QUrl::fromLocalFile(path)); +} + +void QFileDialogHelper::filesSelected(const QStringList& paths) +{ + QList pathUrls; + foreach (const QString &path, paths) + pathUrls << QUrl::fromLocalFile(path); + emit QPlatformFileDialogHelper::filesSelected(pathUrls); +} + QT_END_NAMESPACE diff --git a/src/imports/widgets/qquickqfiledialog_p.h b/src/imports/widgets/qquickqfiledialog_p.h index 73067f7..8bf7c73 100644 --- a/src/imports/widgets/qquickqfiledialog_p.h +++ b/src/imports/widgets/qquickqfiledialog_p.h @@ -53,6 +53,7 @@ // We mean it. // +#include #include "../dialogs/qquickabstractfiledialog_p.h" QT_BEGIN_NAMESPACE @@ -71,6 +72,34 @@ protected: Q_DISABLE_COPY(QQuickQFileDialog) }; +class QFileDialogHelper : public QPlatformFileDialogHelper +{ + Q_OBJECT +public: + QFileDialogHelper(); + + bool defaultNameFilterDisables() const Q_DECL_OVERRIDE { return true; } + void setDirectory(const QUrl &dir) Q_DECL_OVERRIDE { m_dialog.setDirectoryUrl(dir); } + QUrl directory() const Q_DECL_OVERRIDE { return m_dialog.directoryUrl(); } + void selectFile(const QUrl &f) Q_DECL_OVERRIDE { m_dialog.selectUrl(f); } + QList selectedFiles() const Q_DECL_OVERRIDE; + void setFilter() Q_DECL_OVERRIDE; + void selectNameFilter(const QString &f) Q_DECL_OVERRIDE { m_dialog.selectNameFilter(f); } + QString selectedNameFilter() const Q_DECL_OVERRIDE { return m_dialog.selectedNameFilter(); } + void exec() Q_DECL_OVERRIDE { m_dialog.exec(); } + bool show(Qt::WindowFlags f, Qt::WindowModality m, QWindow *parent) Q_DECL_OVERRIDE; + void hide() Q_DECL_OVERRIDE { m_dialog.hide(); } + +private slots: + void currentChanged(const QString& path); + void directoryEntered(const QString& path); + void fileSelected(const QString& path); + void filesSelected(const QStringList& paths); + +private: + QFileDialog m_dialog; +}; + QT_END_NAMESPACE QML_DECLARE_TYPE(QQuickQFileDialog *) -- 2.7.4