1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the QtQml module of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include "qquickscreen_p.h"
44 #include "qquickitem.h"
45 #include "qquickitem_p.h"
46 #include "qquickcanvas.h"
53 \qmlclass Screen QQuickScreenAttached
54 \inqmlmodule QtQuick.Window 2
55 \ingroup qtquick-visual-utility
56 \brief The Screen attached object provides information about the Screen an Item is displayed on.
58 The Screen attached object is only valid inside Item or Item derived elements, after component completion.
59 Inside these elements it refers to the screen that the element is currently being displayed on.
61 To use this element, you will need to import the module with the following line:
63 import QtQuick.Window 2.0
66 Note that the Screen element is not valid at Component.onCompleted, because the Item has not been displayed on
67 a screen by this time.
69 Restricting this import will allow you to have a QML environment without access to window system features.
73 \qmlattachedproperty int QtQuick.Window2::Screen::width
76 This contains the width of the screen in pixels.
79 \qmlattachedproperty int QtQuick.Window2::Screen::height
82 This contains the height of the screen in pixels.
85 \qmlattachedproperty Qt::ScreenOrientation QtQuick.Window2::Screen::primaryOrientation
88 This contains the primary orientation of the screen.
91 \qmlattachedproperty Qt::ScreenOrientation QtQuick.Window2::Screen::orientation
94 This contains the current orientation of the screen.
97 \qmlattachedmethod int QtQuick.Window2::Screen::angleBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b)
99 Returns the rotation angle, in degrees, between the two specified angles.
102 QQuickScreenAttached::QQuickScreenAttached(QObject* attachee)
106 m_attachee = qobject_cast<QQuickItem*>(attachee);
109 QQuickItemPrivate::get(m_attachee)->extra.value().screenAttached = this;
111 if (m_attachee->canvas()) //It might not be assigned to a canvas yet
112 canvasChanged(m_attachee->canvas());
116 int QQuickScreenAttached::width() const
120 return m_screen->size().width();
123 int QQuickScreenAttached::height() const
127 return m_screen->size().height();
130 Qt::ScreenOrientation QQuickScreenAttached::primaryOrientation() const
133 return Qt::PrimaryOrientation;
134 return m_screen->primaryOrientation();
137 Qt::ScreenOrientation QQuickScreenAttached::orientation() const
140 return Qt::PrimaryOrientation;
141 return m_screen->orientation();
144 int QQuickScreenAttached::angleBetween(int a, int b)
147 return Qt::PrimaryOrientation;
148 return m_screen->angleBetween((Qt::ScreenOrientation)a,(Qt::ScreenOrientation)b);
151 void QQuickScreenAttached::canvasChanged(QQuickCanvas* c)//Called by QQuickItemPrivate::initCanvas
153 QScreen* screen = c ? c->screen() : 0;
154 if (screen != m_screen) {
155 QScreen* oldScreen = m_screen;
159 disconnect(oldScreen, SIGNAL(sizeChanged(QSize)),
160 this, SIGNAL(widthChanged()));
161 disconnect(oldScreen, SIGNAL(sizeChanged(QSize)),
162 this, SIGNAL(heightChanged()));
163 disconnect(oldScreen, SIGNAL(orientationChanged(Qt::ScreenOrientation)),
164 this, SIGNAL(orientationChanged()));
165 disconnect(oldScreen, SIGNAL(primaryOrientationChanged(Qt::ScreenOrientation)),
166 this, SIGNAL(primaryOrientationChanged()));
170 return; //Don't bother emitting signals, because the new values are garbage anyways
172 if (!oldScreen || screen->size() != oldScreen->size()) {
174 emit heightChanged();
177 if (!oldScreen || screen->orientation() != oldScreen->orientation())
178 emit orientationChanged();
179 if (!oldScreen || screen->primaryOrientation() != oldScreen->primaryOrientation())
180 emit primaryOrientationChanged();
183 connect(screen, SIGNAL(sizeChanged(QSize)),
184 this, SIGNAL(widthChanged()));
185 connect(screen, SIGNAL(sizeChanged(QSize)),
186 this, SIGNAL(heightChanged()));
187 connect(screen, SIGNAL(orientationChanged(Qt::ScreenOrientation)),
188 this, SIGNAL(orientationChanged()));
189 connect(screen, SIGNAL(primaryOrientationChanged(Qt::ScreenOrientation)),
190 this, SIGNAL(primaryOrientationChanged()));