Update copyright headers
[qt:qt.git] / demos / helper / qmlapplicationviewer / qmlapplicationviewer.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
10 **
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
13 ** met:
14 **   * Redistributions of source code must retain the above copyright
15 **     notice, this list of conditions and the following disclaimer.
16 **   * Redistributions in binary form must reproduce the above copyright
17 **     notice, this list of conditions and the following disclaimer in
18 **     the documentation and/or other materials provided with the
19 **     distribution.
20 **   * Neither the name of The Qt Company Ltd nor the names of its
21 **     contributors may be used to endorse or promote products derived
22 **     from this software without specific prior written permission.
23 **
24 **
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40
41 #include "qmlapplicationviewer.h"
42
43 #include <QtCore/QDir>
44 #include <QtCore/QFileInfo>
45 #include <QtDeclarative/QDeclarativeComponent>
46 #include <QtDeclarative/QDeclarativeEngine>
47 #include <QtDeclarative/QDeclarativeContext>
48 #include <QtGui/QApplication>
49
50 #include <qplatformdefs.h> // MEEGO_EDITION_HARMATTAN
51
52 #ifdef HARMATTAN_BOOSTER
53 #include <MDeclarativeCache>
54 #endif
55
56 #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800
57
58 #include <qt_private/qdeclarativedebughelper_p.h>
59
60 #if !defined(NO_JSDEBUGGER)
61 #include <jsdebuggeragent.h>
62 #endif
63 #if !defined(NO_QMLOBSERVER)
64 #include <qdeclarativeviewobserver.h>
65 #endif
66
67 // Enable debugging before any QDeclarativeEngine is created
68 struct QmlJsDebuggingEnabler
69 {
70     QmlJsDebuggingEnabler()
71     {
72         QDeclarativeDebugHelper::enableDebugging();
73     }
74 };
75
76 // Execute code in constructor before first QDeclarativeEngine is instantiated
77 static QmlJsDebuggingEnabler enableDebuggingHelper;
78
79 #endif // QMLJSDEBUGGER
80
81 class QmlApplicationViewerPrivate
82 {
83     QmlApplicationViewerPrivate(QDeclarativeView *view_) : view(view_) {}
84
85     QString mainQmlFile;
86     QDeclarativeView *view;
87     friend class QmlApplicationViewer;
88     QString adjustPath(const QString &path);
89 };
90
91 QString QmlApplicationViewerPrivate::adjustPath(const QString &path)
92 {
93 #ifdef Q_OS_MAC
94     if (!QDir::isAbsolutePath(path))
95         return QString::fromLatin1("%1/../Resources/%2")
96                 .arg(QCoreApplication::applicationDirPath(), path);
97 #else
98     const QString pathInInstallDir =
99             QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
100     if (QFileInfo(pathInInstallDir).exists())
101         return pathInInstallDir;
102 #endif
103     return path;
104 }
105
106 QmlApplicationViewer::QmlApplicationViewer(QWidget *parent)
107     : QDeclarativeView(parent)
108     , d(new QmlApplicationViewerPrivate(this))
109 {
110     connect(engine(), SIGNAL(quit()), SLOT(close()));
111     setResizeMode(QDeclarativeView::SizeRootObjectToView);
112     // Qt versions prior to 4.8.0 don't have QML/JS debugging services built in
113 #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800
114 #if !defined(NO_JSDEBUGGER)
115     new QmlJSDebugger::JSDebuggerAgent(d->view->engine());
116 #endif
117 #if !defined(NO_QMLOBSERVER)
118     new QmlJSDebugger::QDeclarativeViewObserver(d->view, d->view);
119 #endif
120 #endif
121 }
122
123 QmlApplicationViewer::QmlApplicationViewer(QDeclarativeView *view, QWidget *parent)
124     : QDeclarativeView(parent)
125     , d(new QmlApplicationViewerPrivate(view))
126 {
127     connect(view->engine(), SIGNAL(quit()), view, SLOT(close()));
128     view->setResizeMode(QDeclarativeView::SizeRootObjectToView);
129     // Qt versions prior to 4.8.0 don't have QML/JS debugging services built in
130 #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800
131 #if !defined(NO_JSDEBUGGER)
132     new QmlJSDebugger::JSDebuggerAgent(d->view->engine());
133 #endif
134 #if !defined(NO_QMLOBSERVER)
135     new QmlJSDebugger::QDeclarativeViewObserver(d->view, d->view);
136 #endif
137 #endif
138 }
139
140 QmlApplicationViewer::~QmlApplicationViewer()
141 {
142     delete d;
143 }
144
145 QmlApplicationViewer *QmlApplicationViewer::create()
146 {
147 #ifdef HARMATTAN_BOOSTER
148     return new QmlApplicationViewer(MDeclarativeCache::qDeclarativeView(), 0);
149 #else
150     return new QmlApplicationViewer();
151 #endif
152 }
153
154 void QmlApplicationViewer::setMainQmlFile(const QString &file)
155 {
156     d->mainQmlFile = d->adjustPath(file);
157     d->view->setSource(QUrl::fromLocalFile(d->mainQmlFile));
158 }
159
160 void QmlApplicationViewer::addImportPath(const QString &path)
161 {
162     d->view->engine()->addImportPath(d->adjustPath(path));
163 }
164
165 void QmlApplicationViewer::setOrientation(ScreenOrientation orientation)
166 {
167 #if defined(Q_OS_SYMBIAN)
168     // If the version of Qt on the device is < 4.7.2, that attribute won't work
169     if (orientation != ScreenOrientationAuto) {
170         const QStringList v = QString::fromAscii(qVersion()).split(QLatin1Char('.'));
171         if (v.count() == 3 && (v.at(0).toInt() << 16 | v.at(1).toInt() << 8 | v.at(2).toInt()) < 0x040702) {
172             qWarning("Screen orientation locking only supported with Qt 4.7.2 and above");
173             return;
174         }
175     }
176 #endif // Q_OS_SYMBIAN
177
178     Qt::WidgetAttribute attribute;
179     switch (orientation) {
180 #if QT_VERSION < 0x040702
181     // Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes
182     case ScreenOrientationLockPortrait:
183         attribute = static_cast<Qt::WidgetAttribute>(128);
184         break;
185     case ScreenOrientationLockLandscape:
186         attribute = static_cast<Qt::WidgetAttribute>(129);
187         break;
188     default:
189     case ScreenOrientationAuto:
190         attribute = static_cast<Qt::WidgetAttribute>(130);
191         break;
192 #else // QT_VERSION < 0x040702
193     case ScreenOrientationLockPortrait:
194         attribute = Qt::WA_LockPortraitOrientation;
195         break;
196     case ScreenOrientationLockLandscape:
197         attribute = Qt::WA_LockLandscapeOrientation;
198         break;
199     default:
200     case ScreenOrientationAuto:
201         attribute = Qt::WA_AutoOrientation;
202         break;
203 #endif // QT_VERSION < 0x040702
204     };
205     setAttribute(attribute, true);
206 }
207
208 void QmlApplicationViewer::showExpanded()
209 {
210 #if defined(Q_OS_SYMBIAN) || defined(MEEGO_EDITION_HARMATTAN) || defined(Q_WS_SIMULATOR)
211     d->view->showFullScreen();
212 #elif defined(Q_WS_MAEMO_5)
213     d->view->showMaximized();
214 #else
215     d->view->show();
216 #endif
217 }
218
219 QApplication *createApplication(int &argc, char **argv)
220 {
221 #ifdef HARMATTAN_BOOSTER
222     return MDeclarativeCache::qApplication(argc, argv);
223 #else
224     return new QApplication(argc, argv);
225 #endif
226 }