From 17d11b7be38e359b25231a03f946392a8d43e31b Mon Sep 17 00:00:00 2001 From: Kai Koehne 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. --- share/qtcreator/qml/qmlobserver/Info_mac.plist | 31 ++ .../qmlobserver/{content => browser}/Browser.qml | 50 +- .../qtcreator/qml/qmlobserver/browser/browser.qrc | 9 + .../{content => browser}/images/folder.png | Bin .../{content => browser}/images/titlebar.png | Bin .../{content => browser}/images/titlebar.sci | 0 .../qmlobserver/{content => browser}/images/up.png | Bin .../qml/qmlobserver/deviceorientation.cpp | 5 + .../qtcreator/qml/qmlobserver/deviceorientation.h | 3 + .../qmlobserver/deviceorientation_harmattan.cpp | 161 ++++++ .../qml/qmlobserver/deviceorientation_maemo5.cpp | 53 +- .../qml/qmlobserver/deviceorientation_symbian.cpp | 192 ++++++++ share/qtcreator/qml/qmlobserver/main.cpp | 541 +++++++++++++-------- .../qml/qmlobserver/qdeclarativetester.cpp | 62 ++- .../qtcreator/qml/qmlobserver/qdeclarativetester.h | 5 +- share/qtcreator/qml/qmlobserver/qml.pri | 29 +- share/qtcreator/qml/qmlobserver/qmlobserver.pro | 41 +- share/qtcreator/qml/qmlobserver/qmlruntime.cpp | 401 +++++++++------ share/qtcreator/qml/qmlobserver/qmlruntime.h | 14 +- share/qtcreator/qml/qmlobserver/qmlruntime.qrc | 9 - share/qtcreator/qml/qmlobserver/startup/Logo.qml | 179 +++++++ .../qtcreator/qml/qmlobserver/startup/qt-back.png | Bin 0 -> 3549 bytes .../qtcreator/qml/qmlobserver/startup/qt-blue.jpg | Bin 0 -> 20900 bytes .../qtcreator/qml/qmlobserver/startup/qt-front.png | Bin 0 -> 3318 bytes .../qml/qmlobserver/startup/qt-sketch.jpg | Bin 0 -> 17048 bytes .../qtcreator/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 share/qtcreator/qml/qmlobserver/startup/shadow.png | Bin 0 -> 1592 bytes .../qtcreator/qml/qmlobserver/startup/startup.qml | 173 +++++++ .../qtcreator/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 80ca6a3526..08775479ba 100644 --- a/share/qtcreator/qml/qmlobserver/Info_mac.plist +++ b/share/qtcreator/qml/qmlobserver/Info_mac.plist @@ -14,5 +14,36 @@ @TYPEINFO@ CFBundleExecutable @EXECUTABLE@ + UTExportedTypeDeclarations + + + UTTypeIdentifier + com.nokia.qt.qml + UTTypeDescription + Qt Markup Language + UTTypeConformsTo + + public.plain-text + + UTTypeTagSpecification + + public.filename-extension + + qml + + + + + CFBundleDocumentTypes + + + LSItemContentTypes + + com.nokia.qt.qml + + CFBundleTypeRole + Viewer + + 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 ff2bb47647..968d077c4e 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 0000000000..9c688e7521 --- /dev/null +++ b/share/qtcreator/qml/qmlobserver/browser/browser.qrc @@ -0,0 +1,9 @@ + + + Browser.qml + images/up.png + images/folder.png + images/titlebar.sci + images/titlebar.png + + 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 e7c70d5fde..d3014ad150 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 3bad5bec01..88ceb1bdae 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 0000000000..22f9f4c51f --- /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 +#include + +#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,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 args; + qvariant_cast(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 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 e942579b70..a324820d5f 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 0000000000..7710cf9b19 --- /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 +#include +#include +#include +#include + +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 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 86a8085cd0..9b607e8191 100644 --- a/share/qtcreator/qml/qmlobserver/main.cpp +++ b/share/qtcreator/qml/qmlobserver/main.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #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 #include @@ -83,35 +87,50 @@ void myMessageOutput(QtMsgType type, const char *msg) QWeakPointer 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] "); @@ -143,7 +162,11 @@ void usage() qWarning(" -I ........................... prepend to the module import search path,"); qWarning(" display path if is empty"); qWarning(" -P ........................... 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 ........................... set the script to use"); qWarning(" -scriptopts |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(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 83e8c06018..c736879a36 100644 --- a/share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp +++ b/share/qtcreator/qml/qmlobserver/qdeclarativetester.cpp @@ -48,7 +48,6 @@ #include #include #include - #ifndef NO_PRIVATE_HEADERS #include #include @@ -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(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 021869d93a..6fdf495c1f 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 7e485d3984..5db7678081 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 379ca5fb04..5e09ed1875 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 03276350ae..339ec38a43 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 -#include - #include "qmlruntime.h" #include #include @@ -67,6 +64,9 @@ #include #endif +#include +#include + #include #include #include @@ -90,28 +90,74 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include "proxysettings.h" #include "deviceorientation.h" -#include #ifdef GL_SUPPORTED #include #endif -#include +#if defined(Q_WS_S60) +#include // For locking app orientation +#endif #include + +#include #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 urlList = mimeData->urls(); + foreach (const QUrl &url, urlList) { + if (url.scheme() == QLatin1String("file")) { + static_cast(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(sender()); - if (!pick) - return; - int idx = pick->currentIndex(); + QMaemo5ListPickSelector *pick = qobject_cast(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 queryProxy(const QNetworkProxyQuery &query) { - class SystemProxyFactory : public QNetworkProxyFactory - { - public: - virtual QList queryProxy(const QNetworkProxyQuery &query) - { - QString protocolTag = query.protocolTag(); - if (httpProxyInUse && (protocolTag == "http" || protocolTag == "https")) { - QList ret; - ret << httpProxy; - return ret; - } + if (proxyDirty) + setupProxy(); + QString protocolTag = query.protocolTag(); + if (httpProxyInUse && (protocolTag == "http" || protocolTag == "https")) { + QList 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(nam->proxyFactory())->proxyChanged(); + } + } + static PersistentCookieJar *cookieJar; + +private slots: + void managerDestroyed(QObject *obj) { + namList.removeOne(static_cast(obj)); + } + +private: QMutex mutex; int cacheSize; + QList 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(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 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(sender()); - if (action) { - float f = action->data().toFloat(); - animationSpeed = f; - if (!pauseAnimationsAction->isChecked()) - setAnimationSpeed(animationSpeed); - } + QAction *action = qobject_cast(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(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("Qt",4,7,"Orientation",""); + qmlRegisterUncreatableType("QtQuick",1,0,"Orientation",""); registered = true; } } diff --git a/share/qtcreator/qml/qmlobserver/qmlruntime.h b/share/qtcreator/qml/qmlobserver/qmlruntime.h index b09d1b879b..7ef1bd1479 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 4136eafa52..0000000000 --- a/share/qtcreator/qml/qmlobserver/qmlruntime.qrc +++ /dev/null @@ -1,9 +0,0 @@ - - - content/Browser.qml - content/images/up.png - content/images/folder.png - content/images/titlebar.sci - content/images/titlebar.png - - diff --git a/share/qtcreator/qml/qmlobserver/startup/Logo.qml b/share/qtcreator/qml/qmlobserver/startup/Logo.qml new file mode 100644 index 0000000000..aa5648f5ed --- /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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 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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 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)rcM#lrSuh% zh!iFG4UF;vcBJ(94UQB^N|GmlBt=R?FxdESI*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%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=P2W0pR|CZFlY6u)PLK%&rvpdgXo_@V&1Vxlp`p;|eMu2xg;KB8 zqV%F3VtQ&&YGO)d;mK4RprZ2uJ|V6^`v3p`KyrA1M_*6e2l~XdB*-rq7${84EUawo z9GqO-JiL7T0)j%qViJ;4(lQE)O3G^L8k$-@3*WcjyLk7m@~fv`?TVgAC=372dvZ7Q>ebTM&(HsEwkwi3UYPc5 z!^7{l-d??1ymm$4;(K$xoGG05yztq?!z5~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@~2Gd6)Q~L zcU}6v`^xTByLK&#oBO5X)VWg*`;@EyOnZM%+pXNC?e4zEZU296{eAlVm)rXTZzopr0Q;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 0000000000..35c44c2cf8 --- /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 0000000000..52e67050d9 --- /dev/null +++ b/share/qtcreator/qml/qmlobserver/startup/startup.qrc @@ -0,0 +1,16 @@ + + + Logo.qml + qt-back.png + qt-blue.jpg + qt-front.png + qt-sketch.jpg + qt-text.png + quick-blur.png + quick-regular.png + shadow.png + startup.qml + startup.qrc + white-star.png + + 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 zcmeHJ`8yMi1KwOYqG4nxbKmDASIro<-1ppfCT0;iK5|s#h$v^dBe&{f$l^-XGp{TWfP(Zc%Ok0KkhzA?;5+=)dG-JyoUh zrcb8^i8RGTI^eHIM*Btt0uTXszd$G&=NlAgALttp8$KLp2mk=T+gduBGXIbN=>~$f zYEY+xsED+;b^ribSlQS)&Tw*Z^PJ`7I|t$y5CjVepBI6MiiuyiC;^p}l9rK`lUGnw zQdUt_Q`gYcf@xpUxvZokwT;b$whm&?#}N{F z@*8!2;pZxivAcKl=fv6j%nAT-CJ>E8IAW|yQEdtv-+g-|AQkiBy$ z#~=t7B6Ir(tAy00xKXtn&TXGErKqUa#A&Ui-sH9VJ_}B8K}XCIcvB{uxVgYr_V()U z09`2-g;#%Qhx0Z`q46njsWOT1{npn2OpL@|aoa19_tL+QU&g*S>Fd3LJWTqS#3(;_ zP#u5u1>*pi#5fptIL`xQTh$e6hF7|2Ljd=cgS~Cvzy~I0+`pR;2SnXF*<@yBUNVwI zckh6kIkW>G7VCQ^r4i9S{1(GXmoOi5ygj^1j6Ze`;p-ZV z^M@HlFc*Xha5b0kDqE;Q7eAdaK54s@iVi^$Z(9r90A+xh)Hp0vzSR!Ry}VFmWu1&{ zh`ic|T6`|RUntBULl*n;R*^rsL4U<@(sx?LIrhDoL5{d!XRoQNffHcVukHE(wE5dzB^EXa-mA{1%uxWs`_?6G&NTW)H;85%C zsa)|Hib<M``xx5@o_zfS}5?go7AJk|uQSw);U zwA0;syS@|Go%RzeT*Gepf$;Y|-jcQ!C~GwJXmfQnVuKCnt1X962OE~m7Uun6?LBH? z*pO`~Wj!(v z2@ReB=6y8+3f0AJ9Wz$Q-ep8}fBEWMDH+9U$+*5T7hGuIjjG&ik!*#2y}2kGb?^V2 z&_5iTGOa|jSo|M8tUzLN_Zyb8mK#$ltcv-8NdE)JWa4H-?8)y5Z|3i+HPV2cf(A@7 zSWY;)ar{H^#a0>AR=ieX74!5I76(CD5{;ea9i2+IN*JCLPjxc+RLjasrnZ~6;MBRp1d%Xt6Oln5;Soy} z7FcQ_H~3(=>k|dkQ7kjzGJ+C?sN5e{nZju!R!T5T+R4e`3AJahV_t{vJ!k-Q7ed0W zo{fsp+SjoBU`Y=XO-Iz#DOD_d_I^nzREINpdp9;Hb6(!?Lw9`cYa`8pKLHEKe!8$F z3eQ@-p_jC3C%fwQIl6Fj0%SCS?>Rmk+?u-@_CCi|sd2c9s>HO2gNJMy? zvSy>t1Dy6AB_7ib6U0(|33cm3PT;4Y{Igm)%IcV(CDp^hi|Awk!46K_V*Vk|4&D?S z$oVY%J_BB*At8A7PN3-b&~I1rpiGcG10ZshjKtq(rrKY zO}T@Ow0`EvjvmZp$d`9@r5&4w$4YB|mBG9c=Mwa((fCL;%(d`TmUPxv=2^62;R(48 z<0|}g2TOhS7a~LB;RL(bxy`O_6%X|E6{pz&u)r|jxvWL|u%|BY`zt<7(iEqOr7HAk zEv5zfxD>a1qjsfR6I~DF6HN~-Sf*y__l&5zoy{l$$e5}^?}L=qZR#7tXHzWr;m=_` zq4tg>Zc?9ub0_Ver>@^O74SaPGtV@HBw8Y3<;c#=i@VjMFtzgTB(`ZNkFc|4TY z8411Jt}vcM7+aFf#7XOM1(of-&>Cro`O|eu0C2)xJBp#T?6?XscL{H9~#?h@PwVT^=u)8J%o8yaHFwGB)+z z(DQILhtc+TR1=?0<U&(`+wAzT^ivL4g~?H=Kz2