aboutsummaryrefslogtreecommitdiffstats
path: root/src/imports
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-08-14 11:01:38 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-08-14 09:25:42 +0000
commit2e09e597ab3df5a13f89e945a0a90724d5c5a3f0 (patch)
treef671841761cc372ddb1499574172564dd1378505 /src/imports
parentdeb0921b8240a0240e595896debb973a6104935a (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')
-rw-r--r--src/imports/platform/qquickplatformcolordialog.cpp30
-rw-r--r--src/imports/platform/qquickplatformcolordialog_p.h1
-rw-r--r--src/imports/platform/qquickplatformdialog.cpp41
-rw-r--r--src/imports/platform/qquickplatformdialog_p.h5
-rw-r--r--src/imports/platform/qquickplatformfiledialog.cpp51
-rw-r--r--src/imports/platform/qquickplatformfiledialog_p.h1
-rw-r--r--src/imports/platform/qquickplatformfolderdialog.cpp43
-rw-r--r--src/imports/platform/qquickplatformfolderdialog_p.h1
-rw-r--r--src/imports/platform/qquickplatformfontdialog.cpp30
-rw-r--r--src/imports/platform/qquickplatformfontdialog_p.h1
-rw-r--r--src/imports/platform/qquickplatformmessagedialog.cpp28
-rw-r--r--src/imports/platform/qquickplatformmessagedialog_p.h1
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: