diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-08-14 11:01:38 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-08-14 09:25:42 +0000 |
commit | 2e09e597ab3df5a13f89e945a0a90724d5c5a3f0 (patch) | |
tree | f671841761cc372ddb1499574172564dd1378505 /src/imports/platform | |
parent | deb0921b8240a0240e595896debb973a6104935a (diff) |
Platform: create platform dialog instances lazily on demand
Change-Id: Ie963cb5c082b49205f7b7244ace3b88254ec37c7
Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
Diffstat (limited to 'src/imports/platform')
-rw-r--r-- | src/imports/platform/qquickplatformcolordialog.cpp | 30 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformcolordialog_p.h | 1 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformdialog.cpp | 41 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformdialog_p.h | 5 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformfiledialog.cpp | 51 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformfiledialog_p.h | 1 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformfolderdialog.cpp | 43 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformfolderdialog_p.h | 1 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformfontdialog.cpp | 30 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformfontdialog_p.h | 1 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformmessagedialog.cpp | 28 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformmessagedialog_p.h | 1 |
12 files changed, 131 insertions, 102 deletions
diff --git a/src/imports/platform/qquickplatformcolordialog.cpp b/src/imports/platform/qquickplatformcolordialog.cpp index c86c0030..b71797f5 100644 --- a/src/imports/platform/qquickplatformcolordialog.cpp +++ b/src/imports/platform/qquickplatformcolordialog.cpp @@ -102,19 +102,6 @@ Q_DECLARE_LOGGING_CATEGORY(qtLabsPlatformDialogs) QQuickPlatformColorDialog::QQuickPlatformColorDialog(QObject *parent) : QQuickPlatformDialog(parent), m_options(QColorDialogOptions::create()) { - QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::ColorDialog); -#ifdef QT_WIDGETS_LIB - if (!dialog) - dialog = new QWidgetPlatformColorDialog(this); -#endif - qCDebug(qtLabsPlatformDialogs) << "ColorDialog:" << dialog; - - if (QPlatformColorDialogHelper *colorDialog = qobject_cast<QPlatformColorDialogHelper *>(dialog)) { - connect(colorDialog, &QPlatformColorDialogHelper::currentColorChanged, this, &QQuickPlatformColorDialog::currentColorChanged); - connect(colorDialog, &QPlatformColorDialogHelper::colorSelected, this, &QQuickPlatformColorDialog::colorSelected); - colorDialog->setOptions(m_options); - } - setHandle(dialog); } /*! @@ -166,6 +153,23 @@ void QQuickPlatformColorDialog::setOptions(QColorDialogOptions::ColorDialogOptio emit optionsChanged(); } +QPlatformDialogHelper *QQuickPlatformColorDialog::createHelper() +{ + QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::ColorDialog); +#ifdef QT_WIDGETS_LIB + if (!dialog) + dialog = new QWidgetPlatformColorDialog(this); +#endif + qCDebug(qtLabsPlatformDialogs) << "ColorDialog:" << dialog; + + if (QPlatformColorDialogHelper *colorDialog = qobject_cast<QPlatformColorDialogHelper *>(dialog)) { + connect(colorDialog, &QPlatformColorDialogHelper::currentColorChanged, this, &QQuickPlatformColorDialog::currentColorChanged); + connect(colorDialog, &QPlatformColorDialogHelper::colorSelected, this, &QQuickPlatformColorDialog::colorSelected); + colorDialog->setOptions(m_options); + } + return dialog; +} + void QQuickPlatformColorDialog::applyOptions() { m_options->setWindowTitle(title()); diff --git a/src/imports/platform/qquickplatformcolordialog_p.h b/src/imports/platform/qquickplatformcolordialog_p.h index 48b4aac1..403582e4 100644 --- a/src/imports/platform/qquickplatformcolordialog_p.h +++ b/src/imports/platform/qquickplatformcolordialog_p.h @@ -76,6 +76,7 @@ Q_SIGNALS: void colorSelected(const QColor &color); protected: + QPlatformDialogHelper *createHelper() override; void applyOptions() override; private: diff --git a/src/imports/platform/qquickplatformdialog.cpp b/src/imports/platform/qquickplatformdialog.cpp index 5f28ca05..68321554 100644 --- a/src/imports/platform/qquickplatformdialog.cpp +++ b/src/imports/platform/qquickplatformdialog.cpp @@ -94,31 +94,16 @@ QQuickPlatformDialog::QQuickPlatformDialog(QObject *parent) QQuickPlatformDialog::~QQuickPlatformDialog() { - delete m_handle; - m_handle = nullptr; + destroy(); } QPlatformDialogHelper *QQuickPlatformDialog::handle() const { + if (!m_handle) + const_cast<QQuickPlatformDialog *>(this)->create(); return m_handle; } -void QQuickPlatformDialog::setHandle(QPlatformDialogHelper *handle) -{ - if (m_handle == handle) - return; - - if (m_handle) { - disconnect(m_handle, &QPlatformDialogHelper::accept, this, &QQuickPlatformDialog::accept); - disconnect(m_handle, &QPlatformDialogHelper::reject, this, &QQuickPlatformDialog::reject); - } - m_handle = handle; - if (handle) { - connect(handle, &QPlatformDialogHelper::accept, this, &QQuickPlatformDialog::accept); - connect(handle, &QPlatformDialogHelper::reject, this, &QQuickPlatformDialog::reject); - } -} - /*! \default \qmlproperty list<Object> Qt.labs.platform::Dialog::data @@ -245,7 +230,7 @@ void QQuickPlatformDialog::setVisible(bool visible) */ void QQuickPlatformDialog::open() { - if (!m_handle || m_visible) + if (m_visible || !create()) return; applyOptions(); @@ -308,6 +293,24 @@ void QQuickPlatformDialog::componentComplete() setParentWindow(findParentWindow()); } +bool QQuickPlatformDialog::create() +{ + if (!m_handle) { + m_handle = createHelper(); + if (m_handle) { + connect(m_handle, &QPlatformDialogHelper::accept, this, &QQuickPlatformDialog::accept); + connect(m_handle, &QPlatformDialogHelper::reject, this, &QQuickPlatformDialog::reject); + } + } + return m_handle; +} + +void QQuickPlatformDialog::destroy() +{ + delete m_handle; + m_handle = nullptr; +} + void QQuickPlatformDialog::applyOptions() { } diff --git a/src/imports/platform/qquickplatformdialog_p.h b/src/imports/platform/qquickplatformdialog_p.h index b4ba62ec..577cec94 100644 --- a/src/imports/platform/qquickplatformdialog_p.h +++ b/src/imports/platform/qquickplatformdialog_p.h @@ -76,7 +76,6 @@ public: ~QQuickPlatformDialog(); QPlatformDialogHelper *handle() const; - void setHandle(QPlatformDialogHelper *handle); QQmlListProperty<QObject> data(); @@ -114,6 +113,10 @@ protected: void classBegin() override; void componentComplete() override; + bool create(); + void destroy(); + + virtual QPlatformDialogHelper *createHelper() = 0; virtual void applyOptions(); QWindow *findParentWindow() const; diff --git a/src/imports/platform/qquickplatformfiledialog.cpp b/src/imports/platform/qquickplatformfiledialog.cpp index 8ff5c4ac..1900952c 100644 --- a/src/imports/platform/qquickplatformfiledialog.cpp +++ b/src/imports/platform/qquickplatformfiledialog.cpp @@ -118,30 +118,6 @@ QQuickPlatformFileDialog::QQuickPlatformFileDialog(QObject *parent) { m_options->setFileMode(QFileDialogOptions::ExistingFile); m_options->setAcceptMode(QFileDialogOptions::AcceptOpen); - - QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::FileDialog); -#ifdef QT_WIDGETS_LIB - if (!dialog) - dialog = new QWidgetPlatformFileDialog(this); -#endif - qCDebug(qtLabsPlatformDialogs) << "FileDialog:" << dialog; - - if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) { - connect(fileDialog, &QPlatformFileDialogHelper::fileSelected, [this](const QUrl &file) { - emit fileSelected(addDefaultSuffix(file)); - }); - connect(fileDialog, &QPlatformFileDialogHelper::filesSelected, [this](const QList<QUrl> &files) { - emit filesSelected(addDefaultSuffixes(files)); - }); - connect(fileDialog, &QPlatformFileDialogHelper::currentChanged, [this](const QUrl &url) { - if (m_current == url) - return; - m_current = url; - emit currentFileChanged(); - }); - fileDialog->setOptions(m_options); - } - setHandle(dialog); } /*! @@ -366,6 +342,33 @@ void QQuickPlatformFileDialog::resetRejectLabel() setRejectLabel(QString()); } +QPlatformDialogHelper *QQuickPlatformFileDialog::createHelper() +{ + QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::FileDialog); +#ifdef QT_WIDGETS_LIB + if (!dialog) + dialog = new QWidgetPlatformFileDialog(this); +#endif + qCDebug(qtLabsPlatformDialogs) << "FileDialog:" << dialog; + + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) { + connect(fileDialog, &QPlatformFileDialogHelper::fileSelected, [this](const QUrl &file) { + emit fileSelected(addDefaultSuffix(file)); + }); + connect(fileDialog, &QPlatformFileDialogHelper::filesSelected, [this](const QList<QUrl> &files) { + emit filesSelected(addDefaultSuffixes(files)); + }); + connect(fileDialog, &QPlatformFileDialogHelper::currentChanged, [this](const QUrl &url) { + if (m_current == url) + return; + m_current = url; + emit currentFileChanged(); + }); + fileDialog->setOptions(m_options); + } + return dialog; +} + void QQuickPlatformFileDialog::applyOptions() { m_options->setWindowTitle(title()); diff --git a/src/imports/platform/qquickplatformfiledialog_p.h b/src/imports/platform/qquickplatformfiledialog_p.h index 53e34731..c3c6a490 100644 --- a/src/imports/platform/qquickplatformfiledialog_p.h +++ b/src/imports/platform/qquickplatformfiledialog_p.h @@ -115,6 +115,7 @@ Q_SIGNALS: void filesSelected(const QList<QUrl> &files); protected: + QPlatformDialogHelper *createHelper() override; void applyOptions() override; private: diff --git a/src/imports/platform/qquickplatformfolderdialog.cpp b/src/imports/platform/qquickplatformfolderdialog.cpp index bf0ba09b..04c39f6f 100644 --- a/src/imports/platform/qquickplatformfolderdialog.cpp +++ b/src/imports/platform/qquickplatformfolderdialog.cpp @@ -118,26 +118,6 @@ QQuickPlatformFolderDialog::QQuickPlatformFolderDialog(QObject *parent) { m_options->setFileMode(QFileDialogOptions::Directory); m_options->setAcceptMode(QFileDialogOptions::AcceptOpen); - - QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::FileDialog); -#ifdef QT_WIDGETS_LIB - if (!dialog) - dialog = new QWidgetPlatformFileDialog(this); -#endif - qCDebug(qtLabsPlatformDialogs) << "FolderDialog:" << dialog; - - if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) { - connect(fileDialog, &QPlatformFileDialogHelper::fileSelected, this, &QQuickPlatformFolderDialog::folderSelected); - connect(fileDialog, &QPlatformFileDialogHelper::filesSelected, this, &QQuickPlatformFolderDialog::foldersSelected); - connect(fileDialog, &QPlatformFileDialogHelper::currentChanged, [this](const QUrl &url) { - if (m_current == url) - return; - m_current = url; - emit currentFolderChanged(); - }); - fileDialog->setOptions(m_options); - } - setHandle(dialog); } /*! @@ -259,6 +239,29 @@ void QQuickPlatformFolderDialog::resetRejectLabel() setRejectLabel(QString()); } +QPlatformDialogHelper *QQuickPlatformFolderDialog::createHelper() +{ + QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::FileDialog); +#ifdef QT_WIDGETS_LIB + if (!dialog) + dialog = new QWidgetPlatformFileDialog(this); +#endif + qCDebug(qtLabsPlatformDialogs) << "FolderDialog:" << dialog; + + if (QPlatformFileDialogHelper *fileDialog = qobject_cast<QPlatformFileDialogHelper *>(dialog)) { + connect(fileDialog, &QPlatformFileDialogHelper::fileSelected, this, &QQuickPlatformFolderDialog::folderSelected); + connect(fileDialog, &QPlatformFileDialogHelper::filesSelected, this, &QQuickPlatformFolderDialog::foldersSelected); + connect(fileDialog, &QPlatformFileDialogHelper::currentChanged, [this](const QUrl &url) { + if (m_current == url) + return; + m_current = url; + emit currentFolderChanged(); + }); + fileDialog->setOptions(m_options); + } + return dialog; +} + void QQuickPlatformFolderDialog::applyOptions() { m_options->setWindowTitle(title()); diff --git a/src/imports/platform/qquickplatformfolderdialog_p.h b/src/imports/platform/qquickplatformfolderdialog_p.h index 4b5f6a9b..39dc025f 100644 --- a/src/imports/platform/qquickplatformfolderdialog_p.h +++ b/src/imports/platform/qquickplatformfolderdialog_p.h @@ -91,6 +91,7 @@ Q_SIGNALS: void foldersSelected(const QList<QUrl> &folders); protected: + QPlatformDialogHelper *createHelper() override; void applyOptions() override; private: diff --git a/src/imports/platform/qquickplatformfontdialog.cpp b/src/imports/platform/qquickplatformfontdialog.cpp index bf778ff0..13e35389 100644 --- a/src/imports/platform/qquickplatformfontdialog.cpp +++ b/src/imports/platform/qquickplatformfontdialog.cpp @@ -102,19 +102,6 @@ Q_DECLARE_LOGGING_CATEGORY(qtLabsPlatformDialogs) QQuickPlatformFontDialog::QQuickPlatformFontDialog(QObject *parent) : QQuickPlatformDialog(parent), m_options(QFontDialogOptions::create()) { - QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::FontDialog); -#ifdef QT_WIDGETS_LIB - if (!dialog) - dialog = new QWidgetPlatformFontDialog(this); -#endif - qCDebug(qtLabsPlatformDialogs) << "FontDialog:" << dialog; - - if (QPlatformFontDialogHelper *fontDialog = qobject_cast<QPlatformFontDialogHelper *>(dialog)) { - connect(fontDialog, &QPlatformFontDialogHelper::currentFontChanged, this, &QQuickPlatformFontDialog::currentFontChanged); - connect(fontDialog, &QPlatformFontDialogHelper::fontSelected, this, &QQuickPlatformFontDialog::fontSelected); - fontDialog->setOptions(m_options); - } - setHandle(dialog); } /*! @@ -169,6 +156,23 @@ void QQuickPlatformFontDialog::setOptions(QFontDialogOptions::FontDialogOptions emit optionsChanged(); } +QPlatformDialogHelper *QQuickPlatformFontDialog::createHelper() +{ + QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::FontDialog); +#ifdef QT_WIDGETS_LIB + if (!dialog) + dialog = new QWidgetPlatformFontDialog(this); +#endif + qCDebug(qtLabsPlatformDialogs) << "FontDialog:" << dialog; + + if (QPlatformFontDialogHelper *fontDialog = qobject_cast<QPlatformFontDialogHelper *>(dialog)) { + connect(fontDialog, &QPlatformFontDialogHelper::currentFontChanged, this, &QQuickPlatformFontDialog::currentFontChanged); + connect(fontDialog, &QPlatformFontDialogHelper::fontSelected, this, &QQuickPlatformFontDialog::fontSelected); + fontDialog->setOptions(m_options); + } + return dialog; +} + void QQuickPlatformFontDialog::applyOptions() { m_options->setWindowTitle(title()); diff --git a/src/imports/platform/qquickplatformfontdialog_p.h b/src/imports/platform/qquickplatformfontdialog_p.h index 91f9a31a..0c4f64ee 100644 --- a/src/imports/platform/qquickplatformfontdialog_p.h +++ b/src/imports/platform/qquickplatformfontdialog_p.h @@ -76,6 +76,7 @@ Q_SIGNALS: void fontSelected(const QFont &font); protected: + QPlatformDialogHelper *createHelper() override; void applyOptions() override; private: diff --git a/src/imports/platform/qquickplatformmessagedialog.cpp b/src/imports/platform/qquickplatformmessagedialog.cpp index 3e27e083..2fe4f88f 100644 --- a/src/imports/platform/qquickplatformmessagedialog.cpp +++ b/src/imports/platform/qquickplatformmessagedialog.cpp @@ -237,18 +237,6 @@ QQuickPlatformMessageDialog::QQuickPlatformMessageDialog(QObject *parent) m_options(QMessageDialogOptions::create()), m_clickedButton(QPlatformDialogHelper::NoButton) { - QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::MessageDialog); -#ifdef QT_WIDGETS_LIB - if (!dialog) - dialog = new QWidgetPlatformMessageDialog(this); -#endif - qCDebug(qtLabsPlatformDialogs) << "MessageDialog:" << dialog; - - if (QPlatformMessageDialogHelper *messageDialog = qobject_cast<QPlatformMessageDialogHelper *>(dialog)) { - connect(messageDialog, &QPlatformMessageDialogHelper::clicked, this, &QQuickPlatformMessageDialog::handleClick); - messageDialog->setOptions(m_options); - } - setHandle(dialog); } /*! @@ -371,6 +359,22 @@ QPlatformDialogHelper::StandardButton QQuickPlatformMessageDialog::clickedButton return m_clickedButton; } +QPlatformDialogHelper *QQuickPlatformMessageDialog::createHelper() +{ + QPlatformDialogHelper *dialog = QGuiApplicationPrivate::platformTheme()->createPlatformDialogHelper(QPlatformTheme::MessageDialog); +#ifdef QT_WIDGETS_LIB + if (!dialog) + dialog = new QWidgetPlatformMessageDialog(this); +#endif + qCDebug(qtLabsPlatformDialogs) << "MessageDialog:" << dialog; + + if (QPlatformMessageDialogHelper *messageDialog = qobject_cast<QPlatformMessageDialogHelper *>(dialog)) { + connect(messageDialog, &QPlatformMessageDialogHelper::clicked, this, &QQuickPlatformMessageDialog::handleClick); + messageDialog->setOptions(m_options); + } + return dialog; +} + void QQuickPlatformMessageDialog::applyOptions() { m_options->setWindowTitle(title()); diff --git a/src/imports/platform/qquickplatformmessagedialog_p.h b/src/imports/platform/qquickplatformmessagedialog_p.h index bd44082e..e5548174 100644 --- a/src/imports/platform/qquickplatformmessagedialog_p.h +++ b/src/imports/platform/qquickplatformmessagedialog_p.h @@ -108,6 +108,7 @@ Q_SIGNALS: void restoreDefaultsClicked(); protected: + QPlatformDialogHelper *createHelper() override; void applyOptions() override; private Q_SLOTS: |