diff options
author | Martin Pley <martin@netbook.pley.org> | 2011-12-08 04:22:08 -0800 |
---|---|---|
committer | Jens Bache-Wiig <jens.bache-wiig@nokia.com> | 2011-12-08 04:22:08 -0800 |
commit | 563fdbc4d7805c9d9c1d2abde1d52b39e58b4329 (patch) | |
tree | ea1552771a6e9dc0980fbef7811352fbdb35c185 | |
parent | 978a1afaf10ad34fa3f4b56b09496992f2d9ce56 (diff) | |
download | qtquickcontrols-563fdbc4d7805c9d9c1d2abde1d52b39e58b4329.tar.gz |
Improved ownership-handling of TopLevelWindows
Merge-request: 16
Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@nokia.com>
-rw-r--r-- | examples/TopLevelBrowser.qml | 2 | ||||
-rw-r--r-- | src/qtoplevelwindow.cpp | 11 | ||||
-rw-r--r-- | src/qtoplevelwindow.h | 1 | ||||
-rw-r--r-- | src/qwindowitem.cpp | 34 | ||||
-rw-r--r-- | src/qwindowitem.h | 13 |
5 files changed, 36 insertions, 25 deletions
diff --git a/examples/TopLevelBrowser.qml b/examples/TopLevelBrowser.qml index bbefcc47..b7619e49 100644 --- a/examples/TopLevelBrowser.qml +++ b/examples/TopLevelBrowser.qml @@ -52,7 +52,7 @@ Window { text: "Close Window" shortcut: "Ctrl+Shift+W" onTriggered: { - topLevelBrowser.close = true + topLevelBrowser.close() } } Separator {} diff --git a/src/qtoplevelwindow.cpp b/src/qtoplevelwindow.cpp index 915f0edc..16068a62 100644 --- a/src/qtoplevelwindow.cpp +++ b/src/qtoplevelwindow.cpp @@ -10,24 +10,24 @@ QTopLevelWindow::QTopLevelWindow() // resize(QSize(100, 100)); _view->setBackgroundBrush(palette().window()); setCentralWidget(_view); - setAttribute(Qt::WA_DeleteOnClose); } QTopLevelWindow::~QTopLevelWindow() { + foreach(QTopLevelWindow* child, findChildren<QTopLevelWindow*>()) + child->setParent(0); //we need this to break the parental loop of QWindowItem and QTopLevelWindow _view->scene()->setParent(0); } void QTopLevelWindow::registerChildWindow(QTopLevelWindow* child) { - _childWindows.insert(child); child->setParent(this); } void QTopLevelWindow::hideChildWindows() { - foreach(QTopLevelWindow* child, _childWindows) { + foreach(QTopLevelWindow* child, findChildren<QTopLevelWindow*>()) { child->hide(); } } @@ -36,7 +36,7 @@ void QTopLevelWindow::initPosition() { if (!_positionIsDefined) center(); - foreach(QTopLevelWindow* child, _childWindows) { + foreach(QTopLevelWindow* child, findChildren<QTopLevelWindow*>()) { child->initPosition(); } } @@ -82,9 +82,6 @@ bool QTopLevelWindow::event(QEvent *event) { hideChildWindows(); emit visibilityChanged(); break; - case QEvent::ParentChange: - setAttribute(Qt::WA_DeleteOnClose, !parent()); - break; case QEvent::Resize: { const QResizeEvent *resize = static_cast<const QResizeEvent *>(event); emit sizeChanged(resize->size()); diff --git a/src/qtoplevelwindow.h b/src/qtoplevelwindow.h index cd516e1e..69fd9b7d 100644 --- a/src/qtoplevelwindow.h +++ b/src/qtoplevelwindow.h @@ -61,7 +61,6 @@ Q_SIGNALS: private: QDeclarativeView *_view; - QSet<QTopLevelWindow*> _childWindows; bool _positionIsDefined; }; diff --git a/src/qwindowitem.cpp b/src/qwindowitem.cpp index d1bc773a..de4d464f 100644 --- a/src/qwindowitem.cpp +++ b/src/qwindowitem.cpp @@ -43,25 +43,32 @@ #include <QTimer> -QWindowItem::QWindowItem(QTopLevelWindow* tlw) - : _window(tlw ? tlw : new QTopLevelWindow), _positionIsDefined(false), _delayedVisible(false), _x(0), _y(0) +QWindowItem::QWindowItem() + : _window(new QTopLevelWindow), _positionIsDefined(false), _delayedVisible(false), _deleteOnClose(true), _x(0), _y(0) { connect(_window, SIGNAL(visibilityChanged()), this, SIGNAL(visibleChanged())); connect(_window, SIGNAL(windowStateChanged()), this, SIGNAL(windowStateChanged())); connect(_window, SIGNAL(sizeChanged(QSize)), this, SLOT(updateSize(QSize))); - connect(qApp, SIGNAL(aboutToQuit()), _window, SLOT(close())); view()->setResizeMode(QDeclarativeView::SizeRootObjectToView); _window->installEventFilter(this); } QWindowItem::~QWindowItem() { + delete _window; } bool QWindowItem::eventFilter(QObject *, QEvent *ev) { switch(ev->type()) { + case QEvent::Close: + ev->ignore(); + if (_deleteOnClose) + deleteLater(); + else + _window->hide(); + return true; case QEvent::Resize: emit sizeChanged(); emit widthChanged(); @@ -206,20 +213,23 @@ void QWindowItem::setModal(bool modal) _window->hide(); _window->setWindowModality(modal ? Qt::WindowModal : Qt::NonModal); - if (modal) //this is a workaround for a bug in Qt? or in Unity? - _window->setWindowFlags(_window->windowFlags() | Qt::WindowStaysOnTopHint); - else - _window->setWindowFlags(_window->windowFlags() & ~Qt::WindowStaysOnTopHint ); - if (visible) _window->show(); emit modalityChanged(); } -void QWindowItem::setClose(bool close) +void QWindowItem::setDeleteOnClose(bool deleteOnClose) { - if (close) - _window->close(); + if (deleteOnClose == _deleteOnClose) + return; + _deleteOnClose = deleteOnClose; + emit deleteOnCloseChanged(); } - +void QWindowItem::close() +{ + if (_deleteOnClose) + deleteLater(); + else + _window->hide(); +} diff --git a/src/qwindowitem.h b/src/qwindowitem.h index ed2cbe4c..0ad14fe1 100644 --- a/src/qwindowitem.h +++ b/src/qwindowitem.h @@ -49,12 +49,12 @@ class QWindowItem : public QDeclarativeItem Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged) Q_PROPERTY(bool windowDecoration READ windowDecoration WRITE setWindowDecoration NOTIFY windowDecorationChanged) Q_PROPERTY(bool modal READ modal WRITE setModal NOTIFY modalityChanged) - Q_PROPERTY(bool close READ close WRITE setClose) + Q_PROPERTY(bool deleteOnClose READ deleteOnClose WRITE setDeleteOnClose NOTIFY deleteOnCloseChanged) Q_PROPERTY(Qt::WindowState windowState READ windowState WRITE setWindowState NOTIFY windowStateChanged) Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged) public: - QWindowItem(QTopLevelWindow* QTopLevelWindow = 0); + QWindowItem(); ~QWindowItem(); QTopLevelWindow *window() { return _window; } @@ -71,7 +71,7 @@ public: bool windowDecoration() const { return !(_window->windowFlags() & Qt::FramelessWindowHint); } Qt::WindowState windowState() const { return static_cast<Qt::WindowState>(static_cast<int>(_window->windowState()) & ~Qt::WindowActive); } QString title() const { return _window->windowTitle(); } - bool close() { return false; } //we always return false here + bool deleteOnClose() const { return _deleteOnClose; } bool modal() const { return _window->isModal(); } void setX(int x); @@ -87,7 +87,10 @@ public: void setWindowState(Qt::WindowState state) { _window->setWindowState(state); } void setTitle(QString title); void setModal(bool modal); - void setClose(bool close); + void setDeleteOnClose(bool close); + +public Q_SLOTS: + void close(); protected: bool eventFilter(QObject *, QEvent *ev); @@ -113,12 +116,14 @@ Q_SIGNALS: void maximumWidthChanged(); void titleChanged(); void modalityChanged(); + void deleteOnCloseChanged(); private: QTopLevelWindow *_window; bool _complete; bool _positionIsDefined; bool _delayedVisible; + bool _deleteOnClose; int _x; int _y; }; |