aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-06-18 11:38:37 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-06-20 17:23:26 +0000
commit4a547ba24a7362c601f453fd227e83f4dcb9adaa (patch)
tree9088b153cddac84a17b2c6abb329fc41648206d6 /src
parentac4f478d0e5292172c47318a83e31e051c60649e (diff)
Add QQuickPlatformDialog
The base class of the upcoming platform dialogs: ColorDialog, FileDialog, FontDialog, and MessageDialog. Change-Id: I2d4918b5d4f8a7f453aa8f314e13540cb2a8e2b5 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/imports/platform/platform.pri2
-rw-r--r--src/imports/platform/qquickplatformdialog.cpp305
-rw-r--r--src/imports/platform/qquickplatformdialog_p.h130
-rw-r--r--src/imports/platform/qtlabsplatformplugin.cpp4
4 files changed, 441 insertions, 0 deletions
diff --git a/src/imports/platform/platform.pri b/src/imports/platform/platform.pri
index 6b7bb5d0..dbebccd5 100644
--- a/src/imports/platform/platform.pri
+++ b/src/imports/platform/platform.pri
@@ -1,4 +1,5 @@
HEADERS += \
+ $$PWD/qquickplatformdialog_p.h \
$$PWD/qquickplatformiconloader_p.h \
$$PWD/qquickplatformmenu_p.h \
$$PWD/qquickplatformmenubar_p.h \
@@ -7,6 +8,7 @@ HEADERS += \
$$PWD/qquickplatformsystemtrayicon_p.h
SOURCES += \
+ $$PWD/qquickplatformdialog.cpp \
$$PWD/qquickplatformiconloader.cpp \
$$PWD/qquickplatformmenu.cpp \
$$PWD/qquickplatformmenubar.cpp \
diff --git a/src/imports/platform/qquickplatformdialog.cpp b/src/imports/platform/qquickplatformdialog.cpp
new file mode 100644
index 00000000..7ceab62e
--- /dev/null
+++ b/src/imports/platform/qquickplatformdialog.cpp
@@ -0,0 +1,305 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Labs Platform module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickplatformdialog_p.h"
+
+#include <QtQuick/qquickitem.h>
+#include <QtQuick/qquickwindow.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype Dialog
+ \inherits QtObject
+ \instantiates QQuickPlatformDialog
+ \inqmlmodule Qt.labs.platform
+ \since 5.8
+ \brief The base class of native dialogs.
+
+ The Dialog type provides common QML API for native platform dialogs.
+
+ To show a native dialog, construct an instance of one of the concrete
+ Dialog implementations, set the desired properties, and call \l open().
+ Dialog emits \l accepted() or \l rejected() when the user is done with
+ the dialog.
+
+ \labs
+*/
+
+/*!
+ \qmlsignal void Qt.labs.platform::Dialog::accepted()
+
+ This signal is emitted when the dialog has been accepted either
+ interactively or by calling \l accept().
+
+ \note This signal is \e not emitted when closing the dialog with \l close().
+
+ \sa rejected()
+*/
+
+/*!
+ \qmlsignal void QtQuick.Controls::Dialog::rejected()
+
+ This signal is emitted when the dialog has been rejected either
+ interactively or by calling \l reject().
+
+ \note This signal is \e not emitted when closing the dialog with \l close().
+
+ \sa accepted()
+*/
+
+QQuickPlatformDialog::QQuickPlatformDialog(QObject *parent)
+ : QObject(parent),
+ m_complete(false),
+ m_parentWindow(nullptr),
+ m_flags(Qt::Dialog),
+ m_modality(Qt::WindowModal),
+ m_handle(nullptr)
+{
+}
+
+QQuickPlatformDialog::~QQuickPlatformDialog()
+{
+ delete m_handle;
+ m_handle = nullptr;
+}
+
+QPlatformDialogHelper *QQuickPlatformDialog::handle() const
+{
+ 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
+
+ This default property holds the list of all objects declared as children of
+ the dialog.
+*/
+QQmlListProperty<QObject> QQuickPlatformDialog::data()
+{
+ return QQmlListProperty<QObject>(this, m_data);
+}
+
+/*!
+ \qmlproperty Window Qt.labs.platform::Dialog::parentWindow
+
+ This property holds the parent window of the dialog.
+
+ Unless explicitly set, the window is automatically resolved by iterating
+ the QML parent objects until a \l Window or an \l Item that has a window
+ is found.
+*/
+QWindow *QQuickPlatformDialog::parentWindow() const
+{
+ return m_parentWindow;
+}
+
+void QQuickPlatformDialog::setParentWindow(QWindow *window)
+{
+ if (m_parentWindow == window)
+ return;
+
+ m_parentWindow = window;
+ emit parentWindowChanged();
+}
+
+/*!
+ \qmlproperty string Qt.labs.platform::Dialog::title
+
+ This property holds the title of the dialog.
+*/
+QString QQuickPlatformDialog::title() const
+{
+ return m_title;
+}
+
+void QQuickPlatformDialog::setTitle(const QString &title)
+{
+ if (m_title == title)
+ return;
+
+ m_title = title;
+ emit titleChanged();
+}
+
+/*!
+ \qmlproperty Qt::WindowFlags Qt.labs.platform::Dialog::flags
+
+ This property holds the window flags of the dialog. The default value is \c Qt.Dialog.
+*/
+Qt::WindowFlags QQuickPlatformDialog::flags() const
+{
+ return m_flags;
+}
+
+void QQuickPlatformDialog::setFlags(Qt::WindowFlags flags)
+{
+ if (m_flags == flags)
+ return;
+
+ m_flags = flags;
+ emit flagsChanged();
+}
+
+/*!
+ \qmlproperty Qt::WindowModality Qt.labs.platform::Dialog::modality
+
+ This property holds the modality of the dialog. The default value is \c Qt.WindowModal.
+
+ Available values:
+ \value Qt.NonModal The dialog is not modal and does not block input to other windows.
+ \value Qt.WindowModal The dialog is modal to a single window hierarchy and blocks input to its parent window, all grandparent windows, and all siblings of its parent and grandparent windows.
+ \value Qt.ApplicationModal The dialog is modal to the application and blocks input to all windows.
+*/
+Qt::WindowModality QQuickPlatformDialog::modality() const
+{
+ return m_modality;
+}
+
+void QQuickPlatformDialog::setModality(Qt::WindowModality modality)
+{
+ if (m_modality == modality)
+ return;
+
+ m_modality = modality;
+ emit modalityChanged();
+}
+
+/*!
+ \qmlmethod void Qt.labs.platform::Dialog::open()
+
+ Opens the dialog.
+
+ \sa close()
+*/
+void QQuickPlatformDialog::open()
+{
+ if (!m_handle)
+ return;
+
+ applyOptions();
+ m_handle->show(m_flags, m_modality, m_parentWindow);
+}
+
+/*!
+ \qmlmethod void Qt.labs.platform::Dialog::close()
+
+ Closes the dialog.
+
+ \sa open()
+*/
+void QQuickPlatformDialog::close()
+{
+ if (!m_handle)
+ return;
+
+ m_handle->hide();
+}
+
+/*!
+ \qmlmethod void Qt.labs.platform::Dialog::accept()
+
+ Closes the dialog and emits the \l accepted() signal.
+
+ \sa reject()
+*/
+void QQuickPlatformDialog::accept()
+{
+ close();
+ emit accepted();
+}
+
+/*!
+ \qmlmethod void QtQuick.Controls::Dialog::reject()
+
+ Closes the dialog and emits the \l rejected() signal.
+
+ \sa accept()
+*/
+void QQuickPlatformDialog::reject()
+{
+ close();
+ emit rejected();
+}
+
+void QQuickPlatformDialog::classBegin()
+{
+}
+
+void QQuickPlatformDialog::componentComplete()
+{
+ m_complete = true;
+ if (!m_parentWindow)
+ setParentWindow(findParentWindow());
+}
+
+void QQuickPlatformDialog::applyOptions()
+{
+}
+
+QWindow *QQuickPlatformDialog::findParentWindow() const
+{
+ QObject *obj = parent();
+ while (obj) {
+ QWindow *window = qobject_cast<QWindow *>(obj);
+ if (window)
+ return window;
+ QQuickItem *item = qobject_cast<QQuickItem *>(obj);
+ if (item && item->window())
+ return item->window();
+ obj = obj->parent();
+ }
+ return nullptr;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/platform/qquickplatformdialog_p.h b/src/imports/platform/qquickplatformdialog_p.h
new file mode 100644
index 00000000..411e80b6
--- /dev/null
+++ b/src/imports/platform/qquickplatformdialog_p.h
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Labs Platform module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKPLATFORMDIALOG_P_H
+#define QQUICKPLATFORMDIALOG_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qobject.h>
+#include <QtGui/qpa/qplatformdialoghelper.h>
+#include <QtQml/qqmlparserstatus.h>
+#include <QtQml/qqmllist.h>
+#include <QtQml/qqml.h>
+
+QT_BEGIN_NAMESPACE
+
+class QWindow;
+class QPlatformDialogHelper;
+
+class QQuickPlatformDialog : public QObject, public QQmlParserStatus
+{
+ Q_OBJECT
+ Q_INTERFACES(QQmlParserStatus)
+ Q_PROPERTY(QQmlListProperty<QObject> data READ data FINAL)
+ Q_PROPERTY(QWindow *parentWindow READ parentWindow WRITE setParentWindow NOTIFY parentWindowChanged FINAL)
+ Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged FINAL)
+ Q_PROPERTY(Qt::WindowFlags flags READ flags WRITE setFlags NOTIFY flagsChanged FINAL)
+ Q_PROPERTY(Qt::WindowModality modality READ modality WRITE setModality NOTIFY modalityChanged FINAL)
+ Q_CLASSINFO("DefaultProperty", "data")
+
+public:
+ explicit QQuickPlatformDialog(QObject *parent = nullptr);
+ ~QQuickPlatformDialog();
+
+ QPlatformDialogHelper *handle() const;
+ void setHandle(QPlatformDialogHelper *handle);
+
+ QQmlListProperty<QObject> data();
+
+ QWindow *parentWindow() const;
+ void setParentWindow(QWindow *window);
+
+ QString title() const;
+ void setTitle(const QString &title);
+
+ Qt::WindowFlags flags() const;
+ void setFlags(Qt::WindowFlags flags);
+
+ Qt::WindowModality modality() const;
+ void setModality(Qt::WindowModality modality);
+
+public Q_SLOTS:
+ void open();
+ void close();
+ void accept();
+ void reject();
+
+Q_SIGNALS:
+ void accepted();
+ void rejected();
+ void parentWindowChanged();
+ void titleChanged();
+ void flagsChanged();
+ void modalityChanged();
+
+protected:
+ void classBegin() override;
+ void componentComplete() override;
+
+ virtual void applyOptions();
+
+ QWindow *findParentWindow() const;
+
+private:
+ bool m_complete;
+ QWindow *m_parentWindow;
+ QString m_title;
+ Qt::WindowFlags m_flags;
+ Qt::WindowModality m_modality;
+ QList<QObject *> m_data;
+ QPlatformDialogHelper *m_handle;
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QQuickPlatformDialog)
+
+#endif // QQUICKPLATFORMDIALOG_P_H
diff --git a/src/imports/platform/qtlabsplatformplugin.cpp b/src/imports/platform/qtlabsplatformplugin.cpp
index 545e2c6e..ba79058f 100644
--- a/src/imports/platform/qtlabsplatformplugin.cpp
+++ b/src/imports/platform/qtlabsplatformplugin.cpp
@@ -37,6 +37,8 @@
#include <QtQml/qqmlextensionplugin.h>
#include <QtQml/qqml.h>
+#include "qquickplatformdialog_p.h"
+
#include "qquickplatformmenu_p.h"
#include "qquickplatformmenubar_p.h"
#include "qquickplatformmenuitem_p.h"
@@ -70,6 +72,8 @@ QtLabsPlatformPlugin::QtLabsPlatformPlugin(QObject *parent) : QQmlExtensionPlugi
void QtLabsPlatformPlugin::registerTypes(const char *uri)
{
+ qmlRegisterUncreatableType<QQuickPlatformDialog>(uri, 1, 0, "Dialog", QQuickPlatformDialog::tr("Dialog is an abstract base class"));
+
qmlRegisterType<QQuickPlatformMenu>(uri, 1, 0, "Menu");
qmlRegisterType<QQuickPlatformMenuBar>(uri, 1, 0, "MenuBar");
qmlRegisterType<QQuickPlatformMenuItem>(uri, 1, 0, "MenuItem");