summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Pley <martin@netbook.pley.org>2011-12-08 04:22:08 -0800
committerJens Bache-Wiig <jens.bache-wiig@nokia.com>2011-12-08 04:22:08 -0800
commit563fdbc4d7805c9d9c1d2abde1d52b39e58b4329 (patch)
treeea1552771a6e9dc0980fbef7811352fbdb35c185
parent978a1afaf10ad34fa3f4b56b09496992f2d9ce56 (diff)
downloadqtquickcontrols-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.qml2
-rw-r--r--src/qtoplevelwindow.cpp11
-rw-r--r--src/qtoplevelwindow.h1
-rw-r--r--src/qwindowitem.cpp34
-rw-r--r--src/qwindowitem.h13
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;
};