From 17d11b7be38e359b25231a03f946392a8d43e31b Mon Sep 17 00:00:00 2001 From: Kai Koehne <kai.koehne@nokia.com> Date: Fri, 10 Dec 2010 12:27:33 +0100 Subject: [PATCH] Update qmlobserver with latest qmlviewer patches Update qmlobserver with changes in qmlviewer until 376e636eccedb8d8bb. --- .../qtcreator/qml/qmlobserver/Info_mac.plist | 31 + .../{content => browser}/Browser.qml | 50 +- .../qml/qmlobserver/browser/browser.qrc | 9 + .../{content => browser}/images/folder.png | Bin .../{content => browser}/images/titlebar.png | Bin .../{content => browser}/images/titlebar.sci | 0 .../{content => browser}/images/up.png | Bin .../qml/qmlobserver/deviceorientation.cpp | 5 + .../qml/qmlobserver/deviceorientation.h | 3 + .../deviceorientation_harmattan.cpp | 161 ++++++ .../qmlobserver/deviceorientation_maemo5.cpp | 53 +- .../qmlobserver/deviceorientation_symbian.cpp | 192 +++++++ share/qtcreator/qml/qmlobserver/main.cpp | 541 +++++++++++------- .../qml/qmlobserver/qdeclarativetester.cpp | 62 +- .../qml/qmlobserver/qdeclarativetester.h | 5 +- share/qtcreator/qml/qmlobserver/qml.pri | 29 +- .../qtcreator/qml/qmlobserver/qmlobserver.pro | 41 +- .../qtcreator/qml/qmlobserver/qmlruntime.cpp | 401 ++++++++----- share/qtcreator/qml/qmlobserver/qmlruntime.h | 14 +- .../qtcreator/qml/qmlobserver/qmlruntime.qrc | 9 - .../qml/qmlobserver/startup/Logo.qml | 179 ++++++ .../qml/qmlobserver/startup/qt-back.png | Bin 0 -> 3549 bytes .../qml/qmlobserver/startup/qt-blue.jpg | Bin 0 -> 20900 bytes .../qml/qmlobserver/startup/qt-front.png | Bin 0 -> 3318 bytes .../qml/qmlobserver/startup/qt-sketch.jpg | Bin 0 -> 17048 bytes .../qml/qmlobserver/startup/qt-text.png | Bin 0 -> 14565 bytes .../qml/qmlobserver/startup/quick-blur.png | Bin 0 -> 2826 bytes .../qml/qmlobserver/startup/quick-regular.png | Bin 0 -> 1399 bytes .../qml/qmlobserver/startup/shadow.png | Bin 0 -> 1592 bytes .../qml/qmlobserver/startup/startup.qml | 173 ++++++ .../qml/qmlobserver/startup/startup.qrc | 16 + .../qml/qmlobserver/startup/white-star.png | Bin 0 -> 2651 bytes 32 files changed, 1559 insertions(+), 415 deletions(-) rename share/qtcreator/qml/qmlobserver/{content => browser}/Browser.qml (82%) create mode 100644 share/qtcreator/qml/qmlobserver/browser/browser.qrc rename share/qtcreator/qml/qmlobserver/{content => browser}/images/folder.png (100%) rename share/qtcreator/qml/qmlobserver/{content => browser}/images/titlebar.png (100%) rename share/qtcreator/qml/qmlobserver/{content => browser}/images/titlebar.sci (100%) rename share/qtcreator/qml/qmlobserver/{content => browser}/images/up.png (100%) create mode 100644 share/qtcreator/qml/qmlobserver/deviceorientation_harmattan.cpp create mode 100644 share/qtcreator/qml/qmlobserver/deviceorientation_symbian.cpp delete mode 100644 share/qtcreator/qml/qmlobserver/qmlruntime.qrc create mode 100644 share/qtcreator/qml/qmlobserver/startup/Logo.qml create mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-back.png create mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-blue.jpg create mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-front.png create mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-sketch.jpg create mode 100644 share/qtcreator/qml/qmlobserver/startup/qt-text.png create mode 100644 share/qtcreator/qml/qmlobserver/startup/quick-blur.png create mode 100644 share/qtcreator/qml/qmlobserver/startup/quick-regular.png create mode 100644 share/qtcreator/qml/qmlobserver/startup/shadow.png create mode 100644 share/qtcreator/qml/qmlobserver/startup/startup.qml create mode 100644 share/qtcreator/qml/qmlobserver/startup/startup.qrc create mode 100644 share/qtcreator/qml/qmlobserver/startup/white-star.png diff --git a/share/qtcreator/qml/qmlobserver/Info_mac.plist b/share/qtcreator/qml/qmlobserver/Info_mac.plist index 80ca6a35269..08775479baf 100644 --- a/share/qtcreator/qml/qmlobserver/Info_mac.plist +++ b/share/qtcreator/qml/qmlobserver/Info_mac.plist @@ -14,5 +14,36 @@ <string>@TYPEINFO@</string> <key>CFBundleExecutable</key> <string>@EXECUTABLE@</string> + <key>UTExportedTypeDeclarations</key> + <array> + <dict> + <key>UTTypeIdentifier</key> + <string>com.nokia.qt.qml</string> + <key>UTTypeDescription</key> + <string>Qt Markup Language</string> + <key>UTTypeConformsTo</key> + <array> + <string>public.plain-text</string> + </array> + <key>UTTypeTagSpecification</key> + <dict> + <key>public.filename-extension</key> + <array> + <string>qml</string> + </array> + </dict> + </dict> + </array> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>LSItemContentTypes</key> + <array> + <string>com.nokia.qt.qml</string> + </array> + <key>CFBundleTypeRole</key> + <string>Viewer</string> + </dict> + </array> </dict> </plist> diff --git a/share/qtcreator/qml/qmlobserver/content/Browser.qml b/share/qtcreator/qml/qmlobserver/browser/Browser.qml similarity index 82% rename from share/qtcreator/qml/qmlobserver/content/Browser.qml rename to share/qtcreator/qml/qmlobserver/browser/Browser.qml index ff2bb476473..968d077c4e2 100644 --- a/share/qtcreator/qml/qmlobserver/content/Browser.qml +++ b/share/qtcreator/qml/qmlobserver/browser/Browser.qml @@ -39,12 +39,12 @@ ** ****************************************************************************/ -import Qt 4.7 +import QtQuick 1.0 import Qt.labs.folderlistmodel 1.0 Rectangle { id: root - property bool keyPressed: false + property bool showFocusHighlight: false property variant folders: folders1 property variant view: view1 width: 320 @@ -95,6 +95,19 @@ Rectangle { view.focus = true; folders.folder = path; } + function keyPressed(key) { + switch (key) { + case Qt.Key_Up: + case Qt.Key_Down: + case Qt.Key_Left: + case Qt.Key_Right: + root.showFocusHighlight = true; + break; + default: + // do nothing + break; + } + } Component { id: folderDelegate @@ -113,6 +126,7 @@ Rectangle { Rectangle { id: highlight; visible: false anchors.fill: parent + color: palette.highlight gradient: Gradient { GradientStop { id: t1; position: 0.0; color: palette.highlight } GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } @@ -128,12 +142,16 @@ Rectangle { text: fileName anchors.leftMargin: 54 font.pixelSize: 32 - color: (wrapper.ListView.isCurrentItem && root.keyPressed) ? palette.highlightedText : palette.windowText + color: (wrapper.ListView.isCurrentItem && root.showFocusHighlight) ? palette.highlightedText : palette.windowText elide: Text.ElideRight } MouseArea { id: mouseRegion anchors.fill: parent + onPressed: { + root.showFocusHighlight = false; + wrapper.ListView.view.currentIndex = index; + } onClicked: { if (folders == wrapper.ListView.view.model) launch() } } states: [ @@ -155,7 +173,15 @@ Rectangle { width: parent.width model: folders1 delegate: folderDelegate - highlight: Rectangle { color: palette.highlight; visible: root.keyPressed && view1.count != 0 } + highlight: Rectangle { + color: palette.highlight + visible: root.showFocusHighlight && view1.count != 0 + gradient: Gradient { + GradientStop { id: t1; position: 0.0; color: palette.highlight } + GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } + } + width: view1.currentItem == null ? 0 : view1.currentItem.width + } highlightMoveSpeed: 1000 pressDelay: 100 focus: true @@ -186,7 +212,7 @@ Rectangle { NumberAnimation { properties: "x"; duration: 250 } } ] - Keys.onPressed: { root.keyPressed = true; } + Keys.onPressed: root.keyPressed(event.key) } ListView { @@ -197,7 +223,15 @@ Rectangle { width: parent.width model: folders2 delegate: folderDelegate - highlight: Rectangle { color: palette.highlight; visible: root.keyPressed && view2.count != 0 } + highlight: Rectangle { + color: palette.highlight + visible: root.showFocusHighlight && view2.count != 0 + gradient: Gradient { + GradientStop { id: t1; position: 0.0; color: palette.highlight } + GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) } + } + width: view1.currentItem == null ? 0 : view1.currentItem.width + } highlightMoveSpeed: 1000 pressDelay: 100 states: [ @@ -225,11 +259,11 @@ Rectangle { NumberAnimation { properties: "x"; duration: 250 } } ] - Keys.onPressed: { root.keyPressed = true; } + Keys.onPressed: root.keyPressed(event.key) } Keys.onPressed: { - root.keyPressed = true; + root.keyPressed(event.key); if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) { view.currentItem.launch(); event.accepted = true; diff --git a/share/qtcreator/qml/qmlobserver/browser/browser.qrc b/share/qtcreator/qml/qmlobserver/browser/browser.qrc new file mode 100644 index 00000000000..9c688e75215 --- /dev/null +++ b/share/qtcreator/qml/qmlobserver/browser/browser.qrc @@ -0,0 +1,9 @@ +<RCC> + <qresource prefix="/browser"> + <file>Browser.qml</file> + <file>images/up.png</file> + <file>images/folder.png</file> + <file>images/titlebar.sci</file> + <file>images/titlebar.png</file> + </qresource> +</RCC> diff --git a/share/qtcreator/qml/qmlobserver/content/images/folder.png b/share/qtcreator/qml/qmlobserver/browser/images/folder.png similarity index 100% rename from share/qtcreator/qml/qmlobserver/content/images/folder.png rename to share/qtcreator/qml/qmlobserver/browser/images/folder.png diff --git a/share/qtcreator/qml/qmlobserver/content/images/titlebar.png b/share/qtcreator/qml/qmlobserver/browser/images/titlebar.png similarity index 100% rename from share/qtcreator/qml/qmlobserver/content/images/titlebar.png rename to share/qtcreator/qml/qmlobserver/browser/images/titlebar.png diff --git a/share/qtcreator/qml/qmlobserver/content/images/titlebar.sci b/share/qtcreator/qml/qmlobserver/browser/images/titlebar.sci similarity index 100% rename from share/qtcreator/qml/qmlobserver/content/images/titlebar.sci rename to share/qtcreator/qml/qmlobserver/browser/images/titlebar.sci diff --git a/share/qtcreator/qml/qmlobserver/content/images/up.png b/share/qtcreator/qml/qmlobserver/browser/images/up.png similarity index 100% rename from share/qtcreator/qml/qmlobserver/content/images/up.png rename to share/qtcreator/qml/qmlobserver/browser/images/up.png diff --git a/share/qtcreator/qml/qmlobserver/deviceorientation.cpp b/share/qtcreator/qml/qmlobserver/deviceorientation.cpp index e7c70d5fde7..d3014ad150f 100644 --- a/share/qtcreator/qml/qmlobserver/deviceorientation.cpp +++ b/share/qtcreator/qml/qmlobserver/deviceorientation.cpp @@ -53,6 +53,11 @@ public: return m_orientation; } + void pauseListening() { + } + void resumeListening() { + } + void setOrientation(Orientation o) { if (o != m_orientation) { m_orientation = o; diff --git a/share/qtcreator/qml/qmlobserver/deviceorientation.h b/share/qtcreator/qml/qmlobserver/deviceorientation.h index 3bad5bec012..88ceb1bdae6 100644 --- a/share/qtcreator/qml/qmlobserver/deviceorientation.h +++ b/share/qtcreator/qml/qmlobserver/deviceorientation.h @@ -63,6 +63,9 @@ public: virtual Orientation orientation() const = 0; virtual void setOrientation(Orientation) = 0; + virtual void pauseListening() = 0; + virtual void resumeListening() = 0; + static DeviceOrientation *instance(); signals: diff --git a/share/qtcreator/qml/qmlobserver/deviceorientation_harmattan.cpp b/share/qtcreator/qml/qmlobserver/deviceorientation_harmattan.cpp new file mode 100644 index 00000000000..22f9f4c51fb --- /dev/null +++ b/share/qtcreator/qml/qmlobserver/deviceorientation_harmattan.cpp @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "deviceorientation.h" +#include <QtDBus> +#include <QDebug> + +#define ORIENTATION_SERVICE "com.nokia.SensorService" +#define ORIENTATION_PATH "/org/maemo/contextkit/Screen/TopEdge" +#define CONTEXT_INTERFACE "org.maemo.contextkit.Property" +#define CONTEXT_CHANGED "ValueChanged" +#define CONTEXT_SUBSCRIBE "Subscribe" +#define CONTEXT_UNSUBSCRIBE "Unsubscribe" +#define CONTEXT_GET "Get" + + +class HarmattanOrientation : public DeviceOrientation +{ + Q_OBJECT +public: + HarmattanOrientation() + : o(UnknownOrientation), sensorEnabled(false) + { + resumeListening(); + // connect to the orientation change signal + bool ok = QDBusConnection::systemBus().connect(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, + CONTEXT_CHANGED, + this, + SLOT(deviceOrientationChanged(QList<QVariant>,quint64))); +// qDebug() << "connection OK" << ok; + QDBusMessage reply = QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, CONTEXT_GET)); + if (reply.type() != QDBusMessage::ErrorMessage) { + QList<QVariant> args; + qvariant_cast<QDBusArgument>(reply.arguments().at(0)) >> args; + deviceOrientationChanged(args, 0); + } + } + + ~HarmattanOrientation() + { + // unsubscribe from the orientation sensor + if (sensorEnabled) + QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, CONTEXT_UNSUBSCRIBE)); + } + + inline Orientation orientation() const + { + return o; + } + + void setOrientation(Orientation) + { + } + + void pauseListening() { + if (sensorEnabled) { + // unsubscribe from the orientation sensor + QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, CONTEXT_UNSUBSCRIBE)); + sensorEnabled = false; + } + } + + void resumeListening() { + if (!sensorEnabled) { + // subscribe to the orientation sensor + QDBusMessage reply = QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, CONTEXT_SUBSCRIBE)); + + if (reply.type() == QDBusMessage::ErrorMessage) { + qWarning("Unable to retrieve device orientation: %s", qPrintable(reply.errorMessage())); + } else { + sensorEnabled = true; + } + } + } + +private Q_SLOTS: + void deviceOrientationChanged(QList<QVariant> args,quint64) + { + if (args.count() == 0) + return; + Orientation newOrientation = toOrientation(args.at(0).toString()); + if (newOrientation != o) { + o = newOrientation; + emit orientationChanged(); + } +// qDebug() << "orientation" << args.at(0).toString(); + } + +private: + static Orientation toOrientation(const QString &nativeOrientation) + { + if (nativeOrientation == "top") + return Landscape; + else if (nativeOrientation == "left") + return Portrait; + else if (nativeOrientation == "bottom") + return LandscapeInverted; + else if (nativeOrientation == "right") + return PortraitInverted; + return UnknownOrientation; + } + +private: + Orientation o; + bool sensorEnabled; +}; + +DeviceOrientation* DeviceOrientation::instance() +{ + static HarmattanOrientation *o = new HarmattanOrientation; + return o; +} + +#include "deviceorientation_harmattan.moc" diff --git a/share/qtcreator/qml/qmlobserver/deviceorientation_maemo5.cpp b/share/qtcreator/qml/qmlobserver/deviceorientation_maemo5.cpp index e942579b70d..a324820d5fa 100644 --- a/share/qtcreator/qml/qmlobserver/deviceorientation_maemo5.cpp +++ b/share/qtcreator/qml/qmlobserver/deviceorientation_maemo5.cpp @@ -50,23 +50,9 @@ class MaemoOrientation : public DeviceOrientation Q_OBJECT public: MaemoOrientation() - : o(UnknownOrientation) + : o(UnknownOrientation), sensorEnabled(false) { - // enable the orientation sensor - QDBusConnection::systemBus().call( - QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, - MCE_REQUEST_IF, MCE_ACCELEROMETER_ENABLE_REQ)); - - // query the initial orientation - QDBusMessage reply = QDBusConnection::systemBus().call( - QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, - MCE_REQUEST_IF, MCE_DEVICE_ORIENTATION_GET)); - if (reply.type() == QDBusMessage::ErrorMessage) { - qWarning("Unable to retrieve device orientation: %s", qPrintable(reply.errorMessage())); - } else { - o = toOrientation(reply.arguments().value(0).toString()); - } - + resumeListening(); // connect to the orientation change signal QDBusConnection::systemBus().connect(QString(), MCE_SIGNAL_PATH, MCE_SIGNAL_IF, MCE_DEVICE_ORIENTATION_SIG, @@ -91,6 +77,40 @@ public: { } + void pauseListening() { + if (sensorEnabled) { + // disable the orientation sensor + QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, + MCE_REQUEST_IF, MCE_ACCELEROMETER_DISABLE_REQ)); + sensorEnabled = false; + } + } + + void resumeListening() { + if (!sensorEnabled) { + // enable the orientation sensor + QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, + MCE_REQUEST_IF, MCE_ACCELEROMETER_ENABLE_REQ)); + + QDBusMessage reply = QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(MCE_SERVICE, MCE_REQUEST_PATH, + MCE_REQUEST_IF, MCE_DEVICE_ORIENTATION_GET)); + + if (reply.type() == QDBusMessage::ErrorMessage) { + qWarning("Unable to retrieve device orientation: %s", qPrintable(reply.errorMessage())); + } else { + Orientation orientation = toOrientation(reply.arguments().value(0).toString()); + if (o != orientation) { + o = orientation; + emit orientationChanged(); + } + sensorEnabled = true; + } + } + } + private Q_SLOTS: void deviceOrientationChanged(const QString &newOrientation) { @@ -116,6 +136,7 @@ private: private: Orientation o; + bool sensorEnabled; }; DeviceOrientation* DeviceOrientation::instance() diff --git a/share/qtcreator/qml/qmlobserver/deviceorientation_symbian.cpp b/share/qtcreator/qml/qmlobserver/deviceorientation_symbian.cpp new file mode 100644 index 00000000000..7710cf9b19c --- /dev/null +++ b/share/qtcreator/qml/qmlobserver/deviceorientation_symbian.cpp @@ -0,0 +1,192 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "deviceorientation.h" + +#include <e32base.h> +#include <sensrvchannelfinder.h> +#include <sensrvdatalistener.h> +#include <sensrvchannel.h> +#include <sensrvorientationsensor.h> + +class SymbianOrientation : public DeviceOrientation, public MSensrvDataListener +{ + Q_OBJECT +public: + SymbianOrientation() + : DeviceOrientation(), m_current(UnknownOrientation), m_sensorChannel(0), m_channelOpen(false) + { + TRAP_IGNORE(initL()); + if (!m_sensorChannel) + qWarning("No valid sensors found."); + } + + ~SymbianOrientation() + { + if (m_sensorChannel) { + m_sensorChannel->StopDataListening(); + m_sensorChannel->CloseChannel(); + delete m_sensorChannel; + } + } + + void initL() + { + CSensrvChannelFinder *channelFinder = CSensrvChannelFinder::NewLC(); + RSensrvChannelInfoList channelInfoList; + CleanupClosePushL(channelInfoList); + + TSensrvChannelInfo searchConditions; + searchConditions.iChannelType = KSensrvChannelTypeIdOrientationData; + channelFinder->FindChannelsL(channelInfoList, searchConditions); + + for (int i = 0; i < channelInfoList.Count(); ++i) { + TRAPD(error, m_sensorChannel = CSensrvChannel::NewL(channelInfoList[i])); + if (!error) + TRAP(error, m_sensorChannel->OpenChannelL()); + if (!error) { + TRAP(error, m_sensorChannel->StartDataListeningL(this, 1, 1, 0)); + m_channelOpen = true; + break; + } + if (error) { + delete m_sensorChannel; + m_sensorChannel = 0; + } + } + + channelInfoList.Close(); + CleanupStack::Pop(&channelInfoList); + CleanupStack::PopAndDestroy(channelFinder); + } + + Orientation orientation() const + { + return m_current; + } + + void setOrientation(Orientation) { } + +private: + DeviceOrientation::Orientation m_current; + CSensrvChannel *m_sensorChannel; + bool m_channelOpen; + void pauseListening() { + if (m_sensorChannel && m_channelOpen) { + m_sensorChannel->StopDataListening(); + m_sensorChannel->CloseChannel(); + m_channelOpen = false; + } + } + + void resumeListening() { + if (m_sensorChannel && !m_channelOpen) { + TRAPD(error, m_sensorChannel->OpenChannelL()); + if (!error) { + TRAP(error, m_sensorChannel->StartDataListeningL(this, 1, 1, 0)); + if (!error) { + m_channelOpen = true; + } + } + if (error) { + delete m_sensorChannel; + m_sensorChannel = 0; + } + } + } + + void DataReceived(CSensrvChannel &channel, TInt count, TInt dataLost) + { + Q_UNUSED(dataLost) + if (channel.GetChannelInfo().iChannelType == KSensrvChannelTypeIdOrientationData) { + TSensrvOrientationData data; + for (int i = 0; i < count; ++i) { + TPckgBuf<TSensrvOrientationData> dataBuf; + channel.GetData(dataBuf); + data = dataBuf(); + Orientation orientation = UnknownOrientation; + switch (data.iDeviceOrientation) { + case TSensrvOrientationData::EOrientationDisplayUp: + orientation = Portrait; + break; + case TSensrvOrientationData::EOrientationDisplayRightUp: + orientation = Landscape; + break; + case TSensrvOrientationData::EOrientationDisplayLeftUp: + orientation = LandscapeInverted; + break; + case TSensrvOrientationData::EOrientationDisplayDown: + orientation = PortraitInverted; + break; + case TSensrvOrientationData::EOrientationUndefined: + case TSensrvOrientationData::EOrientationDisplayUpwards: + case TSensrvOrientationData::EOrientationDisplayDownwards: + default: + break; + } + + if (m_current != orientation && orientation != UnknownOrientation) { + m_current = orientation; + emit orientationChanged(); + } + } + } + } + + void DataError(CSensrvChannel& /* channel */, TSensrvErrorSeverity /* error */) + { + } + + void GetDataListenerInterfaceL(TUid /* interfaceUid */, TAny*& /* interface */) + { + } +}; + + +DeviceOrientation* DeviceOrientation::instance() +{ + static SymbianOrientation *o = 0; + if (!o) + o = new SymbianOrientation; + return o; +} + +#include "deviceorientation_symbian.moc" diff --git a/share/qtcreator/qml/qmlobserver/main.cpp b/share/qtcreator/qml/qmlobserver/main.cpp index 86a8085cd0a..9b607e81919 100644 --- a/share/qtcreator/qml/qmlobserver/main.cpp +++ b/share/qtcreator/qml/qmlobserver/main.cpp @@ -49,6 +49,7 @@ #include <QTranslator> #include <QDebug> #include <QMessageBox> +#include <QAtomicInt> #include "qdeclarativetester.h" #include "qt_private/qdeclarativedebughelper_p.h" @@ -56,6 +57,9 @@ QT_USE_NAMESPACE QtMsgHandler systemMsgOutput = 0; +static QDeclarativeViewer *openFile(const QString &fileName); +static void showViewer(QDeclarativeViewer *viewer); + #if defined (Q_OS_SYMBIAN) #include <unistd.h> #include <sys/types.h> @@ -83,35 +87,50 @@ void myMessageOutput(QtMsgType type, const char *msg) QWeakPointer<LoggerWidget> logger; QString warnings; -void showWarnings() +void exitApp(int i) { +#ifdef Q_OS_WIN + // Debugging output is not visible by default on Windows - + // therefore show modal dialog with errors instead. if (!warnings.isEmpty()) { - int argc = 0; char **argv = 0; - QApplication application(argc, argv); // QApplication() in main has been destroyed already. - Q_UNUSED(application) QMessageBox::warning(0, QApplication::tr("Qt QML Viewer"), warnings); } +#endif + exit(i); } +static QAtomicInt recursiveLock(0); + void myMessageOutput(QtMsgType type, const char *msg) { - if (!logger.isNull()) { - QString strMsg = QString::fromAscii(msg); - QMetaObject::invokeMethod(logger.data(), "append", Q_ARG(QString, strMsg)); - } else { - warnings += msg; - warnings += QLatin1Char('\n'); + QString strMsg = QString::fromLatin1(msg); + + if (!QCoreApplication::closingDown()) { + if (!logger.isNull()) { + if (recursiveLock.testAndSetOrdered(0, 1)) { + QMetaObject::invokeMethod(logger.data(), "append", Q_ARG(QString, strMsg)); + recursiveLock = 0; + } + } else { + warnings += strMsg; + warnings += QLatin1Char('\n'); + } } if (systemMsgOutput) { // Windows systemMsgOutput(type, msg); } else { // Unix - fprintf(stderr, "%s\n",msg); + fprintf(stderr, "%s\n", msg); fflush(stderr); } } #endif +static QDeclarativeViewer* globalViewer = 0; + +// The qml file that is shown if the user didn't specify a QML file +QString initialFile = "qrc:/startup/startup.qml"; + void usage() { qWarning("Usage: qmlobserver [options] <filename>"); @@ -143,7 +162,11 @@ void usage() qWarning(" -I <directory> ........................... prepend to the module import search path,"); qWarning(" display path if <directory> is empty"); qWarning(" -P <directory> ........................... prepend to the plugin search path"); +#if defined(Q_WS_MAC) + qWarning(" -no-opengl ............................... don't use a QGLWidget for the viewport"); +#else qWarning(" -opengl .................................. use a QGLWidget for the viewport"); +#endif #ifndef NO_PRIVATE_HEADERS qWarning(" -script <path> ........................... set the script to use"); qWarning(" -scriptopts <options>|help ............... set the script options to use"); @@ -151,7 +174,8 @@ void usage() qWarning(" "); qWarning(" Press F1 for interactive help"); - exit(1); + + exitApp(1); } void scriptOptsUsage() @@ -162,6 +186,7 @@ void scriptOptsUsage() qWarning(" play ..................................... playback an existing script"); qWarning(" testimages ............................... record images or compare images on playback"); qWarning(" testerror ................................ test 'error' property of root item on playback"); + qWarning(" testskip ................................ test 'skip' property of root item on playback"); qWarning(" snapshot ................................. file being recorded is static,"); qWarning(" only one frame will be recorded or tested"); qWarning(" exitoncomplete ........................... cleanly exit the viewer on script completion"); @@ -169,142 +194,213 @@ void scriptOptsUsage() qWarning(" saveonexit ............................... save recording on viewer exit"); qWarning(" "); qWarning(" One of record, play or both must be specified."); - exit(1); + + exitApp(1); } enum WarningsConfig { ShowWarnings, HideWarnings, DefaultWarnings }; -int main(int argc, char ** argv) +struct ViewerOptions { -#if defined (Q_OS_SYMBIAN) - qInstallMsgHandler(myMessageOutput); -#else - systemMsgOutput = qInstallMsgHandler(myMessageOutput); + ViewerOptions() + : frameless(false), + fps(0.0), + autorecord_from(0), + autorecord_to(0), + dither("none"), + runScript(false), + devkeys(false), + cache(0), + useGL(false), + fullScreen(false), + stayOnTop(false), + maximized(false), + useNativeFileBrowser(true), + experimentalGestures(false), + warningsConfig(DefaultWarnings), + sizeToView(true) + { +#if defined(Q_OS_SYMBIAN) + maximized = true; + useNativeFileBrowser = false; #endif -#if defined (Q_OS_WIN) - // Debugging output is not visible by default on Windows - - // therefore show modal dialog with errors instead. - - // (Disabled in QmlObserver: We're usually running inside QtCreator anyway, see also QTCREATORBUG-2748) -// atexit(showWarnings); +#if defined(Q_WS_MAC) + useGL = true; #endif - -#if defined (Q_WS_X11) || defined (Q_WS_MAC) - //### default to using raster graphics backend for now - bool gsSpecified = false; - for (int i = 0; i < argc; ++i) { - QString arg = argv[i]; - if (arg == "-graphicssystem") { - gsSpecified = true; - break; - } } - if (!gsSpecified) - QApplication::setGraphicsSystem("raster"); -#endif - - QApplication app(argc, argv); - app.setApplicationName("QtQmlViewer"); - app.setOrganizationName("Nokia"); - app.setOrganizationDomain("nokia.com"); - - QDeclarativeViewer::registerTypes(); - QDeclarativeTester::registerTypes(); - - bool frameless = false; - QString fileName; - double fps = 0; - int autorecord_from = 0; - int autorecord_to = 0; - QString dither = "none"; + bool frameless; + double fps; + int autorecord_from; + int autorecord_to; + QString dither; QString recordfile; QStringList recordargs; QStringList imports; QStringList plugins; QString script; QString scriptopts; - bool runScript = false; - bool devkeys = false; - int cache = 0; + bool runScript; + bool devkeys; + int cache; QString translationFile; - bool useGL = false; - bool fullScreen = false; - bool stayOnTop = false; - bool maximized = false; - bool useNativeFileBrowser = true; - bool experimentalGestures = false; - bool designModeBehavior = false; - bool debuggerModeBehavior = false; - - WarningsConfig warningsConfig = DefaultWarnings; - bool sizeToView = true; + bool useGL; + bool fullScreen; + bool stayOnTop; + bool maximized; + bool useNativeFileBrowser; + bool experimentalGestures; -#if defined(Q_OS_SYMBIAN) - maximized = true; - useNativeFileBrowser = false; -#endif + WarningsConfig warningsConfig; + bool sizeToView; -#if defined(Q_WS_MAC) - useGL = true; -#endif + QDeclarativeViewer::ScriptOptions scriptOptions; +}; - for (int i = 1; i < argc; ++i) { - bool lastArg = (i == argc - 1); - QString arg = argv[i]; +static ViewerOptions opts; +static QStringList fileNames; + +class Application : public QApplication +{ + Q_OBJECT +public: + Application(int &argc, char **&argv) + : QApplication(argc, argv) + {} + +protected: + bool event(QEvent *ev) + { + if (ev->type() != QEvent::FileOpen) + return QApplication::event(ev); + + QFileOpenEvent *fev = static_cast<QFileOpenEvent *>(ev); + + globalViewer->open(fev->file()); + if (!globalViewer->isVisible()) + showViewer(globalViewer); + + return true; + } + +private Q_SLOTS: + void showInitialViewer() + { + QApplication::processEvents(); + + QDeclarativeViewer *viewer = globalViewer; + if (!viewer) + return; + if (viewer->currentFile().isEmpty()) { + if(opts.useNativeFileBrowser) + viewer->open(initialFile); + else + viewer->openFile(); + } + if (!viewer->isVisible()) + showViewer(viewer); + } +}; + +static void parseScriptOptions() +{ + QStringList options = + opts.scriptopts.split(QLatin1Char(','), QString::SkipEmptyParts); + + QDeclarativeViewer::ScriptOptions scriptOptions = 0; + for (int i = 0; i < options.count(); ++i) { + const QString &option = options.at(i); + if (option == QLatin1String("help")) { + scriptOptsUsage(); + } else if (option == QLatin1String("play")) { + scriptOptions |= QDeclarativeViewer::Play; + } else if (option == QLatin1String("record")) { + scriptOptions |= QDeclarativeViewer::Record; + } else if (option == QLatin1String("testimages")) { + scriptOptions |= QDeclarativeViewer::TestImages; + } else if (option == QLatin1String("testerror")) { + scriptOptions |= QDeclarativeViewer::TestErrorProperty; + } else if (option == QLatin1String("testskip")) { + scriptOptions |= QDeclarativeViewer::TestSkipProperty; + } else if (option == QLatin1String("exitoncomplete")) { + scriptOptions |= QDeclarativeViewer::ExitOnComplete; + } else if (option == QLatin1String("exitonfailure")) { + scriptOptions |= QDeclarativeViewer::ExitOnFailure; + } else if (option == QLatin1String("saveonexit")) { + scriptOptions |= QDeclarativeViewer::SaveOnExit; + } else if (option == QLatin1String("snapshot")) { + scriptOptions |= QDeclarativeViewer::Snapshot; + } else { + scriptOptsUsage(); + } + } + + opts.scriptOptions = scriptOptions; +} + +static void parseCommandLineOptions(const QStringList &arguments) +{ + for (int i = 1; i < arguments.count(); ++i) { + bool lastArg = (i == arguments.count() - 1); + QString arg = arguments.at(i); if (arg == "-frameless") { - frameless = true; + opts.frameless = true; } else if (arg == "-maximized") { - maximized = true; + opts.maximized = true; } else if (arg == "-fullscreen") { - fullScreen = true; + opts.fullScreen = true; } else if (arg == "-stayontop") { - stayOnTop = true; + opts.stayOnTop = true; } else if (arg == "-netcache") { if (lastArg) usage(); - cache = QString(argv[++i]).toInt(); + opts.cache = arguments.at(++i).toInt(); } else if (arg == "-recordrate") { if (lastArg) usage(); - fps = QString(argv[++i]).toDouble(); + opts.fps = arguments.at(++i).toDouble(); } else if (arg == "-recordfile") { if (lastArg) usage(); - recordfile = QString(argv[++i]); + opts.recordfile = arguments.at(++i); } else if (arg == "-record") { if (lastArg) usage(); - recordargs << QString(argv[++i]); + opts.recordargs << arguments.at(++i); } else if (arg == "-recorddither") { if (lastArg) usage(); - dither = QString(argv[++i]); + opts.dither = arguments.at(++i); } else if (arg == "-autorecord") { if (lastArg) usage(); - QString range = QString(argv[++i]); + QString range = arguments.at(++i); int dash = range.indexOf('-'); if (dash > 0) - autorecord_from = range.left(dash).toInt(); - autorecord_to = range.mid(dash+1).toInt(); + opts.autorecord_from = range.left(dash).toInt(); + opts.autorecord_to = range.mid(dash+1).toInt(); } else if (arg == "-devicekeys") { - devkeys = true; + opts.devkeys = true; } else if (arg == "-dragthreshold") { if (lastArg) usage(); - app.setStartDragDistance(QString(argv[++i]).toInt()); + qApp->setStartDragDistance(arguments.at(++i).toInt()); } else if (arg == QLatin1String("-v") || arg == QLatin1String("-version")) { qWarning("Qt QML Viewer version %s", QT_VERSION_STR); - exit(0); + exitApp(0); } else if (arg == "-translation") { if (lastArg) usage(); - translationFile = argv[++i]; + opts.translationFile = arguments.at(++i); +#if defined(Q_WS_MAC) + } else if (arg == "-no-opengl") { + opts.useGL = false; +#else } else if (arg == "-opengl") { - useGL = true; + opts.useGL = true; +#endif } else if (arg == "-qmlbrowser") { - useNativeFileBrowser = false; + opts.useNativeFileBrowser = false; } else if (arg == "-warnings") { if (lastArg) usage(); - QString warningsStr = QString(argv[++i]); + QString warningsStr = arguments.at(++i); if (warningsStr == QLatin1String("show")) { - warningsConfig = ShowWarnings; + opts.warningsConfig = ShowWarnings; } else if (warningsStr == QLatin1String("hide")) { - warningsConfig = HideWarnings; + opts.warningsConfig = HideWarnings; } else { usage(); } @@ -315,164 +411,201 @@ int main(int argc, char ** argv) QDeclarativeEngine tmpEngine; QString paths = tmpEngine.importPathList().join(QLatin1String(":")); qWarning("Current search path: %s", paths.toLocal8Bit().constData()); - exit(0); + exitApp(0); } - imports << QString(argv[++i]); + opts.imports << arguments.at(++i); } else if (arg == "-P") { if (lastArg) usage(); - plugins << QString(argv[++i]); + opts.plugins << arguments.at(++i); } else if (arg == "-script") { if (lastArg) usage(); - script = QString(argv[++i]); + opts.script = arguments.at(++i); } else if (arg == "-scriptopts") { if (lastArg) usage(); - scriptopts = QString(argv[++i]); + opts.scriptopts = arguments.at(++i); } else if (arg == "-savescript") { if (lastArg) usage(); - script = QString(argv[++i]); - runScript = false; + opts.script = arguments.at(++i); + opts.runScript = false; } else if (arg == "-playscript") { if (lastArg) usage(); - script = QString(argv[++i]); - runScript = true; + opts.script = arguments.at(++i); + opts.runScript = true; } else if (arg == "-sizeviewtorootobject") { - sizeToView = false; + opts.sizeToView = false; } else if (arg == "-sizerootobjecttoview") { - sizeToView = true; + opts.sizeToView = true; } else if (arg == "-experimentalgestures") { - experimentalGestures = true; - } else if (arg == "-designmode") { - designModeBehavior = true; - } else if (arg == "-debugger") { - debuggerModeBehavior = true; - } else if (arg[0] != '-') { - fileName = arg; - } else if (1 || arg == "-help") { + opts.experimentalGestures = true; + } else if (!arg.startsWith('-')) { + fileNames.append(arg); + } else if (true || arg == "-help") { usage(); } } - QTranslator qmlTranslator; - if (!translationFile.isEmpty()) { - qmlTranslator.load(translationFile); - app.installTranslator(&qmlTranslator); + if (!opts.scriptopts.isEmpty()) { + + parseScriptOptions(); + + if (opts.script.isEmpty()) + usage(); + + if (!(opts.scriptOptions & QDeclarativeViewer::Record) && !(opts.scriptOptions & QDeclarativeViewer::Play)) + scriptOptsUsage(); + } else if (!opts.script.isEmpty()) { + usage(); } - Qt::WFlags wflags = (frameless ? Qt::FramelessWindowHint : Qt::Widget); - if (stayOnTop) - wflags |= Qt::WindowStaysOnTopHint; +} - // enable remote debugging - QDeclarativeDebugHelper::enableDebugging(); +static QDeclarativeViewer *createViewer() +{ + Qt::WFlags wflags = (opts.frameless ? Qt::FramelessWindowHint : Qt::Widget); + if (opts.stayOnTop) + wflags |= Qt::WindowStaysOnTopHint; QDeclarativeViewer *viewer = new QDeclarativeViewer(0, wflags); viewer->setAttribute(Qt::WA_DeleteOnClose, true); - if (!scriptopts.isEmpty()) { - QStringList options = - scriptopts.split(QLatin1Char(','), QString::SkipEmptyParts); - - QDeclarativeViewer::ScriptOptions scriptOptions = 0; - for (int i = 0; i < options.count(); ++i) { - const QString &option = options.at(i); - if (option == QLatin1String("help")) { - scriptOptsUsage(); - } else if (option == QLatin1String("play")) { - scriptOptions |= QDeclarativeViewer::Play; - } else if (option == QLatin1String("record")) { - scriptOptions |= QDeclarativeViewer::Record; - } else if (option == QLatin1String("testimages")) { - scriptOptions |= QDeclarativeViewer::TestImages; - } else if (option == QLatin1String("testerror")) { - scriptOptions |= QDeclarativeViewer::TestErrorProperty; - } else if (option == QLatin1String("exitoncomplete")) { - scriptOptions |= QDeclarativeViewer::ExitOnComplete; - } else if (option == QLatin1String("exitonfailure")) { - scriptOptions |= QDeclarativeViewer::ExitOnFailure; - } else if (option == QLatin1String("saveonexit")) { - scriptOptions |= QDeclarativeViewer::SaveOnExit; - } else if (option == QLatin1String("snapshot")) { - scriptOptions |= QDeclarativeViewer::Snapshot; - } else { - scriptOptsUsage(); - } - } - - if (script.isEmpty()) - usage(); + viewer->setUseGL(opts.useGL); - if (!(scriptOptions & QDeclarativeViewer::Record) && !(scriptOptions & QDeclarativeViewer::Play)) - scriptOptsUsage(); - viewer->setScriptOptions(scriptOptions); - viewer->setScript(script); - } else if (!script.isEmpty()) { - usage(); + if (!opts.scriptopts.isEmpty()) { + viewer->setScriptOptions(opts.scriptOptions); + viewer->setScript(opts.script); } #if !defined(Q_OS_SYMBIAN) logger = viewer->warningsWidget(); - if (warningsConfig == ShowWarnings) { + if (opts.warningsConfig == ShowWarnings) { logger.data()->setDefaultVisibility(LoggerWidget::ShowWarnings); logger.data()->show(); - } else if (warningsConfig == HideWarnings){ + } else if (opts.warningsConfig == HideWarnings){ logger.data()->setDefaultVisibility(LoggerWidget::HideWarnings); } #endif - if (experimentalGestures) + if (opts.experimentalGestures) viewer->enableExperimentalGestures(); - viewer->setDesignModeBehavior(designModeBehavior); - viewer->setStayOnTop(stayOnTop); - - foreach (QString lib, imports) + foreach (QString lib, opts.imports) viewer->addLibraryPath(lib); - foreach (QString plugin, plugins) + foreach (QString plugin, opts.plugins) viewer->addPluginPath(plugin); - viewer->setNetworkCacheSize(cache); - viewer->setRecordFile(recordfile); - viewer->setSizeToView(sizeToView); - if (fps>0) - viewer->setRecordRate(fps); - if (autorecord_to) - viewer->setAutoRecord(autorecord_from,autorecord_to); - if (devkeys) + viewer->setNetworkCacheSize(opts.cache); + viewer->setRecordFile(opts.recordfile); + viewer->setSizeToView(opts.sizeToView); + if (opts.fps > 0) + viewer->setRecordRate(opts.fps); + if (opts.autorecord_to) + viewer->setAutoRecord(opts.autorecord_from, opts.autorecord_to); + if (opts.devkeys) viewer->setDeviceKeys(true); - viewer->setRecordDither(dither); - if (recordargs.count()) - viewer->setRecordArgs(recordargs); + viewer->setRecordDither(opts.dither); + if (opts.recordargs.count()) + viewer->setRecordArgs(opts.recordargs); + + viewer->setUseNativeFileBrowser(opts.useNativeFileBrowser); + + return viewer; +} + +void showViewer(QDeclarativeViewer *viewer) +{ + if (opts.fullScreen) + viewer->showFullScreen(); + else if (opts.maximized) + viewer->showMaximized(); + else + viewer->show(); + viewer->raise(); +} + +QDeclarativeViewer *openFile(const QString &fileName) +{ + QDeclarativeViewer *viewer = globalViewer; + + viewer->open(fileName); + showViewer(viewer); + + return viewer; +} + +int main(int argc, char ** argv) +{ +#if defined (Q_OS_SYMBIAN) + qInstallMsgHandler(myMessageOutput); +#else + systemMsgOutput = qInstallMsgHandler(myMessageOutput); +#endif + +#if defined (Q_WS_X11) || defined (Q_WS_MAC) + //### default to using raster graphics backend for now + bool gsSpecified = false; + for (int i = 0; i < argc; ++i) { + QString arg = argv[i]; + if (arg == "-graphicssystem") { + gsSpecified = true; + break; + } + } + + if (!gsSpecified) + QApplication::setGraphicsSystem("raster"); +#endif + + Application app(argc, argv); + app.setApplicationName("QtQmlViewer"); + app.setOrganizationName("Nokia"); + app.setOrganizationDomain("nokia.com"); + + QDeclarativeViewer::registerTypes(); + QDeclarativeTester::registerTypes(); + + parseCommandLineOptions(app.arguments()); - viewer->setUseNativeFileBrowser(useNativeFileBrowser); - if (fullScreen && maximized) + QTranslator qmlTranslator; + if (!opts.translationFile.isEmpty()) { + qmlTranslator.load(opts.translationFile); + app.installTranslator(&qmlTranslator); + } + + if (opts.fullScreen && opts.maximized) qWarning() << "Both -fullscreen and -maximized specified. Using -fullscreen."; - if (fileName.isEmpty()) { + if (fileNames.isEmpty()) { QFile qmlapp(QLatin1String("qmlapp")); if (qmlapp.exists() && qmlapp.open(QFile::ReadOnly)) { - QString content = QString::fromUtf8(qmlapp.readAll()); - qmlapp.close(); - - int newline = content.indexOf(QLatin1Char('\n')); - if (newline >= 0) - fileName = content.left(newline); - else - fileName = content; - } + QString content = QString::fromUtf8(qmlapp.readAll()); + qmlapp.close(); + + int newline = content.indexOf(QLatin1Char('\n')); + if (newline >= 0) + fileNames += content.left(newline); + else + fileNames += content; + } } - if (!fileName.isEmpty()) { - viewer->open(fileName); - fullScreen ? viewer->showFullScreen() : maximized ? viewer->showMaximized() : viewer->show(); + //enable remote debugging + QDeclarativeDebugHelper::enableDebugging(); + + globalViewer = createViewer(); + + if (fileNames.isEmpty()) { + // show the initial viewer delayed. + // This prevents an initial viewer popping up while there + // are FileOpen events coming through the event queue + QTimer::singleShot(1, &app, SLOT(showInitialViewer())); } else { - if (!useNativeFileBrowser) - viewer->openFile(); - fullScreen ? viewer->showFullScreen() : maximized ? viewer->showMaximized() : viewer->show(); - if (useNativeFileBrowser) - viewer->openFile(); + foreach (const QString &fileName, fileNames) + openFile(fileName); } - viewer->setUseGL(useGL); - viewer->raise(); + + QObject::connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); return app.exec(); } + +#include "main.moc" diff --git a/share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp b/share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp index 83e8c06018e..c736879a361 100644 --- a/share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp +++ b/share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp @@ -48,7 +48,6 @@ #include <QDir> #include <QCryptographicHash> #include <QGraphicsObject> - #ifndef NO_PRIVATE_HEADERS #include <private/qabstractanimation_p.h> #include <private/qdeclarativeitem_p.h> @@ -56,6 +55,7 @@ QT_BEGIN_NAMESPACE +extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled; QDeclarativeTester::QDeclarativeTester(const QString &script, QDeclarativeViewer::ScriptOptions opts, QDeclarativeView *parent) @@ -67,6 +67,12 @@ QDeclarativeTester::QDeclarativeTester(const QString &script, QDeclarativeViewer #ifndef NO_PRIVATE_HEADERS QUnifiedTimer::instance()->setConsistentTiming(true); #endif + + //Font antialiasing makes tests system-specific, so disable it + QFont noAA = QApplication::font(); + noAA.setStyleStrategy(QFont::NoAntialias); + QApplication::setFont(noAA); + if (options & QDeclarativeViewer::Play) this->run(); start(); @@ -75,7 +81,7 @@ QDeclarativeTester::QDeclarativeTester(const QString &script, QDeclarativeViewer QDeclarativeTester::~QDeclarativeTester() { if (!hasFailed && - options & QDeclarativeViewer::Record && + options & QDeclarativeViewer::Record && options & QDeclarativeViewer::SaveOnExit) save(); } @@ -142,8 +148,25 @@ void QDeclarativeTester::imagefailure() { hasFailed = true; - if (options & QDeclarativeViewer::ExitOnFailure) - exit(-1); + if (options & QDeclarativeViewer::ExitOnFailure){ + testSkip(); + exit(hasFailed?-1:0); + } +} + +void QDeclarativeTester::testSkip() +{ + if (options & QDeclarativeViewer::TestSkipProperty){ + QString e = m_view->rootObject()->property("skip").toString(); + if (!e.isEmpty()) { + if(hasFailed){ + qWarning() << "Test failed, but skipping it: " << e; + }else{ + qWarning() << "Test skipped: " << e; + } + hasFailed = 0; + } + } } void QDeclarativeTester::complete() @@ -155,7 +178,10 @@ void QDeclarativeTester::complete() hasFailed = true; } } - if (options & QDeclarativeViewer::ExitOnComplete) + + + testSkip(); + if (options & QDeclarativeViewer::ExitOnComplete) QApplication::exit(hasFailed?-1:0); if (hasCompleted) @@ -207,7 +233,7 @@ void QDeclarativeTester::save() } ts << " }\n"; - while (!mouseevents.isEmpty() && + while (!mouseevents.isEmpty() && mouseevents.first().msec == fe.msec) { MouseEvent me = mouseevents.takeFirst(); @@ -255,7 +281,16 @@ void QDeclarativeTester::updateCurrentTime(int msec) if (options & QDeclarativeViewer::TestImages) { img.fill(qRgb(255,255,255)); + +#ifdef Q_WS_MAC + bool oldSmooth = qt_applefontsmoothing_enabled; + qt_applefontsmoothing_enabled = false; +#endif QPainter p(&img); +#ifdef Q_WS_MAC + qt_applefontsmoothing_enabled = oldSmooth; +#endif + m_view->render(&p); } @@ -266,7 +301,7 @@ void QDeclarativeTester::updateCurrentTime(int msec) fe.msec = msec; if (msec == 0 || !(options & QDeclarativeViewer::TestImages)) { // Skip first frame, skip if not doing images - } else if (0 == (m_savedFrameEvents.count() % 60) || snapshot) { + } else if (0 == ((m_savedFrameEvents.count()-1) % 60) || snapshot) { fe.image = img; } else { QCryptographicHash hash(QCryptographicHash::Md5); @@ -317,14 +352,14 @@ void QDeclarativeTester::updateCurrentTime(int msec) if (QDeclarativeVisualTestFrame *frame = qobject_cast<QDeclarativeVisualTestFrame *>(event)) { if (frame->msec() < msec) { if (options & QDeclarativeViewer::TestImages && !(options & QDeclarativeViewer::Record)) { - qWarning() << "QDeclarativeTester: Extra frame. Seen:" + qWarning() << "QDeclarativeTester(" << m_script << "): Extra frame. Seen:" << msec << "Expected:" << frame->msec(); imagefailure(); } } else if (frame->msec() == msec) { if (!frame->hash().isEmpty() && frame->hash().toUtf8() != fe.hash.toHex()) { if (options & QDeclarativeViewer::TestImages && !(options & QDeclarativeViewer::Record)) { - qWarning() << "QDeclarativeTester: Mismatched frame hash at" << msec + qWarning() << "QDeclarativeTester(" << m_script << "): Mismatched frame hash at" << msec << ". Seen:" << fe.hash.toHex() << "Expected:" << frame->hash().toUtf8(); imagefailure(); @@ -336,9 +371,14 @@ void QDeclarativeTester::updateCurrentTime(int msec) if (options & QDeclarativeViewer::TestImages && !(options & QDeclarativeViewer::Record) && !frame->image().isEmpty()) { QImage goodImage(frame->image().toLocalFile()); + if (frame->msec() == 16 && goodImage.size() != img.size()){ + //Also an image mismatch, but this warning is more informative. Only checked at start though. + qWarning() << "QDeclarativeTester(" << m_script << "): Size mismatch. This test must be run at " << goodImage.size(); + imagefailure(); + } if (goodImage != img) { QString reject(frame->image().toLocalFile() + ".reject.png"); - qWarning() << "QDeclarativeTester: Image mismatch. Reject saved to:" + qWarning() << "QDeclarativeTester(" << m_script << "): Image mismatch. Reject saved to:" << reject; img.save(reject); bool doDiff = (goodImage.size() == img.size()); @@ -391,7 +431,7 @@ void QDeclarativeTester::updateCurrentTime(int msec) ke.destination = ViewPort; } m_savedKeyEvents.append(ke); - } + } testscriptidx++; } diff --git a/share/qtcreator/qml/qmlobserver/qdeclarativetester.h b/share/qtcreator/qml/qmlobserver/qdeclarativetester.h index 021869d93a3..6fdf495c1f1 100644 --- a/share/qtcreator/qml/qmlobserver/qdeclarativetester.h +++ b/share/qtcreator/qml/qmlobserver/qdeclarativetester.h @@ -122,7 +122,7 @@ public: int type() const { return m_type; } void setType(int t) { m_type = t; } - + int button() const { return m_button; } void setButton(int b) { m_button = b; } @@ -228,6 +228,7 @@ private: void imagefailure(); void complete(); + void testSkip(); enum Destination { View, ViewPort }; void addKeyEvent(Destination, QKeyEvent *); @@ -236,7 +237,7 @@ private: struct MouseEvent { MouseEvent(QMouseEvent *e) - : type(e->type()), button(e->button()), buttons(e->buttons()), + : type(e->type()), button(e->button()), buttons(e->buttons()), pos(e->pos()), modifiers(e->modifiers()), destination(View) {} QEvent::Type type; diff --git a/share/qtcreator/qml/qmlobserver/qml.pri b/share/qtcreator/qml/qmlobserver/qml.pri index 7e485d3984c..5db76780810 100644 --- a/share/qtcreator/qml/qmlobserver/qml.pri +++ b/share/qtcreator/qml/qmlobserver/qml.pri @@ -1,14 +1,9 @@ QT += declarative script network sql - contains(QT_CONFIG, opengl) { QT += opengl DEFINES += GL_SUPPORTED } -!exists($$[QT_INSTALL_HEADERS]/QtCore/private/qabstractanimation_p.h) { - DEFINES += NO_PRIVATE_HEADERS -} - INCLUDEPATH += $$PWD HEADERS += $$PWD/qmlruntime.h \ @@ -16,25 +11,31 @@ HEADERS += $$PWD/qmlruntime.h \ $$PWD/qdeclarativetester.h \ $$PWD/deviceorientation.h \ $$PWD/loggerwidget.h - - SOURCES += $$PWD/qmlruntime.cpp \ $$PWD/proxysettings.cpp \ $$PWD/qdeclarativetester.cpp \ $$PWD/loggerwidget.cpp -RESOURCES += $$PWD/qmlruntime.qrc - -OTHER_FILES += toolbarstyle.css +RESOURCES = $$PWD/browser/browser.qrc \ + $$PWD/startup/startup.qrc -maemo5 { +symbian:!contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) { + SOURCES += $$PWD/deviceorientation_symbian.cpp + FORMS = $$PWD/recopts.ui \ + $$PWD/proxysettings.ui +} else:maemo5 { QT += dbus HEADERS += $$PWD/texteditautoresizer_maemo5.h SOURCES += $$PWD/deviceorientation_maemo5.cpp - FORMS += $$PWD/recopts_maemo5.ui \ + FORMS = $$PWD/recopts_maemo5.ui \ $$PWD/proxysettings_maemo5.ui +} else:linux-g++-maemo { + QT += dbus + SOURCES += $$PWD/deviceorientation_harmattan.cpp + FORMS = $$PWD/recopts.ui \ + $$PWD/proxysettings.ui } else { SOURCES += $$PWD/deviceorientation.cpp - FORMS += $$PWD/recopts.ui \ - $$PWD/proxysettings.ui + FORMS = $$PWD/recopts.ui \ + $$PWD/proxysettings.ui } diff --git a/share/qtcreator/qml/qmlobserver/qmlobserver.pro b/share/qtcreator/qml/qmlobserver/qmlobserver.pro index 379ca5fb040..5e09ed18751 100644 --- a/share/qtcreator/qml/qmlobserver/qmlobserver.pro +++ b/share/qtcreator/qml/qmlobserver/qmlobserver.pro @@ -1,5 +1,7 @@ TEMPLATE = app +CONFIG += qt uic + ### FIXME: only debug plugins are now supported. CONFIG -= release CONFIG += debug @@ -15,6 +17,44 @@ exists($$PWD/qmljsdebugger/qmljsdebugger-lib.pri) { include($$PWD/../qmljsdebugger/qmljsdebugger-lib.pri) } +#INCLUDEPATH += ../../include/QtDeclarative +#INCLUDEPATH += ../../src/declarative/util +#INCLUDEPATH += ../../src/declarative/graphicsitems + +target.path = $$[QT_INSTALL_BINS] +INSTALLS += target + +wince* { + QT += xml + + contains(QT_CONFIG, scripttools) { + QT += scripttools + } + contains(QT_CONFIG, phonon) { + QT += phonon + } + contains(QT_CONFIG, xmlpatterns) { + QT += xmlpatterns + } + contains(QT_CONFIG, webkit) { + QT += webkit + } +} +maemo5 { + QT += maemo5 +} +symbian { + TARGET.UID3 = 0x20021317 + include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) + TARGET.EPOCHEAPSIZE = 0x20000 0x4000000 + TARGET.CAPABILITY = NetworkServices ReadUserData + !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) { + LIBS += -lsensrvclient -lsensrvutil + } + contains(QT_CONFIG, s60): { + LIBS += -lavkon -lcone + } +} mac { QMAKE_INFO_PLIST=Info_mac.plist TARGET=QMLObserver @@ -22,4 +62,3 @@ mac { } else { TARGET=qmlobserver } - diff --git a/share/qtcreator/qml/qmlobserver/qmlruntime.cpp b/share/qtcreator/qml/qmlobserver/qmlruntime.cpp index 03276350aea..339ec38a43b 100644 --- a/share/qtcreator/qml/qmlobserver/qmlruntime.cpp +++ b/share/qtcreator/qml/qmlobserver/qmlruntime.cpp @@ -54,9 +54,6 @@ # include "ui_recopts.h" #endif -#include <qdeclarativeviewobserver.h> -#include <qdeclarativeobserverservice.h> - #include "qmlruntime.h" #include <qdeclarativecontext.h> #include <qdeclarativeengine.h> @@ -67,6 +64,9 @@ #include <private/qabstractanimation_p.h> #endif +#include <qdeclarativeviewobserver.h> +#include <qdeclarativeobserverservice.h> + #include <QSettings> #include <QXmlStreamReader> #include <QBuffer> @@ -90,28 +90,74 @@ #include <QMenu> #include <QAction> #include <QFileDialog> +#include <QInputDialog> #include <QTimer> #include <QGraphicsObject> #include <QNetworkProxyFactory> #include <QKeyEvent> -#include <QToolBar> #include <QMutex> #include <QMutexLocker> #include "proxysettings.h" #include "deviceorientation.h" -#include <QInputDialog> #ifdef GL_SUPPORTED #include <QGLWidget> #endif -#include <qt_private/qdeclarativedebughelper_p.h> +#if defined(Q_WS_S60) +#include <aknappui.h> // For locking app orientation +#endif #include <qdeclarativetester.h> + +#include <qt_private/qdeclarativedebughelper_p.h> #include "jsdebuggeragent.h" QT_BEGIN_NAMESPACE +class DragAndDropView : public QDeclarativeView +{ + Q_OBJECT +public: + DragAndDropView(QDeclarativeViewer *parent = 0) + : QDeclarativeView(parent) + { + setAcceptDrops(true); + } + + void dragEnterEvent(QDragEnterEvent *event) + { + const QMimeData *mimeData = event->mimeData(); + if (mimeData->hasUrls()) + event->acceptProposedAction(); + } + + void dragMoveEvent(QDragMoveEvent *event) + { + event->acceptProposedAction(); + } + + void dragLeaveEvent(QDragLeaveEvent *event) + { + event->accept(); + } + + void dropEvent(QDropEvent *event) + { + const QMimeData *mimeData = event->mimeData(); + if (!mimeData->hasUrls()) + return; + const QList<QUrl> urlList = mimeData->urls(); + foreach (const QUrl &url, urlList) { + if (url.scheme() == QLatin1String("file")) { + static_cast<QDeclarativeViewer *>(parent())->open(url.toLocalFile()); + event->accept(); + return; + } + } + } +}; + class Runtime : public QObject { Q_OBJECT @@ -166,38 +212,38 @@ public: QWidget *createWidget(QWidget *parent) { - QMaemo5ValueButton *button = new QMaemo5ValueButton(m_text, parent); - button->setValueLayout(QMaemo5ValueButton::ValueUnderTextCentered); + QMaemo5ValueButton *button = new QMaemo5ValueButton(m_text, parent); + button->setValueLayout(QMaemo5ValueButton::ValueUnderTextCentered); QMaemo5ListPickSelector *pick = new QMaemo5ListPickSelector(button); - button->setPickSelector(pick); - if (m_actions) { - QStringList sl; - int curIdx = -1, idx = 0; - foreach (QAction *a, m_actions->actions()) { - sl << a->text(); - if (a->isChecked()) - curIdx = idx; - idx++; + button->setPickSelector(pick); + if (m_actions) { + QStringList sl; + int curIdx = -1, idx = 0; + foreach (QAction *a, m_actions->actions()) { + sl << a->text(); + if (a->isChecked()) + curIdx = idx; + idx++; } - pick->setModel(new QStringListModel(sl)); - pick->setCurrentIndex(curIdx); - } else { - button->setEnabled(false); - } - connect(pick, SIGNAL(selected(QString)), this, SLOT(emitTriggered())); - return button; + pick->setModel(new QStringListModel(sl)); + pick->setCurrentIndex(curIdx); + } else { + button->setEnabled(false); + } + connect(pick, SIGNAL(selected(QString)), this, SLOT(emitTriggered())); + return button; } private slots: void emitTriggered() { - QMaemo5ListPickSelector *pick = qobject_cast<QMaemo5ListPickSelector *>(sender()); - if (!pick) - return; - int idx = pick->currentIndex(); + QMaemo5ListPickSelector *pick = qobject_cast<QMaemo5ListPickSelector *>(sender()); + if (!pick) + return; + int idx = pick->currentIndex(); - if (m_actions && idx >= 0 && idx < m_actions->actions().count()) - m_actions->actions().at(idx)->trigger(); + if (m_actions && idx >= 0 && idx < m_actions->actions().count()) + m_actions->actions().at(idx)->trigger(); } private: @@ -441,65 +487,82 @@ private: mutable QMutex mutex; }; -class NetworkAccessManagerFactory : public QDeclarativeNetworkAccessManagerFactory +class SystemProxyFactory : public QNetworkProxyFactory { public: - NetworkAccessManagerFactory() : cacheSize(0) {} - ~NetworkAccessManagerFactory() {} - - QNetworkAccessManager *create(QObject *parent); + SystemProxyFactory() : proxyDirty(true), httpProxyInUse(false) { + } - void setupProxy(QNetworkAccessManager *nam) + virtual QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery &query) { - class SystemProxyFactory : public QNetworkProxyFactory - { - public: - virtual QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery &query) - { - QString protocolTag = query.protocolTag(); - if (httpProxyInUse && (protocolTag == "http" || protocolTag == "https")) { - QList<QNetworkProxy> ret; - ret << httpProxy; - return ret; - } + if (proxyDirty) + setupProxy(); + QString protocolTag = query.protocolTag(); + if (httpProxyInUse && (protocolTag == "http" || protocolTag == "https")) { + QList<QNetworkProxy> ret; + ret << httpProxy; + return ret; + } #ifdef Q_OS_WIN - // systemProxyForQuery can take insanely long on Windows (QTBUG-10106) - return QNetworkProxyFactory::proxyForQuery(query); + // systemProxyForQuery can take insanely long on Windows (QTBUG-10106) + return QNetworkProxyFactory::proxyForQuery(query); #else - return QNetworkProxyFactory::systemProxyForQuery(query); + return QNetworkProxyFactory::systemProxyForQuery(query); #endif - } - void setHttpProxy (QNetworkProxy proxy) - { - httpProxy = proxy; - httpProxyInUse = true; - } - void unsetHttpProxy () - { - httpProxyInUse = false; - } - private: - bool httpProxyInUse; - QNetworkProxy httpProxy; - }; - - SystemProxyFactory *proxyFactory = new SystemProxyFactory; - if (ProxySettings::httpProxyInUse()) - proxyFactory->setHttpProxy(ProxySettings::httpProxy()); - else - proxyFactory->unsetHttpProxy(); - nam->setProxyFactory(proxyFactory); } + void setupProxy() { + // Don't bother locking because we know that the proxy only + // changes in response to the settings dialog and that + // the view will be reloaded. + proxyDirty = false; + httpProxyInUse = ProxySettings::httpProxyInUse(); + if (httpProxyInUse) + httpProxy = ProxySettings::httpProxy(); + } + + void proxyChanged() { + proxyDirty = true; + } + +private: + volatile bool proxyDirty; + bool httpProxyInUse; + QNetworkProxy httpProxy; +}; + +class NetworkAccessManagerFactory : public QObject, public QDeclarativeNetworkAccessManagerFactory +{ + Q_OBJECT +public: + NetworkAccessManagerFactory() : cacheSize(0) {} + ~NetworkAccessManagerFactory() {} + + QNetworkAccessManager *create(QObject *parent); + void setCacheSize(int size) { if (size != cacheSize) { cacheSize = size; } } + void proxyChanged() { + foreach (QNetworkAccessManager *nam, namList) { + static_cast<SystemProxyFactory*>(nam->proxyFactory())->proxyChanged(); + } + } + static PersistentCookieJar *cookieJar; + +private slots: + void managerDestroyed(QObject *obj) { + namList.removeOne(static_cast<QNetworkAccessManager*>(obj)); + } + +private: QMutex mutex; int cacheSize; + QList<QNetworkAccessManager*> namList; }; PersistentCookieJar *NetworkAccessManagerFactory::cookieJar = 0; @@ -520,7 +583,7 @@ QNetworkAccessManager *NetworkAccessManagerFactory::create(QObject *parent) } manager->setCookieJar(cookieJar); cookieJar->setParent(0); - setupProxy(manager); + manager->setProxyFactory(new SystemProxyFactory); if (cacheSize > 0) { QNetworkDiskCache *cache = new QNetworkDiskCache; cache->setCacheDirectory(QDir::tempPath()+QLatin1String("/qml-viewer-network-cache")); @@ -529,6 +592,8 @@ QNetworkAccessManager *NetworkAccessManagerFactory::create(QObject *parent) } else { manager->setCache(0); } + connect(manager, SIGNAL(destroyed(QObject*)), this, SLOT(managerDestroyed(QObject*))); + namList.append(manager); qDebug() << "created new network access manager for" << parent; return manager; } @@ -548,13 +613,13 @@ QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) , loggerWindow(new LoggerWidget(this)) , frame_stream(0) + , rotateAction(0) , orientation(0) , showWarningsWindow(0) , designModeBehaviorAction(0) , m_scriptOptions(0) , tester(0) , useQmlFileBrowser(true) - , m_centralWidget(0) , translator(0) { QDeclarativeViewer::registerTypes(); @@ -589,28 +654,18 @@ QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags) recdlg->warning->hide(); } - canvas = new QDeclarativeView(this); + canvas = new DragAndDropView(this); observer = new QmlJSDebugger::QDeclarativeViewObserver(canvas, this); new QmlJSDebugger::JSDebuggerAgent(canvas->engine()); - m_centralWidget = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(m_centralWidget); - layout->setMargin(0); - layout->setSpacing(0); - - - layout->addWidget(canvas); - m_centralWidget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - canvas->setAttribute(Qt::WA_OpaquePaintEvent); canvas->setAttribute(Qt::WA_NoSystemBackground); canvas->setFocus(); - QObject::connect(observer, SIGNAL(reloadRequested()), this, SLOT(reload())); QObject::connect(canvas, SIGNAL(sceneResized(QSize)), this, SLOT(sceneResized(QSize))); QObject::connect(canvas, SIGNAL(statusChanged(QDeclarativeView::Status)), this, SLOT(statusChanged())); - QObject::connect(canvas->engine(), SIGNAL(quit()), QCoreApplication::instance (), SLOT(quit())); + QObject::connect(canvas->engine(), SIGNAL(quit()), this, SLOT(close())); QObject::connect(warningsWidget(), SIGNAL(opened()), this, SLOT(warningsWidgetOpened())); QObject::connect(warningsWidget(), SIGNAL(closed()), this, SLOT(warningsWidgetClosed())); @@ -622,7 +677,7 @@ QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags) setMenuBar(0); } - setCentralWidget(m_centralWidget); + setCentralWidget(canvas); namFactory = new NetworkAccessManagerFactory; canvas->engine()->setNetworkAccessManagerFactory(namFactory); @@ -655,12 +710,14 @@ void QDeclarativeViewer::setDesignModeBehavior(bool value) void QDeclarativeViewer::enableExperimentalGestures() { +#ifndef QT_NO_GESTURES canvas->viewport()->grabGesture(Qt::TapGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); canvas->viewport()->grabGesture(Qt::TapAndHoldGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); canvas->viewport()->grabGesture(Qt::PanGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); canvas->viewport()->grabGesture(Qt::PinchGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); canvas->viewport()->grabGesture(Qt::SwipeGesture,Qt::DontStartGestureOnChildren|Qt::ReceivePartialGestures|Qt::IgnoredGesturesPropagateToParent); canvas->viewport()->setAttribute(Qt::WA_AcceptTouchEvents); +#endif } QDeclarativeView *QDeclarativeViewer::view() const @@ -676,11 +733,14 @@ LoggerWidget *QDeclarativeViewer::warningsWidget() const void QDeclarativeViewer::createMenu() { QAction *openAction = new QAction(tr("&Open..."), this); - openAction->setShortcut(QKeySequence("Ctrl+O")); + openAction->setShortcuts(QKeySequence::Open); connect(openAction, SIGNAL(triggered()), this, SLOT(openFile())); + QAction *openUrlAction = new QAction(tr("Open &URL..."), this); + connect(openUrlAction, SIGNAL(triggered()), this, SLOT(openUrl())); + QAction *reloadAction = new QAction(tr("&Reload"), this); - reloadAction->setShortcut(QKeySequence("Ctrl+R")); + reloadAction->setShortcuts(QKeySequence::Refresh); connect(reloadAction, SIGNAL(triggered()), this, SLOT(reload())); QAction *snapshotAction = new QAction(tr("&Take Snapshot"), this); @@ -690,9 +750,6 @@ void QDeclarativeViewer::createMenu() recordAction = new QAction(tr("Start Recording &Video"), this); recordAction->setShortcut(QKeySequence("F9")); connect(recordAction, SIGNAL(triggered()), this, SLOT(toggleRecordingWithSelection())); -#ifdef NO_PRIVATE_HEADERS - recordAction->setEnabled(false); -#endif QAction *recordOptions = new QAction(tr("Video &Options..."), this); connect(recordOptions, SIGNAL(triggered()), this, SLOT(chooseRecordingOptions())); @@ -715,6 +772,7 @@ void QDeclarativeViewer::createMenu() speedAction = playSpeedMenu->addAction(tr("0.25x"), this, SLOT(changeAnimationSpeed())); speedAction->setCheckable(true); + speedAction->setCheckable(true); speedAction->setData(4.0f); playSpeedMenuActions->addAction(speedAction); @@ -753,7 +811,8 @@ void QDeclarativeViewer::createMenu() designModeBehaviorAction->setEnabled(QmlJSDebugger::QDeclarativeObserverService::hasDebuggingClient()); connect(designModeBehaviorAction, SIGNAL(triggered(bool)), this, SLOT(setDesignModeBehavior(bool))); connect(observer, SIGNAL(designModeBehaviorChanged(bool)), designModeBehaviorAction, SLOT(setChecked(bool))); - connect(QmlJSDebugger::QDeclarativeObserverService::instance(), SIGNAL(debuggingClientChanged(bool)), designModeBehaviorAction, SLOT(setEnabled(bool))); + connect(QmlJSDebugger::QDeclarativeObserverService::instance(), SIGNAL(debuggingClientChanged(bool)), + designModeBehaviorAction, SLOT(setEnabled(bool))); appOnTopAction = new QAction(tr("Keep Window on Top"), this); appOnTopAction->setCheckable(true); @@ -769,36 +828,49 @@ void QDeclarativeViewer::createMenu() fullscreenAction->setCheckable(true); connect(fullscreenAction, SIGNAL(triggered()), this, SLOT(toggleFullScreen())); - QAction *rotateOrientation = new QAction(tr("Rotate orientation"), this); - rotateOrientation->setShortcut(QKeySequence("Ctrl+T")); - connect(rotateOrientation, SIGNAL(triggered()), this, SLOT(rotateOrientation())); + rotateAction = new QAction(tr("Rotate orientation"), this); + rotateAction->setShortcut(QKeySequence("Ctrl+T")); + connect(rotateAction, SIGNAL(triggered()), this, SLOT(rotateOrientation())); orientation = new QActionGroup(this); orientation->setExclusive(true); connect(orientation, SIGNAL(triggered(QAction*)), this, SLOT(changeOrientation(QAction*))); +#if defined(Q_OS_SYMBIAN) + QAction *autoOrientationAction = new QAction(tr("Auto-orientation"), this); + autoOrientationAction->setCheckable(true); +#endif QAction *portraitAction = new QAction(tr("Portrait"), this); portraitAction->setCheckable(true); QAction *landscapeAction = new QAction(tr("Landscape"), this); landscapeAction->setCheckable(true); +#if !defined(Q_OS_SYMBIAN) QAction *portraitInvAction = new QAction(tr("Portrait (inverted)"), this); portraitInvAction->setCheckable(true); QAction *landscapeInvAction = new QAction(tr("Landscape (inverted)"), this); landscapeInvAction->setCheckable(true); +#endif QAction *aboutAction = new QAction(tr("&About Qt..."), this); + aboutAction->setMenuRole(QAction::AboutQtRole); connect(aboutAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); + QAction *closeAction = new QAction(tr("&Close"), this); + closeAction->setShortcuts(QKeySequence::Close); + connect(closeAction, SIGNAL(triggered()), this, SLOT(close())); + QAction *quitAction = new QAction(tr("&Quit"), this); - quitAction->setShortcut(QKeySequence("Ctrl+Q")); + quitAction->setMenuRole(QAction::QuitRole); + quitAction->setShortcuts(QKeySequence::Quit); connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); QMenuBar *menu = menuBar(); if (!menu) - return; + return; #if defined(Q_WS_MAEMO_5) menu->addAction(openAction); + menu->addAction(openUrlAction); menu->addAction(reloadAction); menu->addAction(snapshotAction); @@ -819,38 +891,45 @@ void QDeclarativeViewer::createMenu() QMenu *fileMenu = menu->addMenu(tr("&File")); fileMenu->addAction(openAction); + fileMenu->addAction(openUrlAction); fileMenu->addAction(reloadAction); fileMenu->addSeparator(); + fileMenu->addAction(closeAction); +#if !defined(Q_OS_SYMBIAN) fileMenu->addAction(quitAction); -#if !defined(Q_OS_SYMBIAN) QMenu *recordMenu = menu->addMenu(tr("&Recording")); recordMenu->addAction(snapshotAction); recordMenu->addAction(recordAction); QMenu *debugMenu = menu->addMenu(tr("&Debugging")); - debugMenu->addAction(playSpeedAction); + debugMenu->addMenu(playSpeedMenu); debugMenu->addAction(showWarningsWindow); debugMenu->addAction(designModeBehaviorAction); debugMenu->addAction(appOnTopAction); #endif // ! Q_OS_SYMBIAN - QMenu *settingsMenu = menu->addMenu(tr("S&ettings")); + QMenu *settingsMenu = menu->addMenu(tr("&Settings")); settingsMenu->addAction(proxyAction); -#if !defined(Q_OS_SYMBIAN) +#if defined(Q_OS_SYMBIAN) + settingsMenu->addAction(fullscreenAction); +#else settingsMenu->addAction(recordOptions); settingsMenu->addMenu(loggerWindow->preferencesMenu()); -#else // ! Q_OS_SYMBIAN - settingsMenu->addAction(fullscreenAction); -#endif // Q_OS_SYMBIAN - settingsMenu->addAction(rotateOrientation); +#endif // !Q_OS_SYMBIAN + settingsMenu->addAction(rotateAction); QMenu *propertiesMenu = settingsMenu->addMenu(tr("Properties")); +#if defined(Q_OS_SYMBIAN) + orientation->addAction(autoOrientationAction); +#endif orientation->addAction(portraitAction); orientation->addAction(landscapeAction); +#if !defined(Q_OS_SYMBIAN) orientation->addAction(portraitInvAction); orientation->addAction(landscapeInvAction); +#endif propertiesMenu->addActions(orientation->actions()); QMenu *helpMenu = menu->addMenu(tr("&Help")); @@ -868,11 +947,29 @@ void QDeclarativeViewer::showProxySettings() void QDeclarativeViewer::proxySettingsChanged() { + namFactory->proxyChanged(); reload (); } void QDeclarativeViewer::rotateOrientation() { +#if defined(Q_WS_S60) + CAknAppUi *appUi = static_cast<CAknAppUi *>(CEikonEnv::Static()->AppUi()); + if (appUi) { + CAknAppUi::TAppUiOrientation oldOrientation = appUi->Orientation(); + QString newOrientation; + if (oldOrientation == CAknAppUi::EAppUiOrientationPortrait) { + newOrientation = QLatin1String("Landscape"); + } else { + newOrientation = QLatin1String("Portrait"); + } + foreach (QAction *action, orientation->actions()) { + if (action->text() == newOrientation) { + changeOrientation(action); + } + } + } +#else QAction *current = orientation->checkedAction(); QList<QAction *> actions = orientation->actions(); int index = actions.indexOf(current); @@ -881,6 +978,7 @@ void QDeclarativeViewer::rotateOrientation() QAction *newOrientation = actions[(index + 1) % actions.count()]; changeOrientation(newOrientation); +#endif } void QDeclarativeViewer::toggleFullScreen() @@ -978,41 +1076,41 @@ void QDeclarativeViewer::toggleRecording() void QDeclarativeViewer::setAnimationsPaused(bool enable) { - if (enable) { - setAnimationSpeed(0.0); - } else { - setAnimationSpeed(animationSpeed); - } + if (enable) { + setAnimationSpeed(0.0); + } else { + setAnimationSpeed(animationSpeed); + } } void QDeclarativeViewer::pauseAnimations() { - pauseAnimationsAction->setChecked(true); - setAnimationsPaused(true); + pauseAnimationsAction->setChecked(true); + setAnimationsPaused(true); } void QDeclarativeViewer::stepAnimations() { - setAnimationSpeed(1.0); - QTimer::singleShot(m_stepSize, this, SLOT(pauseAnimations())); -} + setAnimationSpeed(1.0); + QTimer::singleShot(m_stepSize, this, SLOT(pauseAnimations())); + } void QDeclarativeViewer::setAnimationStep() { - bool ok; - int stepSize = QInputDialog::getInt(this, tr("Set animation step duration"), - tr("Step duration (ms):"), m_stepSize, 20, 10000, 1, &ok); - if (ok) m_stepSize = stepSize; + bool ok; + int stepSize = QInputDialog::getInt(this, tr("Set animation step duration"), + tr("Step duration (ms):"), m_stepSize, 20, 10000, 1, &ok); + if (ok) m_stepSize = stepSize; } void QDeclarativeViewer::changeAnimationSpeed() { - QAction *action = qobject_cast<QAction*>(sender()); - if (action) { - float f = action->data().toFloat(); - animationSpeed = f; - if (!pauseAnimationsAction->isChecked()) - setAnimationSpeed(animationSpeed); - } + QAction *action = qobject_cast<QAction*>(sender()); + if (action) { + float f = action->data().toFloat(); + animationSpeed = f; + if (!pauseAnimationsAction->isChecked()) + setAnimationSpeed(animationSpeed); + } } void QDeclarativeViewer::addLibraryPath(const QString& lib) @@ -1027,15 +1125,14 @@ void QDeclarativeViewer::addPluginPath(const QString& plugin) void QDeclarativeViewer::reload() { - observer->setDesignModeBehavior(false); - open(currentFileOrUrl); + launch(currentFileOrUrl); } void QDeclarativeViewer::openFile() { QString cur = canvas->source().toLocalFile(); if (useQmlFileBrowser) { - open("qrc:/content/Browser.qml"); + open("qrc:/browser/Browser.qml"); } else { QString fileName = QFileDialog::getOpenFileName(this, tr("Open QML file"), cur, tr("QML Files (*.qml)")); if (!fileName.isEmpty()) { @@ -1045,6 +1142,14 @@ void QDeclarativeViewer::openFile() } } +void QDeclarativeViewer::openUrl() +{ + QString cur = canvas->source().toLocalFile(); + QString url= QInputDialog::getText(this, tr("Open QML file"), tr("URL of main QML file:"), QLineEdit::Normal, cur); + if (!url.isEmpty()) + open(url); +} + void QDeclarativeViewer::statusChanged() { if (canvas->status() == QDeclarativeView::Error && tester) @@ -1077,11 +1182,7 @@ void QDeclarativeViewer::loadDummyDataFiles(const QString& directory) QStringList list = dir.entryList(); for (int i = 0; i < list.size(); ++i) { QString qml = list.at(i); - QFile f(dir.filePath(qml)); - f.open(QIODevice::ReadOnly); - QByteArray data = f.readAll(); - QDeclarativeComponent comp(canvas->engine()); - comp.setData(data, QUrl()); + QDeclarativeComponent comp(canvas->engine(), dir.filePath(qml)); QObject *dummyData = comp.create(); if(comp.isError()) { @@ -1220,8 +1321,10 @@ bool QDeclarativeViewer::event(QEvent *event) { if (event->type() == QEvent::WindowActivate) { Runtime::instance()->setActiveWindow(true); + DeviceOrientation::instance()->resumeListening(); } else if (event->type() == QEvent::WindowDeactivate) { Runtime::instance()->setActiveWindow(false); + DeviceOrientation::instance()->pauseListening(); } return QWidget::event(event); } @@ -1397,6 +1500,8 @@ void QDeclarativeViewer::appAboutToQuit() // avoid crashes if messages are received after app has closed delete loggerWindow; loggerWindow = 0; + delete tester; + tester = 0; } void QDeclarativeViewer::autoStartRecording() @@ -1431,9 +1536,24 @@ void QDeclarativeViewer::changeOrientation(QAction *action) { if (!action) return; - action->setChecked(true); - QString o = action->text(); + action->setChecked(true); +#if defined(Q_WS_S60) + CAknAppUi *appUi = static_cast<CAknAppUi *>(CEikonEnv::Static()->AppUi()); + if (appUi) { + CAknAppUi::TAppUiOrientation orientation = appUi->Orientation(); + if (o == QLatin1String("Auto-orientation")) { + appUi->SetOrientationL(CAknAppUi::EAppUiOrientationAutomatic); + rotateAction->setVisible(false); + } else if (o == QLatin1String("Portrait")) { + appUi->SetOrientationL(CAknAppUi::EAppUiOrientationPortrait); + rotateAction->setVisible(true); + } else if (o == QLatin1String("Landscape")) { + appUi->SetOrientationL(CAknAppUi::EAppUiOrientationLandscape); + rotateAction->setVisible(true); + } + } +#else if (o == QLatin1String("Portrait")) DeviceOrientation::instance()->setOrientation(DeviceOrientation::Portrait); else if (o == QLatin1String("Landscape")) @@ -1442,6 +1562,7 @@ void QDeclarativeViewer::changeOrientation(QAction *action) DeviceOrientation::instance()->setOrientation(DeviceOrientation::PortraitInverted); else if (o == QLatin1String("Landscape (inverted)")) DeviceOrientation::instance()->setOrientation(DeviceOrientation::LandscapeInverted); +#endif } void QDeclarativeViewer::orientationChanged() @@ -1517,7 +1638,6 @@ void QDeclarativeViewer::updateSizeHints(bool initial) QSize newWindowSize = initial ? initialSize : canvas->sizeHint(); //qWarning() << "USH:" << (initial ? "INIT:" : "V2R:") << "setting fixed size " << newWindowSize; if (!isFullScreen() && !isMaximized()) { - m_centralWidget->setFixedSize(newWindowSize.width(), newWindowSize.height() + 32); canvas->setFixedSize(newWindowSize); resize(1, 1); layout()->setSizeConstraint(QLayout::SetFixedSize); @@ -1527,18 +1647,14 @@ void QDeclarativeViewer::updateSizeHints(bool initial) //qWarning() << "USH: R2V: setting free size "; layout()->setSizeConstraint(QLayout::SetNoConstraint); layout()->activate(); - + setMinimumSize(minimumSizeHint()); setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)); canvas->setMinimumSize(QSize(0,0)); canvas->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)); - m_centralWidget->setMinimumSize(QSize(0,0)); - m_centralWidget->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)); - isRecursive = false; } - void QDeclarativeViewer::registerTypes() { static bool registered = false; @@ -1546,6 +1662,7 @@ void QDeclarativeViewer::registerTypes() if (!registered) { // registering only for exposing the DeviceOrientation::Orientation enum qmlRegisterUncreatableType<DeviceOrientation>("Qt",4,7,"Orientation",""); + qmlRegisterUncreatableType<DeviceOrientation>("QtQuick",1,0,"Orientation",""); registered = true; } } diff --git a/share/qtcreator/qml/qmlobserver/qmlruntime.h b/share/qtcreator/qml/qmlobserver/qmlruntime.h index b09d1b879b8..7ef1bd1479f 100644 --- a/share/qtcreator/qml/qmlobserver/qmlruntime.h +++ b/share/qtcreator/qml/qmlobserver/qmlruntime.h @@ -67,7 +67,6 @@ class NetworkAccessManagerFactory; class QTranslator; class QActionGroup; class QMenuBar; -class QSplitter; class QDeclarativeViewer : public QMainWindow @@ -75,7 +74,7 @@ class QDeclarativeViewer Q_OBJECT public: - explicit QDeclarativeViewer(QWidget *parent = 0, Qt::WindowFlags flags = 0); + QDeclarativeViewer(QWidget *parent = 0, Qt::WindowFlags flags = 0); ~QDeclarativeViewer(); static void registerTypes(); @@ -88,7 +87,8 @@ public: SaveOnExit = 0x00000010, ExitOnComplete = 0x00000020, ExitOnFailure = 0x00000040, - Snapshot = 0x00000080 + Snapshot = 0x00000080, + TestSkipProperty = 0x00000100 }; Q_DECLARE_FLAGS(ScriptOptions, ScriptOption) void setScript(const QString &s) { m_script = s; } @@ -111,6 +111,7 @@ public: QDeclarativeView *view() const; LoggerWidget *warningsWidget() const; + QString currentFile() const { return currentFileOrUrl; } void enableExperimentalGestures(); @@ -119,6 +120,7 @@ public slots: void sceneResized(QSize size); bool open(const QString&); void openFile(); + void openUrl(); void reload(); void takeSnapShot(); void toggleRecording(); @@ -163,7 +165,6 @@ private: QString getVideoFileName(); LoggerWidget *loggerWindow; - QDeclarativeView *canvas; QmlJSDebugger::QDeclarativeViewObserver *observer; QSize initialSize; @@ -183,8 +184,6 @@ private: int record_autotime; bool devicemode; QAction *recordAction; - QString currentSkin; - bool scaleSkin; RecordingDialog *recdlg; void senseImageMagick(); @@ -199,6 +198,7 @@ private: QAction *animationStepAction; QAction *animationSetStepAction; + QAction *rotateAction; QActionGroup *orientation; QAction *showWarningsWindow; QAction *designModeBehaviorAction; @@ -214,8 +214,6 @@ private: bool useQmlFileBrowser; - QWidget *m_centralWidget; - QTranslator *translator; void loadTranslationFile(const QString& directory); diff --git a/share/qtcreator/qml/qmlobserver/qmlruntime.qrc b/share/qtcreator/qml/qmlobserver/qmlruntime.qrc deleted file mode 100644 index 4136eafa526..00000000000 --- a/share/qtcreator/qml/qmlobserver/qmlruntime.qrc +++ /dev/null @@ -1,9 +0,0 @@ -<RCC> - <qresource prefix="/"> - <file>content/Browser.qml</file> - <file>content/images/up.png</file> - <file>content/images/folder.png</file> - <file>content/images/titlebar.sci</file> - <file>content/images/titlebar.png</file> - </qresource> -</RCC> diff --git a/share/qtcreator/qml/qmlobserver/startup/Logo.qml b/share/qtcreator/qml/qmlobserver/startup/Logo.qml new file mode 100644 index 00000000000..aa5648f5ed5 --- /dev/null +++ b/share/qtcreator/qml/qmlobserver/startup/Logo.qml @@ -0,0 +1,179 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 + +Rectangle { + id: myApp + width: 411 + height: 411 + color: "transparent" + property alias logoState : myApp.state + signal animationFinished + + Item { + id: sketchBlueHolder + width: sketchLogo.width + height: sketchLogo.height + Image { + id: image1 + x: -44 + y: -45 + smooth: true + source: "shadow.png" + } + Item { + clip: true + width: sketchLogo.width + height: sketchLogo.height + Image { + id: sketchLogo + smooth: true + source: "qt-sketch.jpg" + } + Image { + id: blueLogo + y: -420 + smooth: true + source: "qt-blue.jpg" + } + } + } + + states: [ + State { + name: "showBlueprint" + PropertyChanges { + target: blueLogo + y: 0 + } + PropertyChanges { + target: sketchLogo + opacity: 0 + } + }, + State { + extend: "showBlueprint" + name: "finale" + PropertyChanges { + target: fullLogo + opacity: 1 + } + PropertyChanges { + target: backLogo + opacity: 1 + scale: 1 + } + PropertyChanges { + target: frontLogo + opacity: 1 + scale: 1 + } + PropertyChanges { + target: qtText + opacity: 1 + scale: 1 + } + PropertyChanges { + target: sketchBlueHolder + opacity: 0 + scale: 1.4 + } + } + ] + + transitions: [ + Transition { + to: "showBlueprint" + SequentialAnimation { + NumberAnimation { property: "y"; duration: 600; easing.type: "OutBounce" } + PropertyAction { target: sketchLogo; property: "opacity" } + } + }, + Transition { + to: "finale" + PropertyAction { target: fullLogo; property: "opacity" } + SequentialAnimation { + NumberAnimation { target: backLogo; properties: "scale, opacity"; duration: 300 } + NumberAnimation { target: frontLogo; properties: "scale, opacity"; duration: 300 } + ParallelAnimation { + NumberAnimation { target: qtText; properties: "opacity, scale"; duration: 400; easing.type: "OutQuad" } + NumberAnimation { target: sketchBlueHolder; property: "opacity"; duration: 300; easing.type: "OutQuad" } + NumberAnimation { target: sketchBlueHolder; property: "scale"; duration: 320; easing.type: "OutQuad" } + } + PauseAnimation { duration: 1000 } + ScriptAction { script: myApp.animationFinished() } + } + } + ] + + Item { + id: fullLogo + opacity: 0 + Image { + id: backLogo + x: -16 + y: -41 + opacity: 0 + scale: 0.7 + smooth: true + source: "qt-back.png" + } + Image { + id: frontLogo + x: -17 + y: -41 + opacity: 0 + scale: 1.2 + smooth: true + source: "qt-front.png" + } + Image { + id: qtText + x: -10 + y: -41 + opacity: 0 + scale: 1.2 + smooth: true + source: "qt-text.png" + } + } +} diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-back.png b/share/qtcreator/qml/qmlobserver/startup/qt-back.png new file mode 100644 index 0000000000000000000000000000000000000000..077215f882f67b610bffdda72029ee8c2d7dd485 GIT binary patch literal 3549 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 Mj-hs$rhVw&00(;n>i_@% literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-blue.jpg b/share/qtcreator/qml/qmlobserver/startup/qt-blue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2048964836a6ef5056b6caaef326212d9b65ecc GIT binary patch literal 20900 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 ADF6Tf literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-front.png b/share/qtcreator/qml/qmlobserver/startup/qt-front.png new file mode 100644 index 0000000000000000000000000000000000000000..dbfb43e374bb55847bb209fa60db200d197f3bef GIT binary patch literal 3318 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 Bie&%* literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-sketch.jpg b/share/qtcreator/qml/qmlobserver/startup/qt-sketch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ede6f079b534e6ea55c3fbbb1c4f01721054649 GIT binary patch literal 17048 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 MezF7YK@flc+2^Q6cmMzZ literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlobserver/startup/qt-text.png b/share/qtcreator/qml/qmlobserver/startup/qt-text.png new file mode 100644 index 0000000000000000000000000000000000000000..d44995c9b34ed3a9ff263becd861268e8a1b9441 GIT binary patch literal 14565 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 Q#RIyx3~rWQ|2yoz0ruY#x&QzG literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlobserver/startup/quick-blur.png b/share/qtcreator/qml/qmlobserver/startup/quick-blur.png new file mode 100644 index 0000000000000000000000000000000000000000..29ec2433874bc2da07776332cdca881e7a9c73c3 GIT binary patch literal 2826 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 PX9R$@#30HpT)+DtH|&3( literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlobserver/startup/quick-regular.png b/share/qtcreator/qml/qmlobserver/startup/quick-regular.png new file mode 100644 index 0000000000000000000000000000000000000000..38321cbf19366635ad6f183a43a5ecda30304117 GIT binary patch literal 1399 zcmV--1&I2IP)<h;3K|Lk000e1NJLTq006!K002P*0{{R3ot^_?0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyFi=cXMgRZ*|NsC0|NsC0|NsC0|NsC0 z|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|4y&CKmY&$4|GyaQveYnGelKpcZiv) zyUgA0Mk@80000ESNkl<ZSi`kgy-piJ5MG19*npu+kso-02)Y!Jf;*Z>rcM#lrSuh% zh!iFG4UF;vcBJ(94UQB^N|GmlBt=R?FxdES<J;Z&*}Xjl#Cfap?d~_bGxL2jXCZDq zvUS<r6w@2~Qp&D(rZSn4{X4?XMIds=H&vI3rf)t93cux>I*ev6?})#w@K1eH?P%t2 zD)?ufnM|_fTl?oIF*2=G;=Aja$*GxI8u{5vzS-_w@hAN1m3$LR3V(XkTT}ScBlcDV zKb)>`$m{9h|3@C4Oy;|{j{aUl%F*6x^mrWMcaj#qSJ4?y3{-XgWf@)IXgbA-Ub#^J z9t9u|=j#1q^|s02Uz(i*k!fp@;&f3*yAWc*tUAz}=G*3XWP4UUd{;_w;)bFC3uP;( zp+uh11&+3476t0<>@n`T0Ae?Z2}~(6w6eQlM2gX67MxNvi!{F~xG6gJ0$C2VCtT|3 z5gPxl5MA(STV{=l=RDg~0~hSz%|A1IRT<=0j9<;B3m(m!c%<G|)pI`(GjAhUeYbTW z!f=(~^+|ek<p8!{v*_#~N&Doqp>p8URU;2$MEk*x{|FDgDADVTE=6)m72iH|f>;5k ztB27#!*8G~a^&BT=z>QxRxj~s=*UA4?)8ho&qyqs=F-BZ3u`<=SUTgvs2E-e@k||t z%XFSNqj&Z3>Bu@7SUtr}0ihTU&M0pEjtloD;dg~a7uI-?)eUt_N|KDJ`wtjFxaS7U zRU{9AB@bY==22tdphxA7jpwXTu$*L#2U$Hqo4mRoc#5#b)RD|0)H3DdEQO)~u4HP) zgBaB5thVJAV_M73Nv5P|HP(!1iP?6ej%NxSs50dwQ?4~g--6rbYPs6?)UajNSCA;P zoMcLhRvD#Pbszg$INnzfRD+sfhK1*gH492O2EG=TFD;@i%1OQet;W73v|QCaJp>a< z2F04;3N1K>^TiykgyV7pMcScPSJ+T2C%KZM)mR>C&n$X+T)wn!%R`Oip+ih)+2LU% zI@SF7Y2h~*KC+wTBvaCPwAyfF0Gj`kc!JXLj1ru4qFPj4!1Q(TfjCu1_UuA3hfpjh zbEKq;cKUW)lJ1&P7$o2q5NeHba*4K3`nvuHlIC1pvhc||lZP@%!3J7&n^_>Kj`LMQ zeD@KmLh=w&P7@QDe9$3=5Y166Kh@Gq8=<IA&@mZ1R4Mza`!(Kn*X8e!(qoJ-d(?*v zoI<(gd~7wqa;*0>P2W0pR|CZFlY6u)PLK%&rvpdgXo_@V&1Vxlp`p;|eMu2xg;KB8 zqV%F<gyS69IEdA+!DjZ5LFxN{5xF)t;7~oAbQSqch<o)(x4<~K?=}#bwzS5D{XrmQ z8UAqKMX}5ll#ExJn8WY|!Wv;5XCw;Rmqk$0JS&Ph3!lkVUb-~~zIx=y?b%d1m6qW= z))#u6<1dostc=wdSo(@x4UK+On**%jV^GXC!!NSB62@vwRtM{Y)l)v#dq3$Lmqe`S zqK95Xx5(XX)tKx%DgOlK{?K%6hw5eW$i9gju_takR@|l|<*~*6JB3kon~s!6-4Wfi zN9Yu#v`5?N=~Eu*{DGM~=B)o-(jO`Pftff8o{x_^j(;a72=SYzx`6-y002ovPDHLk FV1jOozfS-F literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlobserver/startup/shadow.png b/share/qtcreator/qml/qmlobserver/startup/shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..44f92fee736f67843f88a74da87c109878d231ee GIT binary patch literal 1592 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8Y9LzwGKOFiyfRtp3YeY$Kep*R+Vo@rCV@iHf zs)A>3VtQ&&YGO)d;mK4RprZ2uJ|V6^`v3p`KyrA1M_*6e2l~XdB*-rq7${84EUawo z9GqO-JiL7T0)j%qViJ;4(lQE)O3G^L8k$-<x<;lJmR8m_PR{OLzW#xs(J=|hDQTIx zMJ44GHO=jvZd+E%GBB{L^K@|xskrs_j$_^vGXaN-T3)hGm@Hl2)o;8hskD023~mo* z-nNeW@zQZ0c6ObO`*G$%`Rfvv3#_r&(L(NB3$P+*@e;@D<u30#1O+Dw{^Pz`R_fyJ z5_0F^PWzY2O2)>@3*WcjyLk7m@~fv`?TVgAC=372dvZ7Q>ebTM&(HsEwkwi3UYPc5 z!^7{l-d??1ymm$4;(K$xoGG05yztq?!z<pKzPP&j_$*89-&eoRdu(C<yt2-y*x^3s z-d(??j2ADCcRT;Mo%!C@`r|)EV@tE8<b8K-zPs)GjzzB{zG_uH``~)++>5~Ut9!m? zzGhs~U6cN0g@3H&z1mH!*MFXqjWzC{?Z$u2`pevl+V0PMm$1M7`|RC?`5MJ3eY4F! z2$#6;HvDx$Msoe);QLjVKL2BVBl(TDnGZ+su*%{H9&W1=M_>qHLob^2up{g-0E!v9 z*n%^vsp=P;wtx~84un0pfWe3}#7MWL9Y>^4)t0|PRo3frU(es$cMg~;U#;7h`GsZg zoVUj&$K4IpUwl7a?icggSG)E;JkMV5eZkyq{_5(xCRH2masS#En;jc|e@~<Qn(wpz z|M~j;d9jS8k?iNV??1P$Gkv~h`}OLzru!G!6{~zXJ1_g{^<T5HubzIrxB6_4owhMM zNUZj(<@2iFe($?_*6mvJo%j0hS395m;hh|}`Spr3GK{tAUsk-Em%X;C@>2Gd6)Q~L zcU}6v`^xTByLK&#oBO5X)VWg*`;@EyOnZM%+pXNC?e4zEZU296{eAlVm)rXTZ<kBo kt*Cd#9((wr?*He1%qq`BvMN~bJq8u(p00i_>zopr0Q;ePmH+?% literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlobserver/startup/startup.qml b/share/qtcreator/qml/qmlobserver/startup/startup.qml new file mode 100644 index 00000000000..35c44c2cf8f --- /dev/null +++ b/share/qtcreator/qml/qmlobserver/startup/startup.qml @@ -0,0 +1,173 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 + +Rectangle { + id: treatsApp + width: 800 + height: 480 + color: "darkgrey" + Component.onCompleted: treatsApp.state = "part1" + signal animationFinished + + Item { + width: 800 + height: 480 + anchors.centerIn: parent + clip: true + + Logo { + id: logo + x: 165 + y: 35 + rotation: -15 + scale: 0.6 + opacity: 0 + onAnimationFinished: treatsApp.animationFinished(); + } + + Item { + id: quickblur + x: 800//325 + y: 344 + Image { + id: blurText + source: "quick-blur.png" + } + Image { + id: quickregular + x: -1 + y: 0 + opacity: 0 + source: "quick-regular.png" + } + Image { + id: star + x: -1 + y: 0 + opacity: 0 + source: "white-star.png" + smooth: true + NumberAnimation on rotation { + from: 0 + to: 360 + loops: NumberAnimation.Infinite + running: true + duration: 2000 + } + } + } + } + + states: [ + State { + name: "part1" + PropertyChanges { + target: logo + scale: 0.8 + opacity: 1 + rotation: 0 + } + PropertyChanges { + target: treatsApp + color: "black" + } + PropertyChanges { + target: logo + y: 10 + } + PropertyChanges { + target: quickblur + x: logo.x + 145 + } + PropertyChanges { + target: blurText + opacity: 0 + } + PropertyChanges { + target: quickregular + opacity: 1 + } + PropertyChanges { + target: star + x: -7 + y: -37 + } + } + ] + + transitions: [ + Transition { + ParallelAnimation { + NumberAnimation { target: logo; property: "opacity"; duration: 500 } + NumberAnimation { target: logo; property: "scale"; duration: 4000; } + NumberAnimation { target: logo; property: "rotation"; duration: 2000; easing.type: "OutBack"} + ColorAnimation { duration: 3000} + SequentialAnimation { + PauseAnimation { duration: 1000 } + ScriptAction { script: logo.logoState = "showBlueprint" } + PauseAnimation { duration: 800 } + ScriptAction { script: logo.logoState = "finale" } + PauseAnimation { duration: 800 } + ParallelAnimation { + NumberAnimation { target: quickblur; property: "x"; duration: 200;} + SequentialAnimation { + PauseAnimation { duration: 200} + ParallelAnimation { + NumberAnimation { target: blurText; property: "opacity"; duration: 300;} + NumberAnimation { target: quickregular; property: "opacity"; duration: 300;} + } + NumberAnimation { target: star; property: "opacity"; from: 0; to: 1; duration: 500 } + PauseAnimation { duration: 200 } + NumberAnimation { target: star; property: "opacity"; from: 1; to: 0; duration: 500 } + } + SequentialAnimation { + PauseAnimation { duration: 150} + NumberAnimation { target: logo; property: "y"; duration: 300; easing.type: "OutBounce" } + } + } + } + } + } + ] + +} // treatsApp diff --git a/share/qtcreator/qml/qmlobserver/startup/startup.qrc b/share/qtcreator/qml/qmlobserver/startup/startup.qrc new file mode 100644 index 00000000000..52e67050d94 --- /dev/null +++ b/share/qtcreator/qml/qmlobserver/startup/startup.qrc @@ -0,0 +1,16 @@ +<RCC> + <qresource prefix="/startup"> + <file>Logo.qml</file> + <file>qt-back.png</file> + <file>qt-blue.jpg</file> + <file>qt-front.png</file> + <file>qt-sketch.jpg</file> + <file>qt-text.png</file> + <file>quick-blur.png</file> + <file>quick-regular.png</file> + <file>shadow.png</file> + <file>startup.qml</file> + <file>startup.qrc</file> + <file>white-star.png</file> + </qresource> +</RCC> diff --git a/share/qtcreator/qml/qmlobserver/startup/white-star.png b/share/qtcreator/qml/qmlobserver/startup/white-star.png new file mode 100644 index 0000000000000000000000000000000000000000..f467c9480e4fa553ea46c153ed8deec9b43394b7 GIT binary patch literal 2651 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 literal 0 HcmV?d00001 -- GitLab