From 37492efee021ccc6e550ecb67a3240b76eb2219e Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Mon, 5 Aug 2013 15:41:11 +0200 Subject: Qt Quick Dialogs: can see and control geometry of QML implementations QQuickAbstractDialog had x/y/width/height properties already but they didn't do anything. It's still not possible with the native dialogs because neither QPlatformDialogHelper nor QFileDialogOptions etc. have any geometric properties; but the application author can now see and control the geometry of any QML dialog implementation. Change-Id: Icdac9592c72e81175436436027f7fe3d75ff7f42 Reviewed-by: Liang Qi --- src/imports/dialogs/qquickabstractdialog.cpp | 53 +++++++++++++++++++++++----- src/imports/dialogs/qquickabstractdialog_p.h | 10 +++--- 2 files changed, 50 insertions(+), 13 deletions(-) (limited to 'src/imports') diff --git a/src/imports/dialogs/qquickabstractdialog.cpp b/src/imports/dialogs/qquickabstractdialog.cpp index 560cbaf3e0..17f8d1aef2 100644 --- a/src/imports/dialogs/qquickabstractdialog.cpp +++ b/src/imports/dialogs/qquickabstractdialog.cpp @@ -63,6 +63,7 @@ QQuickAbstractDialog::QQuickAbstractDialog(QObject *parent) , m_windowDecoration(0) , m_hasNativeWindows(QGuiApplicationPrivate::platformIntegration()-> hasCapability(QPlatformIntegration::MultipleWindows)) + , m_hasAspiredPosition(false) { } @@ -124,8 +125,24 @@ void QQuickAbstractDialog::setVisible(bool v) } } } - if (m_dialogWindow) + if (m_dialogWindow) { + // "grow up" to the size and position expected to achieve + if (!m_sizeAspiration.isNull()) { + if (m_hasAspiredPosition) + m_dialogWindow->setGeometry(m_sizeAspiration); + else { + if (m_sizeAspiration.width() > 0) + m_dialogWindow->setWidth(m_sizeAspiration.width()); + if (m_sizeAspiration.height() > 0) + m_dialogWindow->setHeight(m_sizeAspiration.height()); + } + } connect(m_dialogWindow, SIGNAL(visibleChanged(bool)), this, SLOT(visibleChanged(bool))); + connect(m_dialogWindow, SIGNAL(xChanged(int)), this, SLOT(setX(int))); + connect(m_dialogWindow, SIGNAL(yChanged(int)), this, SLOT(setY(int))); + connect(m_dialogWindow, SIGNAL(widthChanged(int)), this, SLOT(setWidth(int))); + connect(m_dialogWindow, SIGNAL(heightChanged(int)), this, SLOT(setHeight(int))); + } } if (m_windowDecoration) { m_windowDecoration->setVisible(v); @@ -230,66 +247,84 @@ int QQuickAbstractDialog::x() const { if (m_dialogWindow) return m_dialogWindow->x(); - return -1; + return m_sizeAspiration.x(); } int QQuickAbstractDialog::y() const { if (m_dialogWindow) return m_dialogWindow->y(); - return -1; + return m_sizeAspiration.y(); } int QQuickAbstractDialog::width() const { if (m_dialogWindow) return m_dialogWindow->width(); - return -1; + return m_sizeAspiration.width(); } int QQuickAbstractDialog::height() const { if (m_dialogWindow) return m_dialogWindow->height(); - return -1; + return m_sizeAspiration.height(); } void QQuickAbstractDialog::setX(int arg) { + m_hasAspiredPosition = true; + m_sizeAspiration.setX(arg); if (helper()) { // TODO } else if (m_dialogWindow) { - m_dialogWindow->setX(arg); + if (sender() != m_dialogWindow) + m_dialogWindow->setX(arg); + } else if (m_contentItem) { + m_contentItem->setX(arg); } emit geometryChanged(); } void QQuickAbstractDialog::setY(int arg) { + m_hasAspiredPosition = true; + m_sizeAspiration.setY(arg); if (helper()) { // TODO } else if (m_dialogWindow) { - m_dialogWindow->setY(arg); + if (sender() != m_dialogWindow) + m_dialogWindow->setY(arg); + } else if (m_contentItem) { + m_contentItem->setY(arg); } emit geometryChanged(); } void QQuickAbstractDialog::setWidth(int arg) { + m_sizeAspiration.setWidth(arg); if (helper()) { // TODO } else if (m_dialogWindow) { - m_dialogWindow->setWidth(arg); + if (sender() != m_dialogWindow) + m_dialogWindow->setWidth(arg); + } else if (m_contentItem) { + m_contentItem->setWidth(arg); } emit geometryChanged(); } void QQuickAbstractDialog::setHeight(int arg) { + m_sizeAspiration.setHeight(arg); if (helper()) { // TODO } else if (m_dialogWindow) { - m_dialogWindow->setHeight(arg); + if (sender() != m_dialogWindow) + m_dialogWindow->setHeight(arg); + } else if (m_contentItem) { + m_contentItem->setHeight(arg); } emit geometryChanged(); } diff --git a/src/imports/dialogs/qquickabstractdialog_p.h b/src/imports/dialogs/qquickabstractdialog_p.h index 5e3d9b43f7..c18df33c6c 100644 --- a/src/imports/dialogs/qquickabstractdialog_p.h +++ b/src/imports/dialogs/qquickabstractdialog_p.h @@ -91,14 +91,14 @@ public: virtual void setTitle(const QString &t) = 0; void setQmlImplementation(QObject* obj); bool isWindow() const { return m_hasNativeWindows; } - void setX(int arg); - void setY(int arg); - void setWidth(int arg); - void setHeight(int arg); public Q_SLOTS: void open() { setVisible(true); } void close() { setVisible(false); } + void setX(int arg); + void setY(int arg); + void setWidth(int arg); + void setHeight(int arg); Q_SIGNALS: void visibilityChanged(); @@ -130,6 +130,8 @@ protected: // variables for pure-QML implementations only QQuickItem *m_contentItem; QQuickItem *m_windowDecoration; bool m_hasNativeWindows; + QRect m_sizeAspiration; + bool m_hasAspiredPosition; static QQmlComponent *m_decorationComponent; -- cgit v1.2.3