From 0204346fb91eaf73893b651438980cb9ca5f1f51 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 30 Apr 2009 14:06:50 +1000 Subject: Make custom parsers internal. Custom parsers still have a way to go before they fully fit the QML 2.0 language. --- src/declarative/qml/qml.pri | 2 +- src/declarative/qml/qmlcompiler.cpp | 2 +- src/declarative/qml/qmlcustomparser.cpp | 3 +- src/declarative/qml/qmlcustomparser.h | 128 ------------------------------ src/declarative/qml/qmlcustomparser_p.h | 87 +++++++++++++++----- src/declarative/qml/qmlcustomparser_p_p.h | 79 ++++++++++++++++++ src/declarative/qml/qmlmetatype.cpp | 2 +- src/declarative/qml/qmlvme.cpp | 2 +- src/declarative/qml/qmlxmlparser.cpp | 2 +- src/declarative/util/qmllistmodel.cpp | 2 +- 10 files changed, 155 insertions(+), 154 deletions(-) delete mode 100644 src/declarative/qml/qmlcustomparser.h create mode 100644 src/declarative/qml/qmlcustomparser_p_p.h diff --git a/src/declarative/qml/qml.pri b/src/declarative/qml/qml.pri index 40b854f..9067039 100644 --- a/src/declarative/qml/qml.pri +++ b/src/declarative/qml/qml.pri @@ -32,8 +32,8 @@ HEADERS += qml/qmlparser_p.h \ qml/qmlmetaproperty.h \ qml/qmlcomponent.h \ qml/qmlcomponent_p.h \ - qml/qmlcustomparser.h \ qml/qmlcustomparser_p.h \ + qml/qmlcustomparser_p_p.h \ qml/qmlpropertyvaluesource.h \ qml/qmlboundsignal_p.h \ qml/qmlxmlparser_p.h \ diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp index 4433286..c9bdfec 100644 --- a/src/declarative/qml/qmlcompiler.cpp +++ b/src/declarative/qml/qmlcompiler.cpp @@ -59,7 +59,7 @@ #include #include #include -#include "private/qmlcustomparser_p.h" +#include "private/qmlcustomparser_p_p.h" #include "qmlscriptparser_p.h" diff --git a/src/declarative/qml/qmlcustomparser.cpp b/src/declarative/qml/qmlcustomparser.cpp index fe0c3a8..544c469 100644 --- a/src/declarative/qml/qmlcustomparser.cpp +++ b/src/declarative/qml/qmlcustomparser.cpp @@ -39,8 +39,8 @@ ** ****************************************************************************/ -#include "qmlcustomparser.h" #include "qmlcustomparser_p.h" +#include "qmlcustomparser_p_p.h" #include "qmlparser_p.h" QT_BEGIN_NAMESPACE @@ -50,6 +50,7 @@ using namespace QmlParser; /*! \class QmlCustomParser \brief The QmlCustomParser class allows you to add new arbitrary types to QML. + \internal By subclassing QmlCustomParser, you can add an XML parser for building a particular type. diff --git a/src/declarative/qml/qmlcustomparser.h b/src/declarative/qml/qmlcustomparser.h deleted file mode 100644 index 0e6a619..0000000 --- a/src/declarative/qml/qmlcustomparser.h +++ /dev/null @@ -1,128 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QMLCUSTOMPARSER_H -#define QMLCUSTOMPARSER_H - -#include -#include -#include -#include - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -class QmlCustomParserPropertyPrivate; -class Q_DECLARATIVE_EXPORT QmlCustomParserProperty -{ -public: - QmlCustomParserProperty(); - QmlCustomParserProperty(const QmlCustomParserProperty &); - QmlCustomParserProperty &operator=(const QmlCustomParserProperty &); - ~QmlCustomParserProperty(); - - QByteArray name() const; - - bool isList() const; - QList assignedValues() const; - -private: - friend class QmlCustomParserNodePrivate; - friend class QmlCustomParserPropertyPrivate; - QmlCustomParserPropertyPrivate *d; -}; -Q_DECLARE_METATYPE(QmlCustomParserProperty); - -class QmlCustomParserNodePrivate; -class Q_DECLARATIVE_EXPORT QmlCustomParserNode -{ -public: - QmlCustomParserNode(); - QmlCustomParserNode(const QmlCustomParserNode &); - QmlCustomParserNode &operator=(const QmlCustomParserNode &); - ~QmlCustomParserNode(); - - QByteArray name() const; - - QList properties() const; - -private: - friend class QmlCustomParserNodePrivate; - QmlCustomParserNodePrivate *d; -}; -Q_DECLARE_METATYPE(QmlCustomParserNode); - -class Q_DECLARATIVE_EXPORT QmlCustomParser -{ -public: - virtual ~QmlCustomParser() {} - - virtual QByteArray compile(QXmlStreamReader&, bool *ok)=0; - virtual QByteArray compile(const QList &, bool *ok); - virtual QVariant create(const QByteArray &)=0; - virtual void setCustomData(QObject *, const QByteArray &); - - struct Register { - Register(const char *name, QmlCustomParser *parser) { - qmlRegisterCustomParser(name, parser); - } - }; - template - struct Define { - static Register instance; - }; -}; -#define QML_DEFINE_CUSTOM_PARSER(name, parserClass) \ - template<> QmlCustomParser::Register QmlCustomParser::Define::instance(# name, new parserClass); -#define QML_DEFINE_CUSTOM_PARSER_NS(namespacestring, name, parserClass) \ - template<> QmlCustomParser::Register QmlCustomParser::Define::instance(namespacestring "/" # name, new parserClass); - -#define QML_DEFINE_CUSTOM_TYPE(TYPE, NAME, CUSTOMTYPE) \ - template<> QmlPrivate::InstanceType QmlPrivate::Define::instance(qmlRegisterCustomType(#NAME, #TYPE, new CUSTOMTYPE)); - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif diff --git a/src/declarative/qml/qmlcustomparser_p.h b/src/declarative/qml/qmlcustomparser_p.h index 63d148c..0e6a619 100644 --- a/src/declarative/qml/qmlcustomparser_p.h +++ b/src/declarative/qml/qmlcustomparser_p.h @@ -39,41 +39,90 @@ ** ****************************************************************************/ -#ifndef QMLCUSTOMPARSER_P_H -#define QMLCUSTOMPARSER_P_H +#ifndef QMLCUSTOMPARSER_H +#define QMLCUSTOMPARSER_H -#include -#include "qmlcustomparser.h" +#include +#include +#include +#include + +QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -namespace QmlParser +QT_MODULE(Declarative) + +class QmlCustomParserPropertyPrivate; +class Q_DECLARATIVE_EXPORT QmlCustomParserProperty { - class Object; - class Property; +public: + QmlCustomParserProperty(); + QmlCustomParserProperty(const QmlCustomParserProperty &); + QmlCustomParserProperty &operator=(const QmlCustomParserProperty &); + ~QmlCustomParserProperty(); + + QByteArray name() const; + + bool isList() const; + QList assignedValues() const; + +private: + friend class QmlCustomParserNodePrivate; + friend class QmlCustomParserPropertyPrivate; + QmlCustomParserPropertyPrivate *d; }; +Q_DECLARE_METATYPE(QmlCustomParserProperty); -class QmlCustomParserNodePrivate +class QmlCustomParserNodePrivate; +class Q_DECLARATIVE_EXPORT QmlCustomParserNode { public: - QByteArray name; - QList properties; + QmlCustomParserNode(); + QmlCustomParserNode(const QmlCustomParserNode &); + QmlCustomParserNode &operator=(const QmlCustomParserNode &); + ~QmlCustomParserNode(); - static QmlCustomParserNode fromObject(QmlParser::Object *); - static QmlCustomParserProperty fromProperty(QmlParser::Property *); + QByteArray name() const; + + QList properties() const; + +private: + friend class QmlCustomParserNodePrivate; + QmlCustomParserNodePrivate *d; }; +Q_DECLARE_METATYPE(QmlCustomParserNode); -class QmlCustomParserPropertyPrivate +class Q_DECLARATIVE_EXPORT QmlCustomParser { public: - QmlCustomParserPropertyPrivate() - : isList(false) {} + virtual ~QmlCustomParser() {} + + virtual QByteArray compile(QXmlStreamReader&, bool *ok)=0; + virtual QByteArray compile(const QList &, bool *ok); + virtual QVariant create(const QByteArray &)=0; + virtual void setCustomData(QObject *, const QByteArray &); - QByteArray name; - bool isList; - QList values; + struct Register { + Register(const char *name, QmlCustomParser *parser) { + qmlRegisterCustomParser(name, parser); + } + }; + template + struct Define { + static Register instance; + }; }; +#define QML_DEFINE_CUSTOM_PARSER(name, parserClass) \ + template<> QmlCustomParser::Register QmlCustomParser::Define::instance(# name, new parserClass); +#define QML_DEFINE_CUSTOM_PARSER_NS(namespacestring, name, parserClass) \ + template<> QmlCustomParser::Register QmlCustomParser::Define::instance(namespacestring "/" # name, new parserClass); + +#define QML_DEFINE_CUSTOM_TYPE(TYPE, NAME, CUSTOMTYPE) \ + template<> QmlPrivate::InstanceType QmlPrivate::Define::instance(qmlRegisterCustomType(#NAME, #TYPE, new CUSTOMTYPE)); QT_END_NAMESPACE -#endif // QMLCUSTOMPARSER_P_H +QT_END_HEADER + +#endif diff --git a/src/declarative/qml/qmlcustomparser_p_p.h b/src/declarative/qml/qmlcustomparser_p_p.h new file mode 100644 index 0000000..96e9b32 --- /dev/null +++ b/src/declarative/qml/qmlcustomparser_p_p.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (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 either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QMLCUSTOMPARSER_P_H +#define QMLCUSTOMPARSER_P_H + +#include +#include "qmlcustomparser_p.h" + +QT_BEGIN_NAMESPACE + +namespace QmlParser +{ + class Object; + class Property; +}; + +class QmlCustomParserNodePrivate +{ +public: + QByteArray name; + QList properties; + + static QmlCustomParserNode fromObject(QmlParser::Object *); + static QmlCustomParserProperty fromProperty(QmlParser::Property *); +}; + +class QmlCustomParserPropertyPrivate +{ +public: + QmlCustomParserPropertyPrivate() + : isList(false) {} + + QByteArray name; + bool isList; + QList values; +}; + +QT_END_NAMESPACE + +#endif // QMLCUSTOMPARSER_P_H diff --git a/src/declarative/qml/qmlmetatype.cpp b/src/declarative/qml/qmlmetatype.cpp index fbfeca0..63e5c58 100644 --- a/src/declarative/qml/qmlmetatype.cpp +++ b/src/declarative/qml/qmlmetatype.cpp @@ -57,7 +57,7 @@ #include #include #include -#include +#include QT_BEGIN_NAMESPACE #ifdef QT_BOOTSTRAPPED diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp index 7b3291e..e6235e4 100644 --- a/src/declarative/qml/qmlvme.cpp +++ b/src/declarative/qml/qmlvme.cpp @@ -45,7 +45,7 @@ #include #include "private/qmetaobjectbuilder_p.h" #include -#include +#include #include #include #include diff --git a/src/declarative/qml/qmlxmlparser.cpp b/src/declarative/qml/qmlxmlparser.cpp index b3565a0..35d2c0e 100644 --- a/src/declarative/qml/qmlxmlparser.cpp +++ b/src/declarative/qml/qmlxmlparser.cpp @@ -40,7 +40,7 @@ ****************************************************************************/ #include "qmlxmlparser_p.h" -#include "qmlcustomparser.h" +#include "qmlcustomparser_p.h" #include #include #include diff --git a/src/declarative/util/qmllistmodel.cpp b/src/declarative/util/qmllistmodel.cpp index 968e17b..4837180 100644 --- a/src/declarative/util/qmllistmodel.cpp +++ b/src/declarative/util/qmllistmodel.cpp @@ -42,7 +42,7 @@ #include #include #include -#include "qmlcustomparser.h" +#include #include "qmlopenmetaobject.h" #include #include -- cgit v0.12 From d107f39df40990d4cbd1fc5983c5de7ae46bb374 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 30 Apr 2009 14:09:20 +1000 Subject: More work on transform elements. AxisRotation/AxisTranslation have been renamed Rotation3D/Translation3D. Squish has gained a raster implementation and basic docs. --- doc/src/declarative/pics/squish.png | Bin 0 -> 8590 bytes src/declarative/fx/qfxflipable.cpp | 2 +- src/declarative/fx/qfxtransform.cpp | 202 +++++++++++++++++++++++------------- src/declarative/fx/qfxtransform.h | 22 ++-- 4 files changed, 137 insertions(+), 89 deletions(-) create mode 100644 doc/src/declarative/pics/squish.png diff --git a/doc/src/declarative/pics/squish.png b/doc/src/declarative/pics/squish.png new file mode 100644 index 0000000..73bf292 Binary files /dev/null and b/doc/src/declarative/pics/squish.png differ diff --git a/src/declarative/fx/qfxflipable.cpp b/src/declarative/fx/qfxflipable.cpp index 1d15827..81ed750 100644 --- a/src/declarative/fx/qfxflipable.cpp +++ b/src/declarative/fx/qfxflipable.cpp @@ -58,7 +58,7 @@ public: QFxItem *front; QFxItem *back; QFxAxis *axis; - QFxRotation axisRotation; + QFxRotation3D axisRotation; qreal rotation; }; diff --git a/src/declarative/fx/qfxtransform.cpp b/src/declarative/fx/qfxtransform.cpp index c355158..2bed170 100644 --- a/src/declarative/fx/qfxtransform.cpp +++ b/src/declarative/fx/qfxtransform.cpp @@ -178,8 +178,8 @@ void QFxAxis::setEndZ(qreal z) } /*! - \qmlclass AxisRotation - \brief The AxisRotation element provides a way to rotate an Item around an axis. + \qmlclass Rotation3D + \brief The Rotation3D element provides a way to rotate an Item around an axis. Here is an example of various rotations applied to an \l Image. \code @@ -187,22 +187,22 @@ void QFxAxis::setEndZ(qreal z) - + - + - + - + @@ -211,58 +211,58 @@ void QFxAxis::setEndZ(qreal z) \image axisrotation.png */ -QML_DEFINE_TYPE(QFxRotation,AxisRotation); +QML_DEFINE_TYPE(QFxRotation3D,Rotation3D); -QFxRotation::QFxRotation(QObject *parent) -: QFxTransform(parent), _angle(0), _distanceToPlane(1024.), _dirty(true) +QFxRotation3D::QFxRotation3D(QObject *parent) +: QFxTransform(parent), _angle(0), _dirty(true) { connect(&_axis, SIGNAL(updated()), this, SLOT(update())); } -QFxRotation::~QFxRotation() +QFxRotation3D::~QFxRotation3D() { } /*! - \qmlproperty real AxisRotation::axis.startX - \qmlproperty real AxisRotation::axis.startY - \qmlproperty real AxisRotation::axis.endX - \qmlproperty real AxisRotation::axis.endY - \qmlproperty real AxisRotation::axis.endZ + \qmlproperty real Rotation3D::axis.startX + \qmlproperty real Rotation3D::axis.startY + \qmlproperty real Rotation3D::axis.endX + \qmlproperty real Rotation3D::axis.endY + \qmlproperty real Rotation3D::axis.endZ A rotation axis is specified by 2 points in 3D space: a start point and an end point. The z-position of the start point is assumed to be 0, and cannot be changed. */ -QFxAxis *QFxRotation::axis() +QFxAxis *QFxRotation3D::axis() { return &_axis; } /*! - \qmlproperty real AxisRotation::angle + \qmlproperty real Rotation3D::angle The angle, in degrees, to rotate around the specified axis. */ -qreal QFxRotation::angle() const +qreal QFxRotation3D::angle() const { return _angle; } -void QFxRotation::setAngle(qreal angle) +void QFxRotation3D::setAngle(qreal angle) { _angle = angle; update(); } -bool QFxRotation::isIdentity() const +bool QFxRotation3D::isIdentity() const { return (_angle == 0.) || (_axis.endZ() == 0. && _axis.endY() == _axis.startY() && _axis.endX() == _axis.startX()); } #if defined(QFX_RENDER_QPAINTER) const qreal inv_dist_to_plane = 1. / 1024.; -QTransform QFxRotation::transform() const +QTransform QFxRotation3D::transform() const { if (_dirty) { _transform = QTransform(); @@ -282,10 +282,6 @@ QTransform QFxRotation::transform() const qreal y = _axis.endY() - _axis.startY(); qreal z = _axis.endZ(); - qreal idtp = inv_dist_to_plane; - if (distanceToPlane() != 1024.) - idtp = 1. / distanceToPlane(); - qreal len = x * x + y * y + z * z; if (len != 1.) { len = ::sqrt(len); @@ -294,8 +290,8 @@ QTransform QFxRotation::transform() const z /= len; } - QTransform rot(x*x*(1-c)+c, x*y*(1-c)-z*s, x*z*(1-c)+y*s*idtp, - y*x*(1-c)+z*s, y*y*(1-c)+c, y*z*(1-c)-x*s*idtp, + QTransform rot(x*x*(1-c)+c, x*y*(1-c)-z*s, x*z*(1-c)+y*s*inv_dist_to_plane, + y*x*(1-c)+z*s, y*y*(1-c)+c, y*z*(1-c)-x*s*inv_dist_to_plane, 0, 0, 1); _transform *= rotTrans; @@ -310,7 +306,7 @@ QTransform QFxRotation::transform() const return _transform; } #elif defined(QFX_RENDER_OPENGL) -QMatrix4x4 QFxRotation::transform() const +QMatrix4x4 QFxRotation3D::transform() const { if (_dirty) { _dirty = false; @@ -333,21 +329,7 @@ QMatrix4x4 QFxRotation::transform() const } #endif -/*! - \qmlproperty real AxisRotation::distanceToPlane -*/ -qreal QFxRotation::distanceToPlane() const -{ - return _distanceToPlane; -} - -void QFxRotation::setDistanceToPlane(qreal d) -{ - _distanceToPlane = d; - update(); -} - -void QFxRotation::update() +void QFxRotation3D::update() { _dirty = true; QFxItem *item = qobject_cast(parent()); @@ -356,77 +338,77 @@ void QFxRotation::update() } /*! - \qmlclass AxisTranslation - \brief The AxisTranslation element provides a way to move an Item along an axis. + \qmlclass Translation3D + \brief The Translation3D element provides a way to move an Item along an axis. The following example translates the image to 10, 3. \code - + \endcode */ -QML_DEFINE_TYPE(QFxTranslation,AxisTranslation); +QML_DEFINE_TYPE(QFxTranslation3D,Translation3D); -QFxTranslation::QFxTranslation(QObject *parent) +QFxTranslation3D::QFxTranslation3D(QObject *parent) : QFxTransform(parent), _distance(0), _dirty(true) { connect(&_axis, SIGNAL(updated()), this, SLOT(update())); } -QFxTranslation::~QFxTranslation() +QFxTranslation3D::~QFxTranslation3D() { } /*! - \qmlproperty real AxisTranslation::axis.startX - \qmlproperty real AxisTranslation::axis.startY - \qmlproperty real AxisTranslation::axis.endX - \qmlproperty real AxisTranslation::axis.endY - \qmlproperty real AxisTranslation::axis.endZ + \qmlproperty real Translation3D::axis.startX + \qmlproperty real Translation3D::axis.startY + \qmlproperty real Translation3D::axis.endX + \qmlproperty real Translation3D::axis.endY + \qmlproperty real Translation3D::axis.endZ A translation axis is specified by 2 points in 3D space: a start point and an end point. The z-position of the start point is assumed to be 0, and cannot be changed. Changing the z-position of the end point is only valid when running under OpenGL. */ -QFxAxis *QFxTranslation::axis() +QFxAxis *QFxTranslation3D::axis() { return &_axis; } /*! - \qmlproperty real AxisTranslation::distance + \qmlproperty real Translation3D::distance The distance to translate along the specified axis. distance is a multiplier; in the example below, a distance of 1 would translate to 100, 50, while a distance of 0.5 would translate to 50, 25. \code - + \endcode */ -qreal QFxTranslation::distance() const +qreal QFxTranslation3D::distance() const { return _distance; } -void QFxTranslation::setDistance(qreal distance) +void QFxTranslation3D::setDistance(qreal distance) { _distance = distance; update(); } -bool QFxTranslation::isIdentity() const +bool QFxTranslation3D::isIdentity() const { return (_distance == 0.) || (_axis.endZ() == 0. && _axis.endY() == _axis.startY() && _axis.endX() == _axis.startX()); } #if defined(QFX_RENDER_QPAINTER) -QTransform QFxTranslation::transform() const +QTransform QFxTranslation3D::transform() const { if (_dirty) { _transform = QTransform(); @@ -446,7 +428,7 @@ QTransform QFxTranslation::transform() const return _transform; } #elif defined(QFX_RENDER_OPENGL) -QMatrix4x4 QFxRotation::transform() const +QMatrix4x4 QFxTranslation3D::transform() const { if (_dirty) { _dirty = false; @@ -465,7 +447,7 @@ QMatrix4x4 QFxRotation::transform() const } #endif -void QFxTranslation::update() +void QFxTranslation3D::update() { _dirty = true; @@ -541,8 +523,62 @@ QMatrix4x4 QFxPerspective::transform() const \qmlclass Squish \brief The Squish element allows you to distort an items appearance by 'squishing' it. - A Squish transform only affects an item when running under OpenGL; when running under software - rasterization it has no effect. + Here is an example of various \l Image squishes. + \code + Rect { + id: Screen + width: 360; height: 80 + color: "white" + + HorizontalLayout { + margin: 10 + spacing: 10 + Image { src: "qt.png" } + Image { + src: "qt.png" + transform: Squish { + x:0; y:0; width:60; height:60 + topLeftX:0; topLeftY:0 + topRightX:50; topRightY:10 + bottomLeftX:0; bottomLeftY:60 + bottomRightX: 60; bottomRightY:60 + } + } + Image { + src: "qt.png" + transform: Squish { + x:0; y:0; width:60; height:60 + topLeftX:0; topLeftY:0 + topRightX:50; topRightY:0 + bottomLeftX:10; bottomLeftY:50 + bottomRightX: 60; bottomRightY:60 + } + } + Image { + src: "qt.png" + transform: Squish { + x:0; y:0; width:60; height:60 + topLeftX:0; topLeftY:10 + topRightX:60; topRightY:10 + bottomLeftX:0; bottomLeftY:50 + bottomRightX: 60; bottomRightY:50 + } + } + Image { + src: "qt.png" + transform: Squish { + x:0; y:0; width:60; height:60 + topLeftX:10; topLeftY:0 + topRightX:50; topRightY:0 + bottomLeftX:10; bottomLeftY:60 + bottomRightX: 50; bottomRightY:60 + } + } + } + } + \endcode + + \image squish.png */ QML_DEFINE_TYPE(QFxSquish,Squish); @@ -557,6 +593,11 @@ QFxSquish::~QFxSquish() /*! \qmlproperty real Squish::x + \qmlproperty real Squish::y + \qmlproperty real Squish::width + \qmlproperty real Squish::height + + This is usually set to the original geometry of the item being squished. */ qreal QFxSquish::x() const { @@ -569,9 +610,6 @@ void QFxSquish::setX(qreal v) update(); } -/*! - \qmlproperty real Squish::y -*/ qreal QFxSquish::y() const { return p.y(); @@ -583,9 +621,6 @@ void QFxSquish::setY(qreal v) update(); } -/*! - \qmlproperty real Squish::width -*/ qreal QFxSquish::width() const { return s.width(); @@ -597,9 +632,6 @@ void QFxSquish::setWidth(qreal v) update(); } -/*! - \qmlproperty real Squish::height -*/ qreal QFxSquish::height() const { return s.height(); @@ -614,6 +646,8 @@ void QFxSquish::setHeight(qreal v) /*! \qmlproperty real Squish::topLeftX \qmlproperty real Squish::topLeftY + + The top left point for the squish. */ qreal QFxSquish::topLeft_x() const { @@ -640,6 +674,8 @@ void QFxSquish::settopLeft_y(qreal v) /*! \qmlproperty real Squish::topRightX \qmlproperty real Squish::topRightY + + The top right point for the squish. */ qreal QFxSquish::topRight_x() const { @@ -666,6 +702,8 @@ void QFxSquish::settopRight_y(qreal v) /*! \qmlproperty real Squish::bottomLeftX \qmlproperty real Squish::bottomLeftY + + The bottom left point for the squish. */ qreal QFxSquish::bottomLeft_x() const { @@ -692,6 +730,8 @@ void QFxSquish::setbottomLeft_y(qreal v) /*! \qmlproperty real Squish::bottomRightX \qmlproperty real Squish::bottomRightY + + The bottom right point for the squish. */ qreal QFxSquish::bottomRight_x() const { @@ -722,12 +762,24 @@ void QFxSquish::update() item->updateTransform(); } -#if defined(QFX_RENDER_OPENGL) bool QFxSquish::isIdentity() const { return false; } +#if defined(QFX_RENDER_QPAINTER) +QTransform QFxSquish::transform() const +{ + QPolygonF poly; + poly << p << QPointF(p.x() + s.width(), p.y()) << QPointF(p.x() + s.width(), p.y() + s.height()) << QPointF(p.x(), p.y() + s.height()); + QPolygonF poly2; + poly2 << p1 << p2 << p4 << p3; + + QTransform t; + QTransform::quadToQuad(poly, poly2, t); + return t; +} +#elif defined(QFX_RENDER_OPENGL) QMatrix4x4 QFxSquish::transform() const { QPolygonF poly; diff --git a/src/declarative/fx/qfxtransform.h b/src/declarative/fx/qfxtransform.h index 8a4eab1..14bce9b 100644 --- a/src/declarative/fx/qfxtransform.h +++ b/src/declarative/fx/qfxtransform.h @@ -109,16 +109,15 @@ private: }; QML_DECLARE_TYPE(QFxAxis); -class Q_DECLARATIVE_EXPORT QFxRotation : public QFxTransform +class Q_DECLARATIVE_EXPORT QFxRotation3D : public QFxTransform { Q_OBJECT Q_PROPERTY(QFxAxis *axis READ axis) Q_PROPERTY(qreal angle READ angle WRITE setAngle) - Q_PROPERTY(qreal distanceToPlane READ distanceToPlane WRITE setDistanceToPlane) public: - QFxRotation(QObject *parent=0); - ~QFxRotation(); + QFxRotation3D(QObject *parent=0); + ~QFxRotation3D(); QFxAxis *axis(); @@ -136,22 +135,21 @@ private Q_SLOTS: private: QFxAxis _axis; qreal _angle; - qreal _distanceToPlane; mutable bool _dirty; mutable QSimpleCanvas::Matrix _transform; }; -QML_DECLARE_TYPE(QFxRotation); +QML_DECLARE_TYPE(QFxRotation3D); -class Q_DECLARATIVE_EXPORT QFxTranslation : public QFxTransform +class Q_DECLARATIVE_EXPORT QFxTranslation3D : public QFxTransform { Q_OBJECT Q_PROPERTY(QFxAxis *axis READ axis) Q_PROPERTY(qreal distance READ distance WRITE setDistance) public: - QFxTranslation(QObject *parent=0); - ~QFxTranslation(); + QFxTranslation3D(QObject *parent=0); + ~QFxTranslation3D(); QFxAxis *axis(); @@ -170,7 +168,7 @@ private: mutable bool _dirty; mutable QSimpleCanvas::Matrix _transform; }; -QML_DECLARE_TYPE(QFxTranslation); +QML_DECLARE_TYPE(QFxTranslation3D); class Q_DECLARATIVE_EXPORT QFxPerspective : public QFxTransform { @@ -269,10 +267,8 @@ public: qreal bottomRight_x() const; void setbottomRight_x(qreal); -#if defined(QFX_RENDER_OPENGL) virtual bool isIdentity() const; - virtual QMatrix4x4 transform() const; -#endif + virtual QSimpleCanvas::Matrix transform() const; private: void update(); -- cgit v0.12 From f2fb6b63c6e5572d02245c64da652f13174588b9 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 30 Apr 2009 14:54:49 +1000 Subject: Convert all examples and demos from XML format --- .../webbrowser/content/RectSoftShadow.qml | 40 +- demos/declarative/webbrowser/webbrowser.qml | 591 +++++++++++++++------ .../contacts/dummydata/contactModel.qml | 206 +++---- examples/declarative/easing/easing.qml | 157 +++--- examples/declarative/follow/pong.qml | 173 ++++-- .../declarative/listview/dummydata/MyPetsModel.qml | 101 ++-- .../declarative/listview/dummydata/Recipies.qml | 199 +++---- examples/declarative/minehunt/minehunt.qml | 239 ++++++--- examples/declarative/mouseregion/mouse.qml | 72 ++- examples/declarative/velocity/Day.qml | 156 ++++-- examples/declarative/velocity/velocity.qml | 194 ++++--- examples/declarative/xmldata/daringfireball.qml | 84 ++- examples/declarative/xmldata/yahoonews.qml | 149 ++++-- src/declarative/fx/qfxkeyactions.cpp | 2 +- src/declarative/fx/qfxkeyactions.h | 2 +- 15 files changed, 1522 insertions(+), 843 deletions(-) diff --git a/demos/declarative/webbrowser/content/RectSoftShadow.qml b/demos/declarative/webbrowser/content/RectSoftShadow.qml index 2b39422..5817f00 100644 --- a/demos/declarative/webbrowser/content/RectSoftShadow.qml +++ b/demos/declarative/webbrowser/content/RectSoftShadow.qml @@ -1,10 +1,30 @@ - - - - - - +Item { + Image { + source: "pics/softshadow-left.sci" + x: -16 + y: -16 + width: 16 + height: parent.height+32 + } + Image { + source: "pics/softshadow-right.sci" + x: parent.width + y: -16 + width: 16 + height: parent.height+32 + } + Image { + source: "pics/softshadow-top.png" + x: 0 + y: -16 + width: parent.width + height: 16 + } + Image { + source: "pics/softshadow-bottom.png" + x: 0 + y: parent.height + width: webview.width*webview.scale + height: 16 + } +} diff --git a/demos/declarative/webbrowser/webbrowser.qml b/demos/declarative/webbrowser/webbrowser.qml index cf96b3f..2b49c11 100644 --- a/demos/declarative/webbrowser/webbrowser.qml +++ b/demos/declarative/webbrowser/webbrowser.qml @@ -1,7 +1,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + } + Item { + id: WebPanel + anchors.fill: parent + clip: true + Rect { + color: "#555555" + anchors.fill: parent + } + Image { + source: "content/pics/softshadow-bottom.png" + width: WebPanel.width + height: 16 + } + Image { + source: "content/pics/softshadow-top.png" + width: WebPanel.width + anchors.bottom: Footer.top + height: 16 + } + RectSoftShadow { + x: -Flick.xPosition + y: -Flick.yPosition + width: WebView.width*WebView.scale + height: Flick.y+WebView.height*WebView.scale + } + Item { + id: HeaderSpace + width: parent.width + height: 60 + z: 1 + Image { + id: Header + width: parent.width + state: "Normal" + x: Flick.xPosition < 0 ? -Flick.xPosition : Flick.xPosition > Flick.viewportWidth-Flick.width ? -Flick.xPosition+Flick.viewportWidth-Flick.width : 0 + y: Flick.yPosition < 0 ? -Flick.yPosition : progressOff*(Flick.yPosition>height?-height:-Flick.yPosition) + height: 64 + source: "content/pics/header.png" + Text { + id: HeaderText + text: WebView.title!='' || WebView.progress == 1.0 ? WebView.title : 'Loading...' + color: "white" + styleColor: "black" + style: Raised + font.family: "Helvetica" + font.size: 10 + font.bold: true + elide: "ElideRight" + anchors.left: Header.left + anchors.right: Header.right + anchors.leftMargin: 4 + anchors.rightMargin: 4 + anchors.top: Header.top + anchors.topMargin: 4 + hAlign: AlignHCenter + } + Item { + anchors.top: HeaderText.bottom + anchors.topMargin: 2 + anchors.bottom: parent.bottom + width: parent.width + Item { + id: UrlBox + anchors.left: parent.left + anchors.leftMargin: 12 + anchors.right: parent.right + anchors.rightMargin: 12 + height: 31 + anchors.top: parent.top + clip: true + Image { + source: "content/pics/addressbar.sci" + anchors.fill: UrlBox + } + Image { + id: UrlBoxhl + source: "content/pics/addressbar-filled.sci" + opacity: 1-Header.progressOff + clip: true + width: parent.width*WebView.progress + height: parent.height + } + KeyProxy { + id: proxy + anchors.left: UrlBox.left + anchors.fill: UrlBox + focusable: true + targets: {[keyActions,EditUrl]} + } + KeyActions { + id: keyActions + keyReturn: "WebBrowser.url = EditUrl.text; proxy.focus=false;" + } + TextEdit { + id: EditUrl + color: "#555555" + text: WebView.url == '' ? ' ' : WebView.url + anchors.left: UrlBox.left + anchors.right: UrlBox.right + anchors.leftMargin: 6 + anchors.verticalCenter: UrlBox.verticalCenter + anchors.verticalCenterOffset: 1 + font.size: 11 + wrap: false + opacity: 0 + } + Text { + id: ShowUrl + color: "#555555" + text: WebView.url == '' ? ' ' : WebView.url + anchors.left: UrlBox.left + anchors.right: UrlBox.right + anchors.leftMargin: 6 + anchors.verticalCenter: UrlBox.verticalCenter + anchors.verticalCenterOffset: 1 + font.size: 11 + } + } + MouseRegion { + anchors.fill: UrlBox + onClicked: { proxy.focus=true } + } + } + properties: Property { + name: "progressOff" + value: 1 + type: "Real" + } + states: [ + State { + name: "Normal" + when: WebView.progress == 1.0 + SetProperty { + target: Header + property: "progressOff" + value: 1 + } + }, + State { + name: "ProgressShown" + when: WebView.progress < 1.0 + SetProperty { + target: Header + property: "progressOff" + value: 0 + } + } + ] + transitions: [ + Transition { + NumericAnimation { + target: Header + properties: "progressOff" + easing: "easeInOutQuad" + duration: 300 + } + } + ] + } + } + Flickable { + id: Flick + anchors.top: HeaderSpace.bottom + anchors.bottom: Footer.top + anchors.left: parent.left + anchors.right: parent.right + width: parent.width + viewportWidth: Math.max(parent.width,WebView.width*WebView.scale) + viewportHeight: Math.max(parent.height,WebView.height*WebView.scale) + properties: Property { + name: "centerX" + value: 0 + type: "Real" + } + properties: Property { + name: "centerY" + value: 0 + type: "Real" + } + WebView { + id: WebView + cacheSize: 4000000 + smooth: true + url: WebBrowser.url + onDoubleClick: { toggleZoom() } + focusable: true + focus: true + idealWidth: Flick.width + idealHeight: Flick.height/scale + onUrlChanged: { Flick.xPosition=0; Flick.yPosition=0; zoomOut() } + scale: (width > 0) ? Flick.width/width*zoomedOut+(1-zoomedOut) : 1 + properties: Property { + name: "zoomedOut" + type: "real" + value: 1 + } + } + Rect { + id: WebViewTint + anchors.fill: WebView + color: "black" + opacity: 0 + MouseRegion { + anchors.fill: WebViewTint + onClicked: { proxy.focus=false } + } + } + } + Image { + id: Footer + width: parent.width + anchors.bottom: parent.bottom + height: 43 + source: "content/pics/footer.sci" + Rect { + y: -1 + width: parent.width + height: 1 + color: "#555555" + } + Item { + id: backbutton + anchors.right: reload.left + anchors.rightMargin: 10 + anchors.verticalCenter: parent.verticalCenter + width: back_e.width + height: back_e.height + Image { + anchors.fill: parent + id: back_e + source: "content/pics/back.png" + } + Image { + anchors.fill: parent + id: back_d + source: "content/pics/back-disabled.png" + } + states: [ + State { + name: "Enabled" + when: WebView.back.enabled==true + SetProperty { + target: back_e + property: "opacity" + value: 1 + } + SetProperty { + target: back_d + property: "opacity" + value: 0 + } + }, + State { + name: "Disabled" + when: WebView.back.enabled==false + SetProperty { + target: back_e + property: "opacity" + value: 0 + } + SetProperty { + target: back_d + property: "opacity" + value: 1 + } + } + ] + transitions: [ + Transition { + NumericAnimation { + properties: "opacity" + easing: "easeInOutQuad" + duration: 300 + } + } + ] + MouseRegion { + anchors.fill: back_e + onClicked: { if (WebView.back.enabled) WebView.back.trigger() } + } + } + Image { + id: reload + source: "content/pics/reload.png" + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + MouseRegion { + anchors.fill: reload + onClicked: { WebView.reload.trigger() } + } + Item { + id: forwardbutton + anchors.left: reload.right + anchors.leftMargin: 10 + anchors.verticalCenter: parent.verticalCenter + width: forward_e.width + height: forward_e.height + Image { + anchors.fill: parent + anchors.verticalCenter: parent.verticalCenter + id: forward_e + source: "content/pics/forward.png" + } + Image { + anchors.fill: parent + id: forward_d + source: "content/pics/forward-disabled.png" + } + states: [ + State { + name: "Enabled" + when: WebView.forward.enabled==true + SetProperty { + target: forward_e + property: "opacity" + value: 1 + } + SetProperty { + target: forward_d + property: "opacity" + value: 0 + } + }, + State { + name: "Disabled" + when: WebView.forward.enabled==false + SetProperty { + target: forward_e + property: "opacity" + value: 0 + } + SetProperty { + target: forward_d + property: "opacity" + value: 1 + } + } + ] + transitions: [ + Transition { + NumericAnimation { + properties: "opacity" + easing: "easeInOutQuad" + duration: 320 + } + } + ] + MouseRegion { + anchors.fill: parent + onClicked: { if (WebView.forward.enabled) WebView.forward.trigger() } + } + } + } + } + states: [ + State { + name: "Normal" + SetProperty { + target: WebView + property: "zoomedOut" + value: 0 + } + SetProperty { + target: Flick + property: "xPosition" + value: Math.min(WebView.width-Flick.width,Math.max(0,Flick.centerX-Flick.width/2)) + } + SetProperty { + target: Flick + property: "yPosition" + value: Math.min(WebView.height-Flick.height,Math.max(0,Flick.centerY-Flick.height/2)) + } + }, + State { + name: "ZoomedOut" + SetProperty { + target: WebView + property: "zoomedOut" + value: 1 + } + } + ] + transitions: [ + Transition { + SequentialAnimation { + SetPropertyAction { + target: WebView + property: "smooth" + value: false + } + ParallelAnimation { + NumericAnimation { + target: WebView + properties: "zoomedOut" + easing: "easeInOutQuad" + duration: 200 + } + NumericAnimation { + target: Flick + properties: "xPosition,yPosition" + easing: "easeInOutQuad" + duration: 200 + } + } + SetPropertyAction { + target: WebView + property: "smooth" + value: true + } + } + } + ] +} diff --git a/examples/declarative/contacts/dummydata/contactModel.qml b/examples/declarative/contacts/dummydata/contactModel.qml index 341b7a6..48b2fd9 100644 --- a/examples/declarative/contacts/dummydata/contactModel.qml +++ b/examples/declarative/contacts/dummydata/contactModel.qml @@ -1,103 +1,103 @@ - - - Aaron - Kennedy - contact.png - - - - - - - Contact - 1 - contact.png - - - Contact - 2 - contact.png - - - Contact - 3 - contact.png - - - Contact - 4 - contact.png - - - Contact - 5 - contact.png - - - Contact - 6 - contact.png - - - Contact - 7 - contact.png - - - Contact - 8 - contact.png - - - Contact - 9 - contact.png - - - Alan - Alpert - contact.png - - - Betty - Boo - contact.png - - - Foo - Bar - contact.png - - - Marius - Bugge Monsen - contact.png - - - Martin - Jones - contact.png - - - - - - - Michael - Brasser - contact.png - - - - - - Yann - Bodson - contact.png - - - Yogi - Bear - contact.png - - +ListModel2 { + ListElement { + firstName: "Aaron" + lastName: "Kennedy" + portrait: "contact.png" + emails: [ + ListElement { address: "akennedy@trolltech.com" }, + ListElement { address: "aaron.kennedy@trolltech.com" } + ] + } + ListElement { + firstName: "ListElement" + lastName: 1 + portrait: "contact.png" + } + ListElement { + firstName: "ListElement" + lastName: 2 + portrait: "contact.png" + } + ListElement { + firstName: "ListElement" + lastName: 3 + portrait: "contact.png" + } + ListElement { + firstName: "ListElement" + lastName: 4 + portrait: "contact.png" + } + ListElement { + firstName: "ListElement" + lastName: 5 + portrait: "contact.png" + } + ListElement { + firstName: "ListElement" + lastName: 6 + portrait: "contact.png" + } + ListElement { + firstName: "ListElement" + lastName: 7 + portrait: "contact.png" + } + ListElement { + firstName: "ListElement" + lastName: 8 + portrait: "contact.png" + } + ListElement { + firstName: "ListElement" + lastName: 9 + portrait: "contact.png" + } + ListElement { + firstName: "Alan" + lastName: "Alpert" + portrait: "contact.png" + } + ListElement { + firstName: "Betty" + lastName: "Boo" + portrait: "contact.png" + } + ListElement { + firstName: "Foo" + lastName: "Bar" + portrait: "contact.png" + } + ListElement { + firstName: "Marius" + lastName: "Bugge Monsen" + portrait: "contact.png" + } + ListElement { + firstName: "Martin" + lastName: "Jones" + portrait: "contact.png" + emails: [ + ListElement { address: "mjones@trolltech.com" }, + ListElement { address: "martin.jones@trolltech.com" } + ] + } + ListElement { + firstName: "Michael" + lastName: "Brasser" + portrait: "contact.png" + emails: ListElement { + address: "mbrasser@trolltech.com" + } + } + ListElement { + firstName: "Yann" + lastName: "Bodson" + portrait: "contact.png" + } + ListElement { + firstName: "Yogi" + lastName: "Bear" + portrait: "contact.png" + } +} diff --git a/examples/declarative/easing/easing.qml b/examples/declarative/easing/easing.qml index f95d8c6..32c1b9b 100644 --- a/examples/declarative/easing/easing.qml +++ b/examples/declarative/easing/easing.qml @@ -1,67 +1,92 @@ - +Rect { + id: Window + width: 640 + height: Layout.height + color: "white" - - - easeLinear - easeInQuad - easeOutQuad - easeInOutQuad - easeOutInQuad - easeInCubic - easeOutCubic - easeInOutCubic - easeOutInCubic - easeInQuart - easeOutQuart - easeInOutQuart - easeOutInQuart - easeInQuint - easeOutQuint - easeInOutQuint - easeOutInQuint - easeInSine - easeOutSine - easeInOutSine - easeOutInSine - easeInExpo - easeOutExpo - easeInOutExpo - easeOutInExpo - easeInCirc - easeOutCirc - easeInOutCirc - easeOutInCirc - easeInElastic - easeOutElastic - easeInOutElastic - easeOutInElastic - easeInBack - easeOutBack - easeInOutBack - easeOutInBack - easeOutBounce - easeInBounce - easeInOutBounce - easeOutInBounce - - - - - - - - - - - - - - - - - - - - - - + ListModel2 { + id: EasingTypes + ListElement { type: "easeLinear" } + ListElement { type: "easeInQuad" } + ListElement { type: "easeOutQuad" } + ListElement { type: "easeInOutQuad" } + ListElement { type: "easeOutInQuad" } + ListElement { type: "easeInCubic" } + ListElement { type: "easeOutCubic" } + ListElement { type: "easeInOutCubic" } + ListElement { type: "easeOutInCubic" } + ListElement { type: "easeInQuart" } + ListElement { type: "easeOutQuart" } + ListElement { type: "easeInOutQuart" } + ListElement { type: "easeOutInQuart" } + ListElement { type: "easeInQuint" } + ListElement { type: "easeOutQuint" } + ListElement { type: "easeInOutQuint" } + ListElement { type: "easeOutInQuint" } + ListElement { type: "easeInSine" } + ListElement { type: "easeOutSine" } + ListElement { type: "easeInOutSine" } + ListElement { type: "easeOutInSine" } + ListElement { type: "easeInExpo" } + ListElement { type: "easeOutExpo" } + ListElement { type: "easeInOutExpo" } + ListElement { type: "easeOutInExpo" } + ListElement { type: "easeInCirc" } + ListElement { type: "easeOutCirc" } + ListElement { type: "easeInOutCirc" } + ListElement { type: "easeOutInCirc" } + ListElement { type: "easeInElastic" } + ListElement { type: "easeOutElastic" } + ListElement { type: "easeInOutElastic" } + ListElement { type: "easeOutInElastic" } + ListElement { type: "easeInBack" } + ListElement { type: "easeOutBack" } + ListElement { type: "easeInOutBack" } + ListElement { type: "easeOutInBack" } + ListElement { type: "easeOutBounce" } + ListElement { type: "easeInBounce" } + ListElement { type: "easeInOutBounce" } + ListElement { type: "easeOutInBounce" } + } + + VerticalLayout { + id: Layout + anchors.left: Window.left + anchors.right: Window.right + Repeater { + dataSource: EasingTypes + Component { + Text { + id: Text + text: type + height: 18 + font.italic: true + x: SequentialAnimation { + id: Anim + NumericAnimation { + from: 0 + to: Window.width / 2 + easing: type + duration: 1000 + } + PauseAnimation { + duration: 300 + } + NumericAnimation { + to: 0 + from: Window.width / 2 + easing: type + duration: 1000 + } + } + children: [ + MouseRegion { + onClicked: { Anim.running=true } + anchors.fill: parent + } + ] + } + } + } + } +} diff --git a/examples/declarative/follow/pong.qml b/examples/declarative/follow/pong.qml index 4fbf323..ed4a652 100644 --- a/examples/declarative/follow/pong.qml +++ b/examples/declarative/follow/pong.qml @@ -1,55 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - if (y <= 0) +Rect { + id: Page + width: 640 + height: 480 + color: "#000000" + // Make a ball to bounce + Rect { + id: Ball + x: 20 + width: 20 + height: 20 + color: "#00ee00" + z: 1 + // Add a property for the target y coordinate + properties: Property { + name: "targetY" + value: Page.height-10 + } + properties: Property { + name: "direction" + value: "right" + } + // Move the ball to the right and back to the left repeatedly + x: SequentialAnimation { + running: true + repeat: true + NumericAnimation { + to: Page.width-40 + duration: 2000 + } + SetPropertyAction { + target: Ball + property: "direction" + value: "left" + } + NumericAnimation { + to: 20 + duration: 2000 + } + SetPropertyAction { + target: Ball + property: "direction" + value: "right" + } + } + // Make y follow the target y coordinate, with a velocity of 200 + y: Follow { + source: Ball.targetY + velocity: 200 + } + // Detect the ball hitting the top or bottom of the view and bounce it + onTopChanged: { if (y <= 0) targetY = Page.height-20; - else if (y >= Page.height-20) - targetY = 0; - - - - - - - - - - - - - - - - - - - - - - - + else if (y >= Page.height-20) + targetY = 0; } + } + // Place bats to the left and right of the view, following the y + // coordinates of the ball. + Rect { + id: LeftBat + color: "#00ee00" + x: 2 + width: 20 + height: 90 + y: Follow { + source: Ball.y-45 + velocity: 300 + enabled: Ball.direction == 'left' + } + } + Rect { + id: RightBat + x: Page.width-22 + color: "#00ee00" + width: 20 + height: 90 + y: Follow { + source: Ball.y-45 + velocity: 300 + enabled: Ball.direction == 'right' + } + } + // The rest, to make it look realistic, if neither ever scores... + Rect { + color: "#00ee00" + width: 40 + height: 60 + x: 320-80 + } + Rect { + color: "#000000" + width: 20 + height: 40 + x: 320-70 + y: 10 + } + Rect { + color: "#00ee00" + width: 40 + height: 60 + x: 320+40 + } + Rect { + color: "#000000" + width: 20 + height: 40 + x: 320+50 + y: 10 + } + Repeater { + dataSource: 24 + Rect { + color: "#00ee00" + width: 10 + height: 10 + x: 320-5 + y: index*20 + } + } +} diff --git a/examples/declarative/listview/dummydata/MyPetsModel.qml b/examples/declarative/listview/dummydata/MyPetsModel.qml index 5af7fbf..def8cf3 100644 --- a/examples/declarative/listview/dummydata/MyPetsModel.qml +++ b/examples/declarative/listview/dummydata/MyPetsModel.qml @@ -1,51 +1,50 @@ - - - - Rover - Dog - 5 - - - Whiskers - Cat - 2 - - - Warren - Rabbit - 2 - - - Polly - Parrot - 12 - - - Spot - Dog - 9 - - - Tiny - Elephant - 15 - - - Penny - Turtle - 4 - - - Joey - Kangaroo - 1 - - - Kimba - Bunny - 65 - - +// ListModel allows free form list models to be defined and populated. +// Be sure to name the file the same as the id. +ListModel2 { + id: MyPetsModel + ListElement { + name: "Rover" + type: "Dog" + age: 5 + } + ListElement { + name: "Whiskers" + type: "Cat" + age: 2 + } + ListElement { + name: "Warren" + type: "Rabbit" + age: 2 + } + ListElement { + name: "Polly" + type: "Parrot" + age: 12 + } + ListElement { + name: "Spot" + type: "Dog" + age: 9 + } + ListElement { + name: "Tiny" + type: "Elephant" + age: 15 + } + ListElement { + name: "Penny" + type: "Turtle" + age: 4 + } + ListElement { + name: "Joey" + type: "Kangaroo" + age: 1 + } + ListElement { + name: "Kimba" + type: "Bunny" + age: 65 + } +} diff --git a/examples/declarative/listview/dummydata/Recipies.qml b/examples/declarative/listview/dummydata/Recipies.qml index 49bc610..6b20409 100644 --- a/examples/declarative/listview/dummydata/Recipies.qml +++ b/examples/declarative/listview/dummydata/Recipies.qml @@ -1,112 +1,87 @@ - - - - -
    -
  • 1 cup (150g) self-raising flour -
  • 1 tbs caster sugar -
  • 3/4 cup (185ml) milk -
  • 1 egg -
- - ]]> -
- - -
    -
  1. Sift flour and sugar together into a bowl. Add a pinch of salt. -
  2. Beat milk and egg together, then add to dry ingredients. Beat until smooth. -
  3. Pour mixture into a pan on medium heat and cook until bubbles appear on the surface. -
  4. Turn over and cook other side until golden. -
- ]]> -
-
- - - * Seasonal Fruit - - - * Chop fruit and place in a bowl. - - - - - -
    -
  • 1 onion -
  • 1 turnip -
  • 1 potato -
  • 1 carrot -
  • 1 head of celery -
  • 1 1/2 litres of water -
- - ]]> -
- - -
    -
  1. Chop vegetables. -
  2. Boil in water until vegetables soften. -
  3. Season with salt and pepper to taste. -
- - ]]> -
-
- - - -
    -
  • 500g minced beef -
  • Seasoning -
  • lettuce, tomato, onion, cheese -
  • 1 hamburger bun for each burger -
- - ]]> -
- - -
    -
  1. Mix the beef, together with seasoning, in a food processor. -
  2. Shape the beef into burgers. -
  3. Grill the burgers for about 5 mins on each side (until cooked through) -
  4. Serve each burger on a bun with ketchup, cheese, lettuce, tomato and onion. -
- - ]]> -
-
- - - -
    -
  • 1 cup Lemon Juice -
  • 1 cup Sugar -
  • 6 Cups of Water (2 cups warm water, 4 cups cold water) -
- - ]]> -
- - -
    -
  1. Pour 2 cups of warm water into a pitcher and stir in sugar until it dissolves. -
  2. Pour in lemon juice, stir again, and add 4 cups of cold water. -
  3. Chill or serve over ice cubes. -
- - ]]> -
-
-
+ListModel2 { + id: Recipies + ListElement { + title: "Pancakes" + picture: "content/pics/pancakes.jpg" + ingredients: " \ +
    \ +
  • 1 cup (150g) self-raising flour \ +
  • 1 tbs caster sugar \ +
  • 3/4 cup (185ml) milk \ +
  • 1 egg \ +
\ + " + method: " \ +
    \ +
  1. Sift flour and sugar together into a bowl. Add a pinch of salt. \ +
  2. Beat milk and egg together, then add to dry ingredients. Beat until smooth. \ +
  3. Pour mixture into a pan on medium heat and cook until bubbles appear on the surface. \ +
  4. Turn over and cook other side until golden. \ +
" + } + ListElement { + title: "Fruit Salad" + picture: "content/pics/fruit-salad.jpg" + ingredients: "* Seasonal Fruit" + method: "* Chop fruit and place in a bowl." + } + ListElement { + title: "Vegetable Soup" + picture: "content/pics/vegetable-soup.jpg" + ingredients: " \ +
    \ +
  • 1 onion \ +
  • 1 turnip \ +
  • 1 potato \ +
  • 1 carrot \ +
  • 1 head of celery \ +
  • 1 1/2 litres of water \ +
\ + " + method: " \ +
    \ +
  1. Chop vegetables. \ +
  2. Boil in water until vegetables soften. \ +
  3. Season with salt and pepper to taste. \ +
\ + " + } + ListElement { + title: "Hamburger" + picture: "content/pics/hamburger.jpg" + ingredients: " \ +
    \ +
  • 500g minced beef \ +
  • Seasoning \ +
  • lettuce, tomato, onion, cheese \ +
  • 1 hamburger bun for each burger \ +
\ + " + method: " \ +
    \ +
  1. Mix the beef, together with seasoning, in a food processor. \ +
  2. Shape the beef into burgers. \ +
  3. Grill the burgers for about 5 mins on each side (until cooked through) \ +
  4. Serve each burger on a bun with ketchup, cheese, lettuce, tomato and onion. \ +
\ + " + } + ListElement { + title: "Lemonade" + picture: "content/pics/lemonade.jpg" + ingredients: " \ +
    \ +
  • 1 cup Lemon Juice \ +
  • 1 cup Sugar \ +
  • 6 Cups of Water (2 cups warm water, 4 cups cold water) \ +
\ + " + method: " \ +
    \ +
  1. Pour 2 cups of warm water into a pitcher and stir in sugar until it dissolves. \ +
  2. Pour in lemon juice, stir again, and add 4 cups of cold water. \ +
  3. Chill or serve over ice cubes. \ +
\ + " + } +} diff --git a/examples/declarative/minehunt/minehunt.qml b/examples/declarative/minehunt/minehunt.qml index fb65fa3..cde2612 100644 --- a/examples/declarative/minehunt/minehunt.qml +++ b/examples/declarative/minehunt/minehunt.qml @@ -1,73 +1,166 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - In play: - - - - - - - - - - +Item { + id: field + width: 370 + height: 480 + properties: Property { + name: "clickx" + type: "Int" + value: 0 + } + properties: Property { + name: "clicky" + type: "Int" + value: 0 + } + resources: [ + Component { + id: tile + Flipable { + id: flipable + width: 40 + height: 40 + axis: Axis { + startX: 20 + startY: 20 + endX: 20 + endY: 0 + } + front: Image { + source: "pics/front.png" + width: 40 + height: 40 + Image { + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + source: "pics/flag.png" + opacity: modelData.hasFlag + opacity: Behaviour { + NumericAnimation { + property: "opacity" + duration: 250 + } + } + } + } + back: Image { + source: "pics/back.png" + width: 40 + height: 40 + Text { + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + text: modelData.hint + color: "white" + font.bold: true + opacity: modelData.hasMine == false && modelData.hint > 0 + } + Image { + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + source: "pics/bomb.png" + opacity: modelData.hasMine + } + Explosion { + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + explode: modelData.hasMine==true && modelData.flipped==true + } + } + states: [ + State { + name: "back" + when: modelData.flipped == true + SetProperty { + target: flipable + property: "rotation" + value: 180 + } + } + ] + transitions: [ + Transition { + SequentialAnimation { + PauseAnimation { + duration: {var ret = Math.abs(flipable.parent.x-field.clickx) + Math.abs(flipable.parent.y-field.clicky); if (ret > 0) {if(modelData.hasMine==true && modelData.flipped==true){ret*3;}else{ret;}} else {0}} + } + NumericAnimation { + easing: "easeInOutQuad" + properties: "rotation" + } + } + } + ] + MouseRegion { + anchors.fill: parent + onClicked: { field.clickx = flipable.parent.x; field.clicky = flipable.parent.y; row = Math.floor(index/9); col = index - (Math.floor(index/9) * 9); if(mouse.button==undefined || mouse.button==Qt.RightButton){flag(row,col);}else{flip(row,col);} } + } + } + } + ] + Image { + source: "pics/No-Ones-Laughing-3.jpg" + tile: true + } + Description { + text: "Use the 'minehunt' executable to run this demo!" + width: 300 + opacity: tiles?0:1 + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + Repeater { + dataSource: tiles + x: 1 + y: 1 + Component { + ComponentInstance { + component: tile + x: (index - (Math.floor(index/9) * 9)) * 41 + y: Math.floor(index/9) * 41 + } + } + } + Item { + id: gamedata + width: 370 + height: 100 + y: 380 + Text { + color: "white" + font.size: 18 + x: 20 + y: 20 + } + Image { + x: 100 + y: 20 + source: "pics/bomb-color.png" + } + Text { + x: 100 + y: 60 + color: "white" + text: numMines + } + Image { + x: 140 + y: 20 + source: "pics/flag-color.png" + } + Text { + x: 140 + y: 60 + color: "white" + text: numFlags + } + Image { + x: 240 + y: 0 + source: if(isPlaying==true){'pics/smile.png'}else{if(hasWon==true){'pics/glee.png'}else{'pics/frown.png'}} + MouseRegion { + anchors.fill: parent + onClicked: { reset() } + } + } + } +} diff --git a/examples/declarative/mouseregion/mouse.qml b/examples/declarative/mouseregion/mouse.qml index 7aaf51a..6d10425 100644 --- a/examples/declarative/mouseregion/mouse.qml +++ b/examples/declarative/mouseregion/mouse.qml @@ -1,24 +1,48 @@ - - - - - - - - - - +Rect { + color: "white" + width: 200 + height: 200 + Rect { + width: 50 + height: 50 + color: "red" + Text { + text: "Click" + anchors.centeredIn: parent + } + MouseRegion { + onPressed: { print('press (x: ' + mouse.x + ' y: ' + mouse.y + ' button: ' + (mouse.button == Qt.RightButton ? 'right' : 'left') + ' Shift: ' + (mouse.modifiers & Qt.ShiftModifier ? 'true' : 'false') + ')') } + onReleased: { print('release (x: ' + mouse.x + ' y: ' + mouse.y + ' isClick: ' + mouse.isClick + ' wasHeld: ' + mouse.wasHeld + ')') } + onClicked: { print('click (x: ' + mouse.x + ' y: ' + mouse.y + ' wasHeld: ' + mouse.wasHeld + ')') } + onDoubleClicked: { print('double click (x: ' + mouse.x + ' y: ' + mouse.y + ')') } + onPressAndHold: { print('press and hold') } + onExitedWhilePressed: { print('exiting while pressed') } + onReenteredWhilePressed: { print('reentering while pressed') } + anchors.fill: parent + } + } + Rect { + y: 100 + width: 50 + height: 50 + color: "blue" + Text { + text: "Drag" + anchors.centeredIn: parent + } + MouseRegion { + drag.target: parent + drag.axis: "x" + drag.xmin: 0 + drag.xmax: 150 + onPressed: { print('press') } + onReleased: { print('release (isClick: ' + mouse.isClick + ') (wasHeld: ' + mouse.wasHeld + ')') } + onClicked: { print('click' + '(wasHeld: ' + mouse.wasHeld + ')') } + onDoubleClicked: { print('double click') } + onPressAndHold: { print('press and hold') } + onExitedWhilePressed: { print('exiting while pressed') } + onReenteredWhilePressed: { print('reentering while pressed') } + anchors.fill: parent + } + } +} diff --git a/examples/declarative/velocity/Day.qml b/examples/declarative/velocity/Day.qml index b65f2bc..7d26e88 100644 --- a/examples/declarative/velocity/Day.qml +++ b/examples/declarative/velocity/Day.qml @@ -1,41 +1,115 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Rect { + width: 400 + height: 500 + radius: 7 + pen.color: "black" + id: Page + properties: Property { + name: "day" + type: "string" + } + properties: Property { + name: "stickies" + } + Image { + x: 10 + y: 10 + source: "cork.jpg" + opaque: true + } + Text { + x: 20 + y: 20 + height: 40 + font.size: 14 + font.bold: true + width: 370 + text: day + style: Outline + styleColor: "#dedede" + } + Repeater { + dataSource: Page.stickies + Item { + x: Math.random() * 200 + 100 + y: Math.random() * 300 + 50 + id: StickyPage + rotation: Follow { + source: -Flick.xVelocity / 100 + spring: 2.0 + damping: 0.1 + } + Item { + id: Sticky + scale: 0.5 + Image { + id: StickyImage + source: "sticky.png" + smooth: true + y: -20 + x: 8 + -width * 0.6 / 2 + scale: 0.6 + } + TextEdit { + id: MyText + smooth: true + font.size: 28 + readOnly: false + x: -104 + y: 36 + wrap: true + rotation: -8 + text: noteText + width: 195 + height: 172 + } + Item { + y: -20 + x: StickyImage.x + width: StickyImage.width * StickyImage.scale + height: StickyImage.height * StickyImage.scale + MouseRegion { + id: Mouse + onClicked: { MyText.focus = true } + anchors.fill: parent + drag.target: StickyPage + drag.axis: "xy" + drag.ymin: 0 + drag.ymax: 500 + drag.xmin: 0 + drag.xmax: 400 + } + } + } + Image { + source: "tack.png" + x: -width / 2 + y: -height * 0.7 / 2 + scale: 0.7 + } + states: [ + State { + name: "pressed" + when: Mouse.pressed + SetProperties { + target: Sticky + rotation: 8 + scale: 1 + } + SetProperties { + target: Page + z: 8 + } + } + ] + transitions: [ + Transition { + NumericAnimation { + properties: "rotation,scale" + duration: 200 + } + } + ] + } + } +} diff --git a/examples/declarative/velocity/velocity.qml b/examples/declarative/velocity/velocity.qml index 0215d37..ff95527 100644 --- a/examples/declarative/velocity/velocity.qml +++ b/examples/declarative/velocity/velocity.qml @@ -1,81 +1,113 @@ - - - - Sunday - #808080 - - - - - - - Monday - blue - - - - - - - - Tuesday - yellow - - - - - - - Wednesday - purple - - - - - - - Thursday - blue - - - - - - - Friday - green - - - - - - - Saturday - orange - - - - - - - - - - - - - - - - - - - +Rect { + color: "lightSteelBlue" + width: 800 + height: 600 + ListModel2 { + id: List + ListElement { + name: "Sunday" + dayColor: "#808080" + notes: [ + ListElement { + noteText: "Lunch" + }, + ListElement { + noteText: "Party" + } + ] + } + ListElement { + name: "Monday" + dayColor: "blue" + notes: [ + ListElement { + noteText: "Pickup kids" + }, + ListElement { + noteText: "Checkout kinetic" + }, + ListElement { + noteText: "Read email" + } + ] + } + ListElement { + name: "Tuesday" + dayColor: "yellow" + notes: [ + ListElement { + noteText: "Walk dog" + }, + ListElement { + noteText: "Buy newspaper" + } + ] + } + ListElement { + name: "Wednesday" + dayColor: "purple" + notes: [ + ListElement { + noteText: "Cook dinner" + }, + ListElement { + noteText: "Eat dinner" + } + ] + } + ListElement { + name: "Thursday" + dayColor: "blue" + notes: [ + ListElement { + noteText: "5:30pm Meeting" + }, + ListElement { + noteText: "Weed garden" + } + ] + } + ListElement { + name: "Friday" + dayColor: "green" + notes: [ + ListElement { + noteText: "Still work" + }, + ListElement { + noteText: "Drink" + } + ] + } + ListElement { + name: "Saturday" + dayColor: "orange" + notes: [ + ListElement { + noteText: "Drink" + }, + ListElement { + noteText: "Drink" + } + ] + } + } + Flickable { + id: Flick + anchors.fill: parent + viewportWidth: Lay.width + HorizontalLayout { + id: Lay + Repeater { + dataSource: List + Component { + Day { + day: name + color: dayColor + stickies: notes + } + } + } + } + } +} diff --git a/examples/declarative/xmldata/daringfireball.qml b/examples/declarative/xmldata/daringfireball.qml index 5e98d1b..3877adf 100644 --- a/examples/declarative/xmldata/daringfireball.qml +++ b/examples/declarative/xmldata/daringfireball.qml @@ -1,25 +1,59 @@ - - - - - declare default element namespace 'http://www.w3.org/2005/Atom'; - - - - - - - - - - - print('link clicked: ' + link) - - - - - - - +Rect { + color: "white" + width: 600 + height: 600 + resources: [ + XmlListModel { + id: feedModel + source: "http://daringfireball.net/index.xml" + query: "doc($src)/feed/entry" + namespaceDeclarations: "declare default element namespace 'http://www.w3.org/2005/Atom';" + Role { + name: "title" + query: "title/string()" + } + Role { + name: "tagline" + query: "author/name/string()" + } + Role { + name: "content" + query: "content/string()" + isCData: true + } + }, + Component { + id: feedDelegate + Item { + height: contents.height + 20 + Text { + x: 10 + id: TitleText + text: title + font.bold: true + } + Text { + text: 'by ' + tagline + anchors.left: TitleText.right + anchors.leftMargin: 10 + font.italic: true + } + Text { + x: 10 + text: content + anchors.top: TitleText.bottom + width: 580 + wrap: true + onLinkActivated: { print('link clicked: ' + link) } + } + } + } + ] + ListView { + id: list + anchors.fill: parent + clip: true + model: feedModel + delegate: feedDelegate + } +} diff --git a/examples/declarative/xmldata/yahoonews.qml b/examples/declarative/xmldata/yahoonews.qml index 32a706e..a465cdd 100644 --- a/examples/declarative/xmldata/yahoonews.qml +++ b/examples/declarative/xmldata/yahoonews.qml @@ -1,38 +1,111 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Rect { + color: "black" + gradientColor: "#AAAAAA" + width: 600 + height: 600 + resources: [ + XmlListModel { + id: feedModel + source: "http://rss.news.yahoo.com/rss/oceania" + query: "doc($src)/rss/channel/item" + Role { + name: "title" + query: "title/string()" + } + Role { + name: "link" + query: "link/string()" + } + Role { + name: "description" + query: "description/string()" + isCData: true + } + }, + Component { + id: feedDelegate + Item { + id: Delegate + height: Wrapper.height + 10 + MouseRegion { + anchors.fill: Wrapper + onPressed: { Delegate.ListView.list.currentIndex = index; } + onClicked: { if (Wrapper.state == 'Details') { Wrapper.state = '';} else {Wrapper.state = 'Details';} } + } + Rect { + id: Wrapper + y: 5 + height: TitleText.height + 10 + width: 580 + color: "#F0F0F0" + radius: 5 + Text { + x: 10 + y: 5 + id: TitleText + text: '' + title + '' + font.bold: true + font.family: "Helvetica" + font.size: 14 + onLinkActivated: { print('link clicked: ' + link) } + } + Text { + x: 10 + id: Description + text: description + width: 560 + wrap: true + font.family: "Helvetica" + anchors.top: TitleText.bottom + anchors.topMargin: 5 + opacity: 0 + } + states: [ + State { + name: "Details" + SetProperty { + target: Wrapper + property: "height" + binding: "contents.height + 10" + } + SetProperty { + target: Description + property: "opacity" + value: 1 + } + } + ] + transitions: [ + Transition { + fromState: "*" + toState: "Details" + reversible: true + SequentialAnimation { + NumericAnimation { + duration: 200 + properties: "height" + easing: "easeOutQuad" + } + NumericAnimation { + duration: 200 + properties: "opacity" + } + } + } + ] + } + } + } + ] + ListView { + id: list + x: 10 + y: 10 + width: parent.width - 20 + height: parent.height - 20 + clip: true + model: feedModel + delegate: feedDelegate + currentItemPositioning: "Snap" + } +} diff --git a/src/declarative/fx/qfxkeyactions.cpp b/src/declarative/fx/qfxkeyactions.cpp index 69d4679..d2739ea 100644 --- a/src/declarative/fx/qfxkeyactions.cpp +++ b/src/declarative/fx/qfxkeyactions.cpp @@ -736,7 +736,7 @@ void QFxKeyActions::setKey_Space(const QString &s) /*! \qmlproperty string KeyActions::escape - \qmlproperty string KeyActions::return + \qmlproperty string KeyActions::keyReturn \qmlproperty string KeyActions::enter \qmlproperty string KeyActions::delete \qmlproperty string KeyActions::space diff --git a/src/declarative/fx/qfxkeyactions.h b/src/declarative/fx/qfxkeyactions.h index 7ad323a..b0d002d 100644 --- a/src/declarative/fx/qfxkeyactions.h +++ b/src/declarative/fx/qfxkeyactions.h @@ -101,7 +101,7 @@ class Q_DECLARATIVE_EXPORT QFxKeyActions : public QFxItem Q_PROPERTY(QString digit9 READ key_9 WRITE setKey_9) Q_PROPERTY(QString asterisk READ key_Asterisk WRITE setKey_Asterisk) Q_PROPERTY(QString escape READ key_Escape WRITE setKey_Escape) - Q_PROPERTY(QString return READ key_Return WRITE setKey_Return) + Q_PROPERTY(QString keyReturn READ key_Return WRITE setKey_Return) Q_PROPERTY(QString enter READ key_Enter WRITE setKey_Enter) Q_PROPERTY(QString delete READ key_Delete WRITE setKey_Delete) Q_PROPERTY(QString space READ key_Space WRITE setKey_Space) -- cgit v0.12 From 72afedd7fad133b390cc63fd04e3cf0cee757e2e Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 30 Apr 2009 14:58:56 +1000 Subject: Rename duiviewer to qmlviewer. --- doc/src/declarative/examples.qdoc | 9 +- doc/src/declarative/focus.qdoc | 2 +- doc/src/declarative/tutorial1.qdoc | 4 +- doc/src/duiviewer.qdoc | 80 -------- doc/src/qmlviewer.qdoc | 79 ++++++++ doc/src/tutorials/declarative.qdoc | 2 +- tools/duiviewer/duiviewer.pro | 12 -- tools/duiviewer/main.cpp | 135 -------------- tools/duiviewer/qfxviewer.cpp | 367 ------------------------------------- tools/duiviewer/qfxviewer.h | 72 -------- tools/qmlviewer/main.cpp | 135 ++++++++++++++ tools/qmlviewer/qmlviewer.cpp | 366 ++++++++++++++++++++++++++++++++++++ tools/qmlviewer/qmlviewer.h | 72 ++++++++ tools/qmlviewer/qmlviewer.pro | 12 ++ tools/tools.pro | 2 +- 15 files changed, 673 insertions(+), 676 deletions(-) delete mode 100644 doc/src/duiviewer.qdoc create mode 100644 doc/src/qmlviewer.qdoc delete mode 100644 tools/duiviewer/duiviewer.pro delete mode 100644 tools/duiviewer/main.cpp delete mode 100644 tools/duiviewer/qfxviewer.cpp delete mode 100644 tools/duiviewer/qfxviewer.h create mode 100644 tools/qmlviewer/main.cpp create mode 100644 tools/qmlviewer/qmlviewer.cpp create mode 100644 tools/qmlviewer/qmlviewer.h create mode 100644 tools/qmlviewer/qmlviewer.pro diff --git a/doc/src/declarative/examples.qdoc b/doc/src/declarative/examples.qdoc index e65808f..fa9f05b 100644 --- a/doc/src/declarative/examples.qdoc +++ b/doc/src/declarative/examples.qdoc @@ -3,18 +3,18 @@ \target qmlexamples \title QML Examples -A viewer application is included that allows you to quickly explore many of the +A \l {qmlviewer}{viewer} application is included that allows you to quickly explore many of the examples. It has some useful options, revealed by: \code - bin/duiviewer -help + bin/qmlviewer -help \endcode -There are several illustrative XML examples available. From your build +There are several illustrative QML examples available. From your build directory, \code - bin/duiviewer $QT_SOURCE_DIR/examples/declarative/mediabrowser/mediabrowser.qml + bin/qmlviewer $QT_SOURCE_DIR/demos/declarative/phonebrowser/phonebrowser.qml \endcode Many other simple examples can be found under the \c examples/declarative sub @@ -32,5 +32,4 @@ own QML-based applications. software rasterizer, a simple canvas backend is used by default. To use Graphics View instead, set \c QML_USE_GRAPHICSVIEW=1. - */ diff --git a/doc/src/declarative/focus.qdoc b/doc/src/declarative/focus.qdoc index e0d4ca3..fc747a9 100644 --- a/doc/src/declarative/focus.qdoc +++ b/doc/src/declarative/focus.qdoc @@ -48,7 +48,7 @@ element whose text is determined by whether or not it has \e {active focus}. An \l Item requests focus by setting the \c {Item::focus} property to true. For very simple cases simply setting the \c {Item::focus} property is sometimes -sufficient. If we run the following example in the \c duiviewer, we see that +sufficient. If we run the following example in the \c qmlviewer, we see that the \c {} element has \e {active focus} and pressing the \e A, \e B, or \e C keys modifies the text appropriately. diff --git a/doc/src/declarative/tutorial1.qdoc b/doc/src/declarative/tutorial1.qdoc index caadbf5..aa94c06 100644 --- a/doc/src/declarative/tutorial1.qdoc +++ b/doc/src/declarative/tutorial1.qdoc @@ -43,10 +43,10 @@ The \c anchors.horizontalCenter property refers to the horizontal center of an e \section2 Viewing the example -To view what you have created, run the duiviewer (located in the \c bin directory) with your filename as the first argument. For example, to run the provided completed Tutorial 1 example from the install location, you would type: +To view what you have created, run the qmlviewer (located in the \c bin directory) with your filename as the first argument. For example, to run the provided completed Tutorial 1 example from the install location, you would type: \code -bin/duiviewer examples/tutorials/t1/tutorial1.qml +bin/qmlviewer examples/tutorials/t1/tutorial1.qml \endcode [\l tutorial] [Next: \l tutorial2] diff --git a/doc/src/duiviewer.qdoc b/doc/src/duiviewer.qdoc deleted file mode 100644 index f967f87..0000000 --- a/doc/src/duiviewer.qdoc +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the documentation 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 either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \page duiviewer.html - \title Declarative UI Viewer (duiviewer) - \ingroup qttools - \keyword duiviewer - - This page documents the \e{Declarative UI Viewer} for the Qt GUI - toolkit. The \c duiviewer reads an XML format declarative user interface definition - (\c .qml) file - and displays the user interface it describes. - - \section1 Options - - When run with the \c -help option, duiviewer shows available options. - - \section1 Dummy Data - - One use of duiviewer is to allow QML files to be viewed stand-alone, - rather than being loaded from within a Qt program. Qt applications will - usually bind objects and properties into the execution context before - running the QML. To stand-in for such bindings, you can provide dummy - data: create a directory called "dummydata" in the same directory as - the target QML file and create files there with the "qml" extension. - All such files will be loaded as QML objects and bound to the root - context as a property with the name of the file (without ".qml"). - - For example, if the Qt application has a "clock.time" property - that is a qreal from 0 to 86400 representing the number of seconds since - midnight, dummy data for this could be provided by \c dummydata/clock.qml: - \code - - - - - - \endcode - Any QML can be used in the dummy data files. You could even animate the - fictional data! -*/ diff --git a/doc/src/qmlviewer.qdoc b/doc/src/qmlviewer.qdoc new file mode 100644 index 0000000..e8fdec4 --- /dev/null +++ b/doc/src/qmlviewer.qdoc @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the documentation 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 either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page qmlviewer.html + \title Qt Declarative UI Viewer (qmlviewer) + \ingroup qttools + \keyword qmlviewer + + This page documents the \e{Declarative UI Viewer} for the Qt GUI + toolkit. The \c qmlviewer reads a declarative user interface definition + (\c .qml) file and displays the user interface it describes. + + \section1 Options + + When run with the \c -help option, qmlviewer shows available options. + + \section1 Dummy Data + + One use of qmlviewer is to allow QML files to be viewed stand-alone, + rather than being loaded from within a Qt program. Qt applications will + usually bind objects and properties into the execution context before + running the QML. To stand-in for such bindings, you can provide dummy + data: create a directory called "dummydata" in the same directory as + the target QML file and create files there with the "qml" extension. + All such files will be loaded as QML objects and bound to the root + context as a property with the name of the file (without ".qml"). + + For example, if the Qt application has a "clock.time" property + that is a qreal from 0 to 86400 representing the number of seconds since + midnight, dummy data for this could be provided by \c dummydata/clock.qml: + \code + + + + + + \endcode + Any QML can be used in the dummy data files. You could even animate the + fictional data! +*/ diff --git a/doc/src/tutorials/declarative.qdoc b/doc/src/tutorials/declarative.qdoc index 3724b10..16dad6e 100644 --- a/doc/src/tutorials/declarative.qdoc +++ b/doc/src/tutorials/declarative.qdoc @@ -77,7 +77,7 @@ sub directory the files are numbered in an order of increasing features. The code in this example is not compiled, but interpreted at run time. - This means you should use the duiviewer application provided with + This means you should use the qmlviewer application provided with Qt to run the examples. \list diff --git a/tools/duiviewer/duiviewer.pro b/tools/duiviewer/duiviewer.pro deleted file mode 100644 index eae313e..0000000 --- a/tools/duiviewer/duiviewer.pro +++ /dev/null @@ -1,12 +0,0 @@ -DESTDIR = ../../bin -QT += declarative script network sql -# Input -HEADERS += qfxviewer.h -SOURCES += main.cpp qfxviewer.cpp - -include($$QT_SOURCE_TREE/tools/shared/deviceskin/deviceskin.pri) - -target.path=$$[QT_INSTALL_BINS] -INSTALLS += target - -CONFIG += console diff --git a/tools/duiviewer/main.cpp b/tools/duiviewer/main.cpp deleted file mode 100644 index cb4ba05..0000000 --- a/tools/duiviewer/main.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1992-$THISYEAR$ $TROLLTECH$. All rights reserved. -** -** This file is part of the $MODULE$ of the Qt Toolkit. -** -** $TROLLTECH_DUAL_LICENSE$ -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qml.h" -#include "qfxviewer.h" -#include -#include -#include "qfxtestengine.h" -#include - - -void usage() -{ - qWarning("Usage: duiviewer [options] "); - qWarning(" "); - qWarning(" options:"); - qWarning(" -v, -version ............................. display version"); - qWarning(" -frameless ............................... run with no window frame"); - qWarning(" -skin ...................... run with a skin window frame"); - qWarning(" -recorddither ordered|threshold|floyd .... set dither mode used for recording"); - qWarning(" -recordperiod ............. set time between recording frames"); - qWarning(" -autorecord [from-] ...... set recording to start and stop automatically"); - qWarning(" -devicekeys .............................. use numeric keys (see F1)"); - qWarning(" -cache ................................... enable a disk cache of remote content"); - qWarning(" -recordtest .................. record an autotest"); - qWarning(" -runtest ..................... run a previously recorded test"); - qWarning(" "); - qWarning(" Press F1 for interactive help"); - exit(1); -} - -int main(int argc, char ** argv) -{ - //### default to using raster graphics backend for now - int newargc = argc + 2; - char **newargv; - newargv = new char * [newargc]; - for (int i = 0; i < argc; ++i) { - newargv[i] = argv[i]; - if (!qstrcmp(argv[i], "-graphicssystem")) { - newargc -= 2; - break; - } - } - char system[] = "-graphicssystem"; - newargv[argc] = system; - char raster[] = "raster"; - newargv[argc+1] = raster; - - - QApplication app(newargc, newargv); - app.setApplicationName("viewer"); - - bool frameless = false; - QString fileName; - int period = 0; - int autorecord_from = 0; - int autorecord_to = 0; - QString dither = "threshold"; - QString skin; - bool devkeys = false; - bool cache = false; - QFxTestEngine::TestMode testMode = QFxTestEngine::NoTest; - QString testDir; - - for (int i = 1; i < newargc; ++i) { - QString arg = newargv[i]; - if (arg == "-frameless") { - frameless = true; - } else if (arg == "-skin") { - skin = QString(argv[++i]); - } else if (arg == "-cache") { - cache = true; - } else if (arg == "-recordperiod") { - period = QString(argv[++i]).toInt(); - } else if (arg == "-autorecord") { - QString range = QString(argv[++i]); - int dash = range.indexOf('-'); - if (dash > 0) - autorecord_from = range.left(dash).toInt(); - autorecord_to = range.mid(dash+1).toInt(); - } else if (arg == "-devicekeys") { - devkeys = true; - } else if (arg == "-recordtest") { - testMode = QFxTestEngine::RecordTest; - if(i + 1 >= newargc) - usage(); - testDir = newargv[i + 1]; - ++i; - } else if (arg == "-runtest") { - testMode = QFxTestEngine::PlaybackTest; - if(i + 1 >= newargc) - usage(); - testDir = newargv[i + 1]; - ++i; - } else if (arg == QLatin1String("-v") || arg == QLatin1String("-version")) { - fprintf(stderr, "Qt Declarative UI Viewer version %s\n", QT_VERSION_STR); - return 0; - } else if (arg[0] != '-') { - fileName = arg; - } else if (1 || arg == "-help") { - usage(); - } - } - - if (fileName.isEmpty()) - usage(); - - QFxViewer viewer(testMode, testDir, 0, frameless ? Qt::FramelessWindowHint : Qt::Widget); - viewer.setCacheEnabled(cache); - viewer.openXml(fileName); - if (period>0) - viewer.setRecordPeriod(period); - if (autorecord_to) - viewer.setAutoRecord(autorecord_from,autorecord_to); - if (QDir(skin).exists()) - viewer.setSkin(skin); - if (devkeys) - viewer.setDeviceKeys(true); - viewer.setRecordDither(dither); - viewer.show(); - - return app.exec(); -} - diff --git a/tools/duiviewer/qfxviewer.cpp b/tools/duiviewer/qfxviewer.cpp deleted file mode 100644 index b15a8bf..0000000 --- a/tools/duiviewer/qfxviewer.cpp +++ /dev/null @@ -1,367 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1992-$THISYEAR$ $TROLLTECH$. All rights reserved. -** -** This file is part of the $MODULE$ of the Qt Toolkit. -** -** $TROLLTECH_DUAL_LICENSE$ -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include - -#include "qmlbindablevalue.h" -#include "qfxviewer.h" -#include -#include -#include "qml.h" -#include "qperformancelog.h" -#include "qfxtestengine.h" -#include "deviceskin.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -QFxViewer::QFxViewer(QFxTestEngine::TestMode testMode, const QString &testDir, QWidget *parent, Qt::WindowFlags flags) - : QWidget(parent, flags) -{ - testEngine = 0; - devicemode = false; - skin = 0; - canvas = 0; - record_autotime = 0; - record_period = 20; - - int width=240; - int height=320; - setAttribute(Qt::WA_OpaquePaintEvent); - setAttribute(Qt::WA_NoSystemBackground); - - canvas = new QFxView(this); - if(testMode != QFxTestEngine::NoTest) - testEngine = new QFxTestEngine(testMode, testDir, canvas, this); - - QObject::connect(canvas, SIGNAL(sceneResized(QSize)), this, SLOT(sceneResized(QSize))); - canvas->setFixedSize(width, height); - resize(width, height); -} - -void QFxViewer::reload() -{ - openXml(currentFileName); -} - -void QFxViewer::openXml(const QString& fileName) -{ - setWindowTitle(tr("%1 - Qt Declarative UI Viewer").arg(fileName)); - - canvas->reset(); - - currentFileName = fileName; - QUrl url(fileName); - QFileInfo fi(fileName); - if (fi.exists()) { - url = QUrl::fromLocalFile(fi.absoluteFilePath()); - QmlContext *ctxt = canvas->rootContext(); - QDir dir(fi.path()+"/dummydata", "*.qml"); - 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(); - QmlComponent comp(canvas->engine()); - comp.setData(data, QUrl()); - QObject *dummyData = comp.create(); - if (dummyData) { - qWarning() << "Loaded dummy data:" << dir.filePath(qml); - qml.truncate(qml.length()-4); - ctxt->setContextProperty(qml, dummyData); - dummyData->setParent(this); - } - } - } - - canvas->setUrl(url); - - QTime t; - t.start(); - canvas->execute(); - qWarning() << "Wall startup time:" << t.elapsed(); -#ifdef QTOPIA - show(); -#endif -} - -class PreviewDeviceSkin : public DeviceSkin -{ - Q_OBJECT -public: - explicit PreviewDeviceSkin(const DeviceSkinParameters ¶meters, QWidget *parent); - - void setPreview(QWidget *formWidget); - void setScreenSize(const QSize& size) - { - QMatrix fit; - fit = fit.scale(qreal(size.width())/m_screenSize.width(), - qreal(size.height())/m_screenSize.height()); - setTransform(fit); - } - -private slots: - void slotSkinKeyPressEvent(int code, const QString& text, bool autorep); - void slotSkinKeyReleaseEvent(int code, const QString& text, bool autorep); - void slotPopupMenu(); - -private: - void populateContextMenu(QMenu *menu); - const QSize m_screenSize; -}; - - -PreviewDeviceSkin::PreviewDeviceSkin(const DeviceSkinParameters ¶meters, QWidget *parent) : - DeviceSkin(parameters, parent), - m_screenSize(parameters.screenSize()) -{ - connect(this, SIGNAL(skinKeyPressEvent(int,QString,bool)), - this, SLOT(slotSkinKeyPressEvent(int,QString,bool))); - connect(this, SIGNAL(skinKeyReleaseEvent(int,QString,bool)), - this, SLOT(slotSkinKeyReleaseEvent(int,QString,bool))); - connect(this, SIGNAL(popupMenu()), this, SLOT(slotPopupMenu())); -} - -void PreviewDeviceSkin::setPreview(QWidget *formWidget) -{ - formWidget->setFixedSize(m_screenSize); - formWidget->setParent(this, Qt::SubWindow); - formWidget->setAutoFillBackground(true); - setView(formWidget); -} - -void PreviewDeviceSkin::slotSkinKeyPressEvent(int code, const QString& text, bool autorep) -{ - if (QWidget *focusWidget = QApplication::focusWidget()) { - QKeyEvent e(QEvent::KeyPress,code,0,text,autorep); - QApplication::sendEvent(focusWidget, &e); - } - -} - -void PreviewDeviceSkin::slotSkinKeyReleaseEvent(int code, const QString& text, bool autorep) -{ - if (QWidget *focusWidget = QApplication::focusWidget()) { - QKeyEvent e(QEvent::KeyRelease,code,0,text,autorep); - QApplication::sendEvent(focusWidget, &e); - } -} - -void PreviewDeviceSkin::slotPopupMenu() -{ - QMenu menu(this); - populateContextMenu(&menu); - menu.exec(QCursor::pos()); -} - -void PreviewDeviceSkin::populateContextMenu(QMenu *menu) -{ - connect(menu->addAction(tr("&Close")), SIGNAL(triggered()), parentWidget(), SLOT(close())); -} - - -void QFxViewer::setSkin(const QString& skinDirectory) -{ - DeviceSkinParameters parameters; - QString err; - if (parameters.read(skinDirectory,DeviceSkinParameters::ReadAll,&err)) { - delete skin; - if (!err.isEmpty()) - qWarning() << err; - skin = new PreviewDeviceSkin(parameters,this); - skin->setScreenSize(canvas->size()); - canvas->setParent(skin, Qt::SubWindow); - canvas->setAutoFillBackground(true); - skin->setView(canvas); - delete layout(); - - canvas->show(); - } -} - -void QFxViewer::setAutoRecord(int from, int to) -{ - record_autotime = to-from; - if (from) { - autoStartTimer.start(from,this); - } else { - autoTimer.start(); - setRecording(true); - } -} - -void QFxViewer::setRecordPeriod(int ms) -{ - record_period = ms; -} - -void QFxViewer::sceneResized(QSize size) -{ - if (size.width() > 0 && size.height() > 0) { - canvas->setFixedSize(size.width(), size.height()); - if (skin) - skin->setScreenSize(size); - else - resize(size); - } -} - -void QFxViewer::resizeEvent(QResizeEvent *) -{ - if (!skin) - canvas->setFixedSize(width(),height()); -} - -void QFxViewer::keyPressEvent(QKeyEvent *event) -{ - if (event->key() == Qt::Key_0 && devicemode) - exit(0); - else if (event->key() == Qt::Key_F1 || (event->key() == Qt::Key_1 && devicemode)) { - qDebug() << "F1 - help\n" - << "F2 - toggle GIF recording\n" - << "F3 - take PNG snapshot\n" - << "F4 - show items and state\n" - << "F5 - reload XML\n" - << "F6 - show object tree\n" - << "F7 - show timing\n" - << "F8 - show performance (if available)\n" - << "device keys: 0=quit, 1..8=F1..F8" - ; - } else if (event->key() == Qt::Key_F2 || (event->key() == Qt::Key_2 && devicemode)) { - setRecording(!recordTimer.isActive()); - } else if (event->key() == Qt::Key_F3 || (event->key() == Qt::Key_3 && devicemode)) { - setRecording(!recordTimer.isActive()); - canvas->asImage().save("snapshot.png"); - qDebug() << "Wrote snapshot.png"; - } else if (event->key() == Qt::Key_F4 || (event->key() == Qt::Key_4 && devicemode)) { - canvas->dumpItems(); - canvas->checkState(); - } else if (event->key() == Qt::Key_F5 || (event->key() == Qt::Key_5 && devicemode)) { - reload(); - } else if (event->key() == Qt::Key_F6 || (event->key() == Qt::Key_6 && devicemode)) { - canvas->dumpRoot(); - } else if (event->key() == Qt::Key_F7 || (event->key() == Qt::Key_7 && devicemode)) { - canvas->dumpTiming(); - } else if (event->key() == Qt::Key_F8 || (event->key() == Qt::Key_8 && devicemode)) { - QPerformanceLog::displayData(); - QPerformanceLog::clear(); - } else if (event->key() == Qt::Key_F9) { - if(testEngine) testEngine->save(); - } else if (event->key() == Qt::Key_F10) { - if(testEngine) testEngine->captureFullFrame(); - } - - QWidget::keyPressEvent(event); -} - -void QFxViewer::setRecording(bool on) -{ - if (on == recordTimer.isActive()) - return; - - if (on) { - recordTimer.start(record_period,this); - } else { - recordTimer.stop(); - int frame=0; - QStringList inputs; - qDebug() << "Saving frames..."; - - foreach (QImage* img, frames) { - QString name; - name.sprintf("tmp-frame%04d.png",frame++); - if (record_dither=="ordered") - img->convertToFormat(QImage::Format_Indexed8,Qt::PreferDither|Qt::OrderedDither).save(name); - else if (record_dither=="threshold") - img->convertToFormat(QImage::Format_Indexed8,Qt::PreferDither|Qt::ThresholdDither).save(name); - else if (record_dither=="floyd") - img->convertToFormat(QImage::Format_Indexed8,Qt::PreferDither).save(name); - else - img->convertToFormat(QImage::Format_Indexed8).save(name); - inputs << name; - delete img; - } - QString output="animation.gif"; - - QStringList args; - - args << "-delay" << QString::number(record_period/10); - args << inputs; - args << output; - qDebug() << "Converting..." << output; - if (0!=QProcess::execute("convert", args)) { - qWarning() << "Cannot run ImageMagick 'convert' - not converted to gif"; - inputs.clear(); // don't remove them - qDebug() << "Wrote frames tmp-frame*.png"; - } else { - qDebug() << "Compressing..." << output; - if (0!=QProcess::execute("gifsicle", QStringList() << "-O2" << "-o" << output << output)) - qWarning() << "Cannot run 'gifsicle' - not compressed"; - qDebug() << "Wrote" << output; - } - - foreach (QString name, inputs) - QFile::remove(name); - - frames.clear(); - } - qDebug() << "Recording: " << (recordTimer.isActive()?"ON":"OFF"); -} - -void QFxViewer::timerEvent(QTimerEvent *event) -{ - if (event->timerId() == recordTimer.timerId()) { - frames.append(new QImage(canvas->asImage())); - if (record_autotime && autoTimer.elapsed() >= record_autotime) - setRecording(false); - } else if (event->timerId() == autoStartTimer.timerId()) { - autoTimer.start(); - autoStartTimer.stop(); - setRecording(true); - } else { - QWidget::timerEvent(event); - } -} - -void QFxViewer::setDeviceKeys(bool on) -{ - devicemode = on; -} - -void QFxViewer::setCacheEnabled(bool on) -{ - QNetworkAccessManager * nam = canvas->engine()->networkAccessManager(); - if (on == !!nam->cache()) - return; - if (on) { - // Setup a caching network manager - QNetworkDiskCache *cache = new QNetworkDiskCache; - cache->setCacheDirectory(QDir::tempPath()+QLatin1String("/qml-duiviewer-network-cache")); - cache->setMaximumCacheSize(8000000); - nam->setCache(cache); - } else { - nam->setCache(0); - } -} - -#include "qfxviewer.moc" diff --git a/tools/duiviewer/qfxviewer.h b/tools/duiviewer/qfxviewer.h deleted file mode 100644 index 7a190c5..0000000 --- a/tools/duiviewer/qfxviewer.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1992-$THISYEAR$ $TROLLTECH$. All rights reserved. -** -** This file is part of the $MODULE$ of the Qt Toolkit. -** -** $TROLLTECH_DUAL_LICENSE$ -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef QFXVIEWER_H -#define QFXVIEWER_H - -#include -#include -#include -#include -#include - - -class QFxView; -class PreviewDeviceSkin; -class QFxTestEngine; - -class QFxViewer : public QWidget -{ -Q_OBJECT -public: - QFxViewer(QFxTestEngine::TestMode = QFxTestEngine::NoTest, const QString &testDir = QString(), QWidget *parent=0, Qt::WindowFlags flags=0); - - void setRecordDither(const QString& s) { record_dither = s; } - void setRecordPeriod(int ms); - int recordPeriod() const { return record_period; } - void setRecording(bool on); - bool isRecording() const { return recordTimer.isActive(); } - void setAutoRecord(int from, int to); - void setSkin(const QString& skinDirectory); - void setDeviceKeys(bool); - void setCacheEnabled(bool); - -public slots: - void sceneResized(QSize size); - void openXml(const QString& fileName); - void reload(); - -protected: - virtual void keyPressEvent(QKeyEvent *); - virtual void timerEvent(QTimerEvent *); - virtual void resizeEvent(QResizeEvent *); - -private: - QString currentFileName; - PreviewDeviceSkin *skin; - QSize skinscreensize; - QFxView *canvas; - void init(QFxTestEngine::TestMode, const QString &, const QString& fileName); - QBasicTimer recordTimer; - QList frames; - QBasicTimer autoStartTimer; - QTime autoTimer; - QString record_dither; - int record_period; - int record_autotime; - bool devicemode; - - QFxTestEngine *testEngine; -}; - -#endif diff --git a/tools/qmlviewer/main.cpp b/tools/qmlviewer/main.cpp new file mode 100644 index 0000000..c5676ab --- /dev/null +++ b/tools/qmlviewer/main.cpp @@ -0,0 +1,135 @@ +/**************************************************************************** +** +** Copyright (C) 1992-$THISYEAR$ $TROLLTECH$. All rights reserved. +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include "qml.h" +#include "qmlviewer.h" +#include +#include +#include "qfxtestengine.h" +#include + + +void usage() +{ + qWarning("Usage: qmlviewer [options] "); + qWarning(" "); + qWarning(" options:"); + qWarning(" -v, -version ............................. display version"); + qWarning(" -frameless ............................... run with no window frame"); + qWarning(" -skin ...................... run with a skin window frame"); + qWarning(" -recorddither ordered|threshold|floyd .... set dither mode used for recording"); + qWarning(" -recordperiod ............. set time between recording frames"); + qWarning(" -autorecord [from-] ...... set recording to start and stop automatically"); + qWarning(" -devicekeys .............................. use numeric keys (see F1)"); + qWarning(" -cache ................................... enable a disk cache of remote content"); + qWarning(" -recordtest .................. record an autotest"); + qWarning(" -runtest ..................... run a previously recorded test"); + qWarning(" "); + qWarning(" Press F1 for interactive help"); + exit(1); +} + +int main(int argc, char ** argv) +{ + //### default to using raster graphics backend for now + int newargc = argc + 2; + char **newargv; + newargv = new char * [newargc]; + for (int i = 0; i < argc; ++i) { + newargv[i] = argv[i]; + if (!qstrcmp(argv[i], "-graphicssystem")) { + newargc -= 2; + break; + } + } + char system[] = "-graphicssystem"; + newargv[argc] = system; + char raster[] = "raster"; + newargv[argc+1] = raster; + + + QApplication app(newargc, newargv); + app.setApplicationName("viewer"); + + bool frameless = false; + QString fileName; + int period = 0; + int autorecord_from = 0; + int autorecord_to = 0; + QString dither = "threshold"; + QString skin; + bool devkeys = false; + bool cache = false; + QFxTestEngine::TestMode testMode = QFxTestEngine::NoTest; + QString testDir; + + for (int i = 1; i < newargc; ++i) { + QString arg = newargv[i]; + if (arg == "-frameless") { + frameless = true; + } else if (arg == "-skin") { + skin = QString(argv[++i]); + } else if (arg == "-cache") { + cache = true; + } else if (arg == "-recordperiod") { + period = QString(argv[++i]).toInt(); + } else if (arg == "-autorecord") { + QString range = QString(argv[++i]); + int dash = range.indexOf('-'); + if (dash > 0) + autorecord_from = range.left(dash).toInt(); + autorecord_to = range.mid(dash+1).toInt(); + } else if (arg == "-devicekeys") { + devkeys = true; + } else if (arg == "-recordtest") { + testMode = QFxTestEngine::RecordTest; + if(i + 1 >= newargc) + usage(); + testDir = newargv[i + 1]; + ++i; + } else if (arg == "-runtest") { + testMode = QFxTestEngine::PlaybackTest; + if(i + 1 >= newargc) + usage(); + testDir = newargv[i + 1]; + ++i; + } else if (arg == QLatin1String("-v") || arg == QLatin1String("-version")) { + fprintf(stderr, "Qt Declarative UI Viewer version %s\n", QT_VERSION_STR); + return 0; + } else if (arg[0] != '-') { + fileName = arg; + } else if (1 || arg == "-help") { + usage(); + } + } + + if (fileName.isEmpty()) + usage(); + + QmlViewer viewer(testMode, testDir, 0, frameless ? Qt::FramelessWindowHint : Qt::Widget); + viewer.setCacheEnabled(cache); + viewer.openQml(fileName); + if (period>0) + viewer.setRecordPeriod(period); + if (autorecord_to) + viewer.setAutoRecord(autorecord_from,autorecord_to); + if (QDir(skin).exists()) + viewer.setSkin(skin); + if (devkeys) + viewer.setDeviceKeys(true); + viewer.setRecordDither(dither); + viewer.show(); + + return app.exec(); +} + diff --git a/tools/qmlviewer/qmlviewer.cpp b/tools/qmlviewer/qmlviewer.cpp new file mode 100644 index 0000000..87bebfa --- /dev/null +++ b/tools/qmlviewer/qmlviewer.cpp @@ -0,0 +1,366 @@ +/**************************************************************************** +** +** Copyright (C) 1992-$THISYEAR$ $TROLLTECH$. All rights reserved. +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include + +#include "qmlbindablevalue.h" +#include "qmlviewer.h" +#include +#include +#include "qml.h" +#include "qperformancelog.h" +#include "qfxtestengine.h" +#include "deviceskin.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QmlViewer::QmlViewer(QFxTestEngine::TestMode testMode, const QString &testDir, QWidget *parent, Qt::WindowFlags flags) + : QWidget(parent, flags) +{ + testEngine = 0; + devicemode = false; + skin = 0; + canvas = 0; + record_autotime = 0; + record_period = 20; + + int width=240; + int height=320; + setAttribute(Qt::WA_OpaquePaintEvent); + setAttribute(Qt::WA_NoSystemBackground); + + canvas = new QFxView(this); + if(testMode != QFxTestEngine::NoTest) + testEngine = new QFxTestEngine(testMode, testDir, canvas, this); + + QObject::connect(canvas, SIGNAL(sceneResized(QSize)), this, SLOT(sceneResized(QSize))); + canvas->setFixedSize(width, height); + resize(width, height); +} + +void QmlViewer::reload() +{ + openQml(currentFileName); +} + +void QmlViewer::openQml(const QString& fileName) +{ + setWindowTitle(tr("%1 - Qt Declarative UI Viewer").arg(fileName)); + + canvas->reset(); + + currentFileName = fileName; + QUrl url(fileName); + QFileInfo fi(fileName); + if (fi.exists()) { + url = QUrl::fromLocalFile(fi.absoluteFilePath()); + QmlContext *ctxt = canvas->rootContext(); + QDir dir(fi.path()+"/dummydata", "*.qml"); + 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(); + QmlComponent comp(canvas->engine()); + comp.setData(data, QUrl()); + QObject *dummyData = comp.create(); + if (dummyData) { + qWarning() << "Loaded dummy data:" << dir.filePath(qml); + qml.truncate(qml.length()-4); + ctxt->setContextProperty(qml, dummyData); + dummyData->setParent(this); + } + } + } + + canvas->setUrl(url); + + QTime t; + t.start(); + canvas->execute(); + qWarning() << "Wall startup time:" << t.elapsed(); +#ifdef QTOPIA + show(); +#endif +} + +class PreviewDeviceSkin : public DeviceSkin +{ + Q_OBJECT +public: + explicit PreviewDeviceSkin(const DeviceSkinParameters ¶meters, QWidget *parent); + + void setPreview(QWidget *formWidget); + void setScreenSize(const QSize& size) + { + QMatrix fit; + fit = fit.scale(qreal(size.width())/m_screenSize.width(), + qreal(size.height())/m_screenSize.height()); + setTransform(fit); + } + +private slots: + void slotSkinKeyPressEvent(int code, const QString& text, bool autorep); + void slotSkinKeyReleaseEvent(int code, const QString& text, bool autorep); + void slotPopupMenu(); + +private: + void populateContextMenu(QMenu *menu); + const QSize m_screenSize; +}; + + +PreviewDeviceSkin::PreviewDeviceSkin(const DeviceSkinParameters ¶meters, QWidget *parent) : + DeviceSkin(parameters, parent), + m_screenSize(parameters.screenSize()) +{ + connect(this, SIGNAL(skinKeyPressEvent(int,QString,bool)), + this, SLOT(slotSkinKeyPressEvent(int,QString,bool))); + connect(this, SIGNAL(skinKeyReleaseEvent(int,QString,bool)), + this, SLOT(slotSkinKeyReleaseEvent(int,QString,bool))); + connect(this, SIGNAL(popupMenu()), this, SLOT(slotPopupMenu())); +} + +void PreviewDeviceSkin::setPreview(QWidget *formWidget) +{ + formWidget->setFixedSize(m_screenSize); + formWidget->setParent(this, Qt::SubWindow); + formWidget->setAutoFillBackground(true); + setView(formWidget); +} + +void PreviewDeviceSkin::slotSkinKeyPressEvent(int code, const QString& text, bool autorep) +{ + if (QWidget *focusWidget = QApplication::focusWidget()) { + QKeyEvent e(QEvent::KeyPress,code,0,text,autorep); + QApplication::sendEvent(focusWidget, &e); + } + +} + +void PreviewDeviceSkin::slotSkinKeyReleaseEvent(int code, const QString& text, bool autorep) +{ + if (QWidget *focusWidget = QApplication::focusWidget()) { + QKeyEvent e(QEvent::KeyRelease,code,0,text,autorep); + QApplication::sendEvent(focusWidget, &e); + } +} + +void PreviewDeviceSkin::slotPopupMenu() +{ + QMenu menu(this); + populateContextMenu(&menu); + menu.exec(QCursor::pos()); +} + +void PreviewDeviceSkin::populateContextMenu(QMenu *menu) +{ + connect(menu->addAction(tr("&Close")), SIGNAL(triggered()), parentWidget(), SLOT(close())); +} + + +void QmlViewer::setSkin(const QString& skinDirectory) +{ + DeviceSkinParameters parameters; + QString err; + if (parameters.read(skinDirectory,DeviceSkinParameters::ReadAll,&err)) { + delete skin; + if (!err.isEmpty()) + qWarning() << err; + skin = new PreviewDeviceSkin(parameters,this); + skin->setScreenSize(canvas->size()); + canvas->setParent(skin, Qt::SubWindow); + canvas->setAutoFillBackground(true); + skin->setView(canvas); + delete layout(); + + canvas->show(); + } +} + +void QmlViewer::setAutoRecord(int from, int to) +{ + record_autotime = to-from; + if (from) { + autoStartTimer.start(from,this); + } else { + autoTimer.start(); + setRecording(true); + } +} + +void QmlViewer::setRecordPeriod(int ms) +{ + record_period = ms; +} + +void QmlViewer::sceneResized(QSize size) +{ + if (size.width() > 0 && size.height() > 0) { + canvas->setFixedSize(size.width(), size.height()); + if (skin) + skin->setScreenSize(size); + else + resize(size); + } +} + +void QmlViewer::resizeEvent(QResizeEvent *) +{ + if (!skin) + canvas->setFixedSize(width(),height()); +} + +void QmlViewer::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_0 && devicemode) + exit(0); + else if (event->key() == Qt::Key_F1 || (event->key() == Qt::Key_1 && devicemode)) { + qDebug() << "F1 - help\n" + << "F2 - toggle GIF recording\n" + << "F3 - take PNG snapshot\n" + << "F4 - show items and state\n" + << "F5 - reload XML\n" + << "F6 - show object tree\n" + << "F7 - show timing\n" + << "F8 - show performance (if available)\n" + << "device keys: 0=quit, 1..8=F1..F8" + ; + } else if (event->key() == Qt::Key_F2 || (event->key() == Qt::Key_2 && devicemode)) { + setRecording(!recordTimer.isActive()); + } else if (event->key() == Qt::Key_F3 || (event->key() == Qt::Key_3 && devicemode)) { + canvas->asImage().save("snapshot.png"); + qDebug() << "Wrote snapshot.png"; + } else if (event->key() == Qt::Key_F4 || (event->key() == Qt::Key_4 && devicemode)) { + canvas->dumpItems(); + canvas->checkState(); + } else if (event->key() == Qt::Key_F5 || (event->key() == Qt::Key_5 && devicemode)) { + reload(); + } else if (event->key() == Qt::Key_F6 || (event->key() == Qt::Key_6 && devicemode)) { + canvas->dumpRoot(); + } else if (event->key() == Qt::Key_F7 || (event->key() == Qt::Key_7 && devicemode)) { + canvas->dumpTiming(); + } else if (event->key() == Qt::Key_F8 || (event->key() == Qt::Key_8 && devicemode)) { + QPerformanceLog::displayData(); + QPerformanceLog::clear(); + } else if (event->key() == Qt::Key_F9) { + if(testEngine) testEngine->save(); + } else if (event->key() == Qt::Key_F10) { + if(testEngine) testEngine->captureFullFrame(); + } + + QWidget::keyPressEvent(event); +} + +void QmlViewer::setRecording(bool on) +{ + if (on == recordTimer.isActive()) + return; + + if (on) { + recordTimer.start(record_period,this); + } else { + recordTimer.stop(); + int frame=0; + QStringList inputs; + qDebug() << "Saving frames..."; + + foreach (QImage* img, frames) { + QString name; + name.sprintf("tmp-frame%04d.png",frame++); + if (record_dither=="ordered") + img->convertToFormat(QImage::Format_Indexed8,Qt::PreferDither|Qt::OrderedDither).save(name); + else if (record_dither=="threshold") + img->convertToFormat(QImage::Format_Indexed8,Qt::PreferDither|Qt::ThresholdDither).save(name); + else if (record_dither=="floyd") + img->convertToFormat(QImage::Format_Indexed8,Qt::PreferDither).save(name); + else + img->convertToFormat(QImage::Format_Indexed8).save(name); + inputs << name; + delete img; + } + QString output="animation.gif"; + + QStringList args; + + args << "-delay" << QString::number(record_period/10); + args << inputs; + args << output; + qDebug() << "Converting..." << output; + if (0!=QProcess::execute("convert", args)) { + qWarning() << "Cannot run ImageMagick 'convert' - not converted to gif"; + inputs.clear(); // don't remove them + qDebug() << "Wrote frames tmp-frame*.png"; + } else { + qDebug() << "Compressing..." << output; + if (0!=QProcess::execute("gifsicle", QStringList() << "-O2" << "-o" << output << output)) + qWarning() << "Cannot run 'gifsicle' - not compressed"; + qDebug() << "Wrote" << output; + } + + foreach (QString name, inputs) + QFile::remove(name); + + frames.clear(); + } + qDebug() << "Recording: " << (recordTimer.isActive()?"ON":"OFF"); +} + +void QmlViewer::timerEvent(QTimerEvent *event) +{ + if (event->timerId() == recordTimer.timerId()) { + frames.append(new QImage(canvas->asImage())); + if (record_autotime && autoTimer.elapsed() >= record_autotime) + setRecording(false); + } else if (event->timerId() == autoStartTimer.timerId()) { + autoTimer.start(); + autoStartTimer.stop(); + setRecording(true); + } else { + QWidget::timerEvent(event); + } +} + +void QmlViewer::setDeviceKeys(bool on) +{ + devicemode = on; +} + +void QmlViewer::setCacheEnabled(bool on) +{ + QNetworkAccessManager * nam = canvas->engine()->networkAccessManager(); + if (on == !!nam->cache()) + return; + if (on) { + // Setup a caching network manager + QNetworkDiskCache *cache = new QNetworkDiskCache; + cache->setCacheDirectory(QDir::tempPath()+QLatin1String("/qml-duiviewer-network-cache")); + cache->setMaximumCacheSize(8000000); + nam->setCache(cache); + } else { + nam->setCache(0); + } +} + +#include "qmlviewer.moc" diff --git a/tools/qmlviewer/qmlviewer.h b/tools/qmlviewer/qmlviewer.h new file mode 100644 index 0000000..0fa879d --- /dev/null +++ b/tools/qmlviewer/qmlviewer.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 1992-$THISYEAR$ $TROLLTECH$. All rights reserved. +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef QMLVIEWER_H +#define QMLVIEWER_H + +#include +#include +#include +#include +#include + + +class QFxView; +class PreviewDeviceSkin; +class QFxTestEngine; + +class QmlViewer : public QWidget +{ +Q_OBJECT +public: + QmlViewer(QFxTestEngine::TestMode = QFxTestEngine::NoTest, const QString &testDir = QString(), QWidget *parent=0, Qt::WindowFlags flags=0); + + void setRecordDither(const QString& s) { record_dither = s; } + void setRecordPeriod(int ms); + int recordPeriod() const { return record_period; } + void setRecording(bool on); + bool isRecording() const { return recordTimer.isActive(); } + void setAutoRecord(int from, int to); + void setSkin(const QString& skinDirectory); + void setDeviceKeys(bool); + void setCacheEnabled(bool); + +public slots: + void sceneResized(QSize size); + void openQml(const QString& fileName); + void reload(); + +protected: + virtual void keyPressEvent(QKeyEvent *); + virtual void timerEvent(QTimerEvent *); + virtual void resizeEvent(QResizeEvent *); + +private: + QString currentFileName; + PreviewDeviceSkin *skin; + QSize skinscreensize; + QFxView *canvas; + void init(QFxTestEngine::TestMode, const QString &, const QString& fileName); + QBasicTimer recordTimer; + QList frames; + QBasicTimer autoStartTimer; + QTime autoTimer; + QString record_dither; + int record_period; + int record_autotime; + bool devicemode; + + QFxTestEngine *testEngine; +}; + +#endif diff --git a/tools/qmlviewer/qmlviewer.pro b/tools/qmlviewer/qmlviewer.pro new file mode 100644 index 0000000..08d2d2b --- /dev/null +++ b/tools/qmlviewer/qmlviewer.pro @@ -0,0 +1,12 @@ +DESTDIR = ../../bin +QT += declarative script network sql +# Input +HEADERS += qmlviewer.h +SOURCES += main.cpp qmlviewer.cpp + +include($$QT_SOURCE_TREE/tools/shared/deviceskin/deviceskin.pri) + +target.path=$$[QT_INSTALL_BINS] +INSTALLS += target + +CONFIG += console diff --git a/tools/tools.pro b/tools/tools.pro index 12da18c..2c83580 100644 --- a/tools/tools.pro +++ b/tools/tools.pro @@ -24,7 +24,7 @@ mac { SUBDIRS += kmap2qmap -contains(QT_CONFIG, declarative):SUBDIRS += duiviewer qmlconv +contains(QT_CONFIG, declarative):SUBDIRS += qmlviewer qmlconv contains(QT_CONFIG, dbus):SUBDIRS += qdbus !wince*:contains(QT_CONFIG, xmlpatterns): SUBDIRS += xmlpatterns embedded: SUBDIRS += makeqpf -- cgit v0.12