qquickitem_p.h 29.00 KiB
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the QtQml module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
** 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.
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
** $QT_END_LICENSE$
****************************************************************************/
#ifndef QQUICKITEM_P_H
#define QQUICKITEM_P_H
//  W A R N I N G
//  -------------
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
// We mean it.
#include "qquickitem.h"
#include "qquickanchors_p.h"
#include "qquickanchors_p_p.h"
#include "qquickitemchangelistener_p.h"
#include "qquickcanvas_p.h"
#include <QtQuick/qsgnode.h>
#include "qquickclipnode_p.h"
#include <private/qpodvector_p.h>
#include <QtQuick/private/qquickstate_p.h>
#include <private/qqmlnullablevalue_p_p.h>
#include <private/qqmlnotifier_p.h>
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
#include <private/qqmlglobal_p.h> #include <private/qlazilyallocated_p.h> #include <qqml.h> #include <qqmlcontext.h> #include <QtCore/qlist.h> #include <QtCore/qdebug.h> #include <QtCore/qelapsedtimer.h> #include <QtQuick/private/qquickshadereffectsource_p.h> #include <QtQuick/private/qquickshadereffect_p.h> QT_BEGIN_NAMESPACE class QNetworkReply; class QQuickItemKeyFilter; class QQuickLayoutMirroringAttached; class QQuickScreenAttached; class QQuickContents : public QQuickItemChangeListener { public: QQuickContents(QQuickItem *item); ~QQuickContents(); QRectF rectF() const { return QRectF(m_x, m_y, m_width, m_height); } inline void calcGeometry(QQuickItem *changed = 0); void complete(); protected: void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry); void itemDestroyed(QQuickItem *item); void itemChildAdded(QQuickItem *, QQuickItem *); void itemChildRemoved(QQuickItem *, QQuickItem *); //void itemVisibilityChanged(QQuickItem *item) private: bool calcHeight(QQuickItem *changed = 0); bool calcWidth(QQuickItem *changed = 0); void updateRect(); QQuickItem *m_item; qreal m_x; qreal m_y; qreal m_width; qreal m_height; }; void QQuickContents::calcGeometry(QQuickItem *changed) { bool wChanged = calcWidth(changed); bool hChanged = calcHeight(changed); if (wChanged || hChanged) updateRect(); } class QQuickTransformPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QQuickTransform); public: static QQuickTransformPrivate* get(QQuickTransform *transform) { return transform->d_func(); } QQuickTransformPrivate(); QList<QQuickItem *> items; };
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
class QQuickItemLayer : public QObject, public QQuickItemChangeListener { Q_OBJECT Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) Q_PROPERTY(QSize textureSize READ size WRITE setSize NOTIFY sizeChanged) Q_PROPERTY(QRectF sourceRect READ sourceRect WRITE setSourceRect NOTIFY sourceRectChanged) Q_PROPERTY(bool mipmap READ mipmap WRITE setMipmap NOTIFY mipmapChanged) Q_PROPERTY(bool smooth READ smooth WRITE setSmooth NOTIFY smoothChanged) Q_PROPERTY(QQuickShaderEffectSource::WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged) Q_PROPERTY(QQuickShaderEffectSource::Format format READ format WRITE setFormat NOTIFY formatChanged) Q_PROPERTY(QByteArray samplerName READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QQmlComponent *effect READ effect WRITE setEffect NOTIFY effectChanged) public: QQuickItemLayer(QQuickItem *item); ~QQuickItemLayer(); void classBegin(); void componentComplete(); bool enabled() const { return m_enabled; } void setEnabled(bool enabled); bool mipmap() const { return m_mipmap; } void setMipmap(bool mipmap); bool smooth() const { return m_smooth; } void setSmooth(bool s); QSize size() const { return m_size; } void setSize(const QSize &size); QQuickShaderEffectSource::Format format() const { return m_format; } void setFormat(QQuickShaderEffectSource::Format f); QRectF sourceRect() const { return m_sourceRect; } void setSourceRect(const QRectF &sourceRect); QQuickShaderEffectSource::WrapMode wrapMode() const { return m_wrapMode; } void setWrapMode(QQuickShaderEffectSource::WrapMode mode); QByteArray name() const { return m_name; } void setName(const QByteArray &name); QQmlComponent *effect() const { return m_effectComponent; } void setEffect(QQmlComponent *effect); QQuickShaderEffectSource *effectSource() const { return m_effectSource; } void itemGeometryChanged(QQuickItem *, const QRectF &, const QRectF &); void itemOpacityChanged(QQuickItem *); void itemParentChanged(QQuickItem *, QQuickItem *); void itemSiblingOrderChanged(QQuickItem *); void itemVisibilityChanged(QQuickItem *); void updateMatrix(); void updateGeometry(); void updateOpacity(); void updateZ(); signals: void enabledChanged(bool enabled); void sizeChanged(const QSize &size); void mipmapChanged(bool mipmap); void wrapModeChanged(QQuickShaderEffectSource::WrapMode mode); void nameChanged(const QByteArray &name); void effectChanged(QQmlComponent *component); void smoothChanged(bool smooth); void formatChanged(QQuickShaderEffectSource::Format format); void sourceRectChanged(const QRectF &sourceRect);
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
private: void activate(); void deactivate(); void activateEffect(); void deactivateEffect(); QQuickItem *m_item; bool m_enabled; bool m_mipmap; bool m_smooth; bool m_componentComplete; QQuickShaderEffectSource::WrapMode m_wrapMode; QQuickShaderEffectSource::Format m_format; QSize m_size; QRectF m_sourceRect; QByteArray m_name; QQmlComponent *m_effectComponent; QQuickItem *m_effect; QQuickShaderEffectSource *m_effectSource; }; class Q_QUICK_EXPORT QQuickItemPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QQuickItem) public: static QQuickItemPrivate* get(QQuickItem *item) { return item->d_func(); } static const QQuickItemPrivate* get(const QQuickItem *item) { return item->d_func(); } static void registerAccessorProperties(); QQuickItemPrivate(); ~QQuickItemPrivate(); void init(QQuickItem *parent); QQmlListProperty<QObject> data(); QQmlListProperty<QObject> resources(); QQmlListProperty<QQuickItem> children(); QQmlListProperty<QQuickItem> visibleChildren(); QQmlListProperty<QQuickState> states(); QQmlListProperty<QQuickTransition> transitions(); QString state() const; void setState(const QString &); QQuickAnchorLine left() const; QQuickAnchorLine right() const; QQuickAnchorLine horizontalCenter() const; QQuickAnchorLine top() const; QQuickAnchorLine bottom() const; QQuickAnchorLine verticalCenter() const; QQuickAnchorLine baseline() const; QQuickItemLayer *layer() const; // data property static void data_append(QQmlListProperty<QObject> *, QObject *); static int data_count(QQmlListProperty<QObject> *); static QObject *data_at(QQmlListProperty<QObject> *, int); static void data_clear(QQmlListProperty<QObject> *); // resources property static QObject *resources_at(QQmlListProperty<QObject> *, int); static void resources_append(QQmlListProperty<QObject> *, QObject *); static int resources_count(QQmlListProperty<QObject> *); static void resources_clear(QQmlListProperty<QObject> *); // children property static void children_append(QQmlListProperty<QQuickItem> *, QQuickItem *);
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
static int children_count(QQmlListProperty<QQuickItem> *); static QQuickItem *children_at(QQmlListProperty<QQuickItem> *, int); static void children_clear(QQmlListProperty<QQuickItem> *); // visibleChildren property static void visibleChildren_append(QQmlListProperty<QQuickItem> *prop, QQuickItem *o); static int visibleChildren_count(QQmlListProperty<QQuickItem> *prop); static QQuickItem *visibleChildren_at(QQmlListProperty<QQuickItem> *prop, int index); // transform property static int transform_count(QQmlListProperty<QQuickTransform> *list); static void transform_append(QQmlListProperty<QQuickTransform> *list, QQuickTransform *); static QQuickTransform *transform_at(QQmlListProperty<QQuickTransform> *list, int); static void transform_clear(QQmlListProperty<QQuickTransform> *list); enum ChangeType { Geometry = 0x01, SiblingOrder = 0x02, Visibility = 0x04, Opacity = 0x08, Destroyed = 0x10, Parent = 0x20, Children = 0x40, Rotation = 0x80, }; Q_DECLARE_FLAGS(ChangeTypes, ChangeType) enum GeometryChangeType { NoChange = 0, XChange = 0x01, YChange = 0x02, WidthChange = 0x04, HeightChange = 0x08, SizeChange = WidthChange | HeightChange, GeometryChange = XChange | YChange | SizeChange }; Q_DECLARE_FLAGS(GeometryChangeTypes, GeometryChangeType) struct ChangeListener { ChangeListener(QQuickItemChangeListener *l, QQuickItemPrivate::ChangeTypes t) : listener(l), types(t), gTypes(GeometryChange) {} ChangeListener(QQuickItemChangeListener *l, QQuickItemPrivate::GeometryChangeTypes gt) : listener(l), types(Geometry), gTypes(gt) {} QQuickItemChangeListener *listener; QQuickItemPrivate::ChangeTypes types; QQuickItemPrivate::GeometryChangeTypes gTypes; //NOTE: not used for == bool operator==(const ChangeListener &other) const { return listener == other.listener && types == other.types; } }; struct ExtraData { ExtraData(); qreal z; qreal scale; qreal rotation; qreal opacity; QQuickContents *contents; QQuickScreenAttached *screenAttached; QQuickLayoutMirroringAttached* layoutDirectionAttached; QQuickItemKeyFilter *keyHandler; mutable QQuickItemLayer *layer; QPointF userTransformOriginPoint; int effectRefCount; int hideRefCount; QSGOpacityNode *opacityNode; QQuickDefaultClipNode *clipNode; QSGRootNode *rootNode;
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
QSGNode *beforePaintNode; // Although acceptedMouseButtons is inside ExtraData, we actually store // the LeftButton flag in the extra.flag() bit. This is because it is // extremely common to set acceptedMouseButtons to LeftButton, but very // rare to use any of the other buttons. Qt::MouseButtons acceptedMouseButtons; QQuickItem::TransformOrigin origin:5; }; QLazilyAllocated<ExtraData> extra; QQuickAnchors *anchors() const; mutable QQuickAnchors *_anchors; inline Qt::MouseButtons acceptedMouseButtons() const; QPODVector<QQuickItemPrivate::ChangeListener,4> changeListeners; void addItemChangeListener(QQuickItemChangeListener *listener, ChangeTypes types); void removeItemChangeListener(QQuickItemChangeListener *, ChangeTypes types); void updateOrAddGeometryChangeListener(QQuickItemChangeListener *listener, GeometryChangeTypes types); void updateOrRemoveGeometryChangeListener(QQuickItemChangeListener *listener, GeometryChangeTypes types); QQuickStateGroup *_states(); QQuickStateGroup *_stateGroup; inline QQuickItem::TransformOrigin origin() const; // Bit 0 quint32 flags:5; bool widthValid:1; bool heightValid:1; bool baselineOffsetValid:1; bool componentComplete:1; bool keepMouse:1; bool keepTouch:1; bool hoverEnabled:1; bool smooth:1; bool focus:1; bool activeFocus:1; bool notifiedFocus:1; // Bit 16 bool notifiedActiveFocus:1; bool filtersChildMouseEvents:1; bool explicitVisible:1; bool effectiveVisible:1; bool explicitEnable:1; bool effectiveEnable:1; bool polishScheduled:1; bool inheritedLayoutMirror:1; bool effectiveLayoutMirror:1; bool isMirrorImplicit:1; bool inheritMirrorFromParent:1; bool inheritMirrorFromItem:1; bool childrenDoNotOverlap:1; bool staticSubtreeGeometry:1; bool isAccessible:1; // bool dummy:1 // Bit 32 enum DirtyType { TransformOrigin = 0x00000001, Transform = 0x00000002, BasicTransform = 0x00000004, Position = 0x00000008, Size = 0x00000010, ZValue = 0x00000020, Content = 0x00000040,
421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
Smooth = 0x00000080, OpacityValue = 0x00000100, ChildrenChanged = 0x00000200, ChildrenStackingChanged = 0x00000400, ParentChanged = 0x00000800, Clip = 0x00001000, Canvas = 0x00002000, EffectReference = 0x00008000, Visible = 0x00010000, HideReference = 0x00020000, PerformanceHints = 0x00040000, // When you add an attribute here, don't forget to update // dirtyToString() TransformUpdateMask = TransformOrigin | Transform | BasicTransform | Position | Size | Canvas, ComplexTransformUpdateMask = Transform | Canvas, ContentUpdateMask = Size | Content | Smooth | Canvas, ChildrenUpdateMask = ChildrenChanged | ChildrenStackingChanged | EffectReference | Canvas }; quint32 dirtyAttributes; QString dirtyToString() const; void dirty(DirtyType); void addToDirtyList(); void removeFromDirtyList(); QQuickItem *nextDirtyItem; QQuickItem**prevDirtyItem; QQuickCanvas *canvas; inline QSGContext *sceneGraphContext() const; QQuickItem *parentItem; QQmlNotifier parentNotifier; QList<QQuickItem *> childItems; mutable QList<QQuickItem *> *sortedChildItems; QList<QQuickItem *> paintOrderChildItems() const; void addChild(QQuickItem *); void removeChild(QQuickItem *); void siblingOrderChanged(); inline void markSortedChildrenDirty(QQuickItem *child); class InitializationState { public: QQuickItem *getFocusScope(QQuickItem *item); void clear(); void clear(QQuickItem *focusScope); private: QQuickItem *focusScope; }; void initCanvas(InitializationState *, QQuickCanvas *); QQuickItem *subFocusItem; QTransform canvasToItemTransform() const; QTransform itemToCanvasTransform() const; void itemToParentTransform(QTransform &) const; qreal x; qreal y; qreal width; qreal height; qreal implicitWidth; qreal implicitHeight; qreal baselineOffset;
491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
QList<QQuickTransform *> transforms; inline qreal z() const { return extra.isAllocated()?extra->z:0; } inline qreal scale() const { return extra.isAllocated()?extra->scale:1; } inline qreal rotation() const { return extra.isAllocated()?extra->rotation:0; } inline qreal opacity() const { return extra.isAllocated()?extra->opacity:1; } void setAccessibleFlagAndListener(); virtual qreal getImplicitWidth() const; virtual qreal getImplicitHeight() const; virtual void implicitWidthChanged(); virtual void implicitHeightChanged(); void resolveLayoutMirror(); void setImplicitLayoutMirror(bool mirror, bool inherit); void setLayoutMirror(bool mirror); bool isMirrored() const { return effectiveLayoutMirror; } void emitChildrenRectChanged(const QRectF &rect) { Q_Q(QQuickItem); emit q->childrenRectChanged(rect); } QPointF computeTransformOrigin() const; virtual void transformChanged(); void deliverKeyEvent(QKeyEvent *); void deliverInputMethodEvent(QInputMethodEvent *); void deliverFocusEvent(QFocusEvent *); void deliverMouseEvent(QMouseEvent *); void deliverWheelEvent(QWheelEvent *); void deliverTouchEvent(QTouchEvent *); void deliverHoverEvent(QHoverEvent *); void deliverDragEvent(QEvent *); bool calcEffectiveVisible() const; bool setEffectiveVisibleRecur(bool); bool calcEffectiveEnable() const; void setEffectiveEnableRecur(QQuickItem *scope, bool); inline QSGTransformNode *itemNode(); inline QSGNode *childContainerNode(); /* QSGNode order is: - itemNode - (opacityNode) - (clipNode) - (effectNode) - groupNode */ QSGOpacityNode *opacityNode() const { return extra.isAllocated()?extra->opacityNode:0; } QQuickDefaultClipNode *clipNode() const { return extra.isAllocated()?extra->clipNode:0; } QSGRootNode *rootNode() const { return extra.isAllocated()?extra->rootNode:0; } QSGTransformNode *itemNodeInstance; QSGNode *groupNode; QSGNode *paintNode; virtual QSGTransformNode *createTransformNode(); // A reference from an effect item means that this item is used by the effect, so // it should insert a root node. void refFromEffectItem(bool hide);
561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
void derefFromEffectItem(bool unhide); void itemChange(QQuickItem::ItemChange, const QQuickItem::ItemChangeData &); virtual void mirrorChange() {} static qint64 consistentTime; static void setConsistentTime(qint64 t); static void start(QElapsedTimer &); static qint64 elapsed(QElapsedTimer &); static qint64 restart(QElapsedTimer &); }; /* Key filters can be installed on a QQuickItem, but not removed. Currently they are only used by attached objects (which are only destroyed on Item destruction), so this isn't a problem. If in future this becomes any form of public API, they will have to support removal too. */ class QQuickItemKeyFilter { public: QQuickItemKeyFilter(QQuickItem * = 0); virtual ~QQuickItemKeyFilter(); virtual void keyPressed(QKeyEvent *event, bool post); virtual void keyReleased(QKeyEvent *event, bool post); virtual void inputMethodEvent(QInputMethodEvent *event, bool post); virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const; virtual void componentComplete(); bool m_processPost; private: QQuickItemKeyFilter *m_next; }; class QQuickKeyNavigationAttachedPrivate : public QObjectPrivate { public: QQuickKeyNavigationAttachedPrivate() : QObjectPrivate(), left(0), right(0), up(0), down(0), tab(0), backtab(0), leftSet(false), rightSet(false), upSet(false), downSet(false), tabSet(false), backtabSet(false) {} QQuickItem *left; QQuickItem *right; QQuickItem *up; QQuickItem *down; QQuickItem *tab; QQuickItem *backtab; bool leftSet : 1; bool rightSet : 1; bool upSet : 1; bool downSet : 1; bool tabSet : 1; bool backtabSet : 1; }; class QQuickKeyNavigationAttached : public QObject, public QQuickItemKeyFilter { Q_OBJECT Q_DECLARE_PRIVATE(QQuickKeyNavigationAttached) Q_PROPERTY(QQuickItem *left READ left WRITE setLeft NOTIFY leftChanged) Q_PROPERTY(QQuickItem *right READ right WRITE setRight NOTIFY rightChanged) Q_PROPERTY(QQuickItem *up READ up WRITE setUp NOTIFY upChanged) Q_PROPERTY(QQuickItem *down READ down WRITE setDown NOTIFY downChanged) Q_PROPERTY(QQuickItem *tab READ tab WRITE setTab NOTIFY tabChanged)
631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
Q_PROPERTY(QQuickItem *backtab READ backtab WRITE setBacktab NOTIFY backtabChanged) Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged) Q_ENUMS(Priority) public: QQuickKeyNavigationAttached(QObject * = 0); QQuickItem *left() const; void setLeft(QQuickItem *); QQuickItem *right() const; void setRight(QQuickItem *); QQuickItem *up() const; void setUp(QQuickItem *); QQuickItem *down() const; void setDown(QQuickItem *); QQuickItem *tab() const; void setTab(QQuickItem *); QQuickItem *backtab() const; void setBacktab(QQuickItem *); enum Priority { BeforeItem, AfterItem }; Priority priority() const; void setPriority(Priority); static QQuickKeyNavigationAttached *qmlAttachedProperties(QObject *); Q_SIGNALS: void leftChanged(); void rightChanged(); void upChanged(); void downChanged(); void tabChanged(); void backtabChanged(); void priorityChanged(); private: virtual void keyPressed(QKeyEvent *event, bool post); virtual void keyReleased(QKeyEvent *event, bool post); void setFocusNavigation(QQuickItem *currentItem, const char *dir); }; class QQuickLayoutMirroringAttached : public QObject { Q_OBJECT Q_PROPERTY(bool enabled READ enabled WRITE setEnabled RESET resetEnabled NOTIFY enabledChanged) Q_PROPERTY(bool childrenInherit READ childrenInherit WRITE setChildrenInherit NOTIFY childrenInheritChanged) public: explicit QQuickLayoutMirroringAttached(QObject *parent = 0); bool enabled() const; void setEnabled(bool); void resetEnabled(); bool childrenInherit() const; void setChildrenInherit(bool); static QQuickLayoutMirroringAttached *qmlAttachedProperties(QObject *); Q_SIGNALS: void enabledChanged(); void childrenInheritChanged(); private: friend class QQuickItemPrivate; QQuickItemPrivate *itemPrivate; }; class QQuickKeysAttachedPrivate : public QObjectPrivate { public:
701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
QQuickKeysAttachedPrivate() : QObjectPrivate(), inPress(false), inRelease(false) , inIM(false), enabled(true), imeItem(0), item(0) {} bool isConnected(const char *signalName); //loop detection bool inPress:1; bool inRelease:1; bool inIM:1; bool enabled : 1; QQuickItem *imeItem; QList<QQuickItem *> targets; QQuickItem *item; }; class QQuickKeysAttached : public QObject, public QQuickItemKeyFilter { Q_OBJECT Q_DECLARE_PRIVATE(QQuickKeysAttached) Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) Q_PROPERTY(QQmlListProperty<QQuickItem> forwardTo READ forwardTo) Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged) Q_ENUMS(Priority) public: QQuickKeysAttached(QObject *parent=0); ~QQuickKeysAttached(); bool enabled() const { Q_D(const QQuickKeysAttached); return d->enabled; } void setEnabled(bool enabled) { Q_D(QQuickKeysAttached); if (enabled != d->enabled) { d->enabled = enabled; emit enabledChanged(); } } enum Priority { BeforeItem, AfterItem}; Priority priority() const; void setPriority(Priority); QQmlListProperty<QQuickItem> forwardTo() { Q_D(QQuickKeysAttached); return QQmlListProperty<QQuickItem>(this, d->targets); } virtual void componentComplete(); static QQuickKeysAttached *qmlAttachedProperties(QObject *); Q_SIGNALS: void enabledChanged(); void priorityChanged(); void pressed(QQuickKeyEvent *event); void released(QQuickKeyEvent *event); void digit0Pressed(QQuickKeyEvent *event); void digit1Pressed(QQuickKeyEvent *event); void digit2Pressed(QQuickKeyEvent *event); void digit3Pressed(QQuickKeyEvent *event); void digit4Pressed(QQuickKeyEvent *event); void digit5Pressed(QQuickKeyEvent *event); void digit6Pressed(QQuickKeyEvent *event); void digit7Pressed(QQuickKeyEvent *event); void digit8Pressed(QQuickKeyEvent *event);
771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
void digit9Pressed(QQuickKeyEvent *event); void leftPressed(QQuickKeyEvent *event); void rightPressed(QQuickKeyEvent *event); void upPressed(QQuickKeyEvent *event); void downPressed(QQuickKeyEvent *event); void tabPressed(QQuickKeyEvent *event); void backtabPressed(QQuickKeyEvent *event); void asteriskPressed(QQuickKeyEvent *event); void numberSignPressed(QQuickKeyEvent *event); void escapePressed(QQuickKeyEvent *event); void returnPressed(QQuickKeyEvent *event); void enterPressed(QQuickKeyEvent *event); void deletePressed(QQuickKeyEvent *event); void spacePressed(QQuickKeyEvent *event); void backPressed(QQuickKeyEvent *event); void cancelPressed(QQuickKeyEvent *event); void selectPressed(QQuickKeyEvent *event); void yesPressed(QQuickKeyEvent *event); void noPressed(QQuickKeyEvent *event); void context1Pressed(QQuickKeyEvent *event); void context2Pressed(QQuickKeyEvent *event); void context3Pressed(QQuickKeyEvent *event); void context4Pressed(QQuickKeyEvent *event); void callPressed(QQuickKeyEvent *event); void hangupPressed(QQuickKeyEvent *event); void flipPressed(QQuickKeyEvent *event); void menuPressed(QQuickKeyEvent *event); void volumeUpPressed(QQuickKeyEvent *event); void volumeDownPressed(QQuickKeyEvent *event); private: virtual void keyPressed(QKeyEvent *event, bool post); virtual void keyReleased(QKeyEvent *event, bool post); virtual void inputMethodEvent(QInputMethodEvent *, bool post); virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const; const QByteArray keyToSignal(int key) { QByteArray keySignal; if (key >= Qt::Key_0 && key <= Qt::Key_9) { keySignal = "digit0Pressed"; keySignal[5] = '0' + (key - Qt::Key_0); } else { int i = 0; while (sigMap[i].key && sigMap[i].key != key) ++i; keySignal = sigMap[i].sig; } return keySignal; } struct SigMap { int key; const char *sig; }; static const SigMap sigMap[]; }; Qt::MouseButtons QQuickItemPrivate::acceptedMouseButtons() const { return ((extra.flag() ? Qt::LeftButton : Qt::MouseButton(0)) | (extra.isAllocated() ? extra->acceptedMouseButtons : Qt::MouseButtons(0))); } QSGContext *QQuickItemPrivate::sceneGraphContext() const { Q_ASSERT(canvas); return static_cast<QQuickCanvasPrivate *>(QObjectPrivate::get(canvas))->context;
841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906
} void QQuickItemPrivate::markSortedChildrenDirty(QQuickItem *child) { // If sortedChildItems == &childItems then all in childItems have z == 0 // and we don't need to invalidate if the changed item also has z == 0. if (child->z() != 0. || sortedChildItems != &childItems) { if (sortedChildItems != &childItems) delete sortedChildItems; sortedChildItems = 0; } } QQuickItem::TransformOrigin QQuickItemPrivate::origin() const { return extra.isAllocated()?extra->origin:QQuickItem::Center; } QSGTransformNode *QQuickItemPrivate::itemNode() { if (!itemNodeInstance) { itemNodeInstance = createTransformNode(); itemNodeInstance->setFlag(QSGNode::OwnedByParent, false); #ifdef QML_RUNTIME_TESTING Q_Q(QQuickItem); itemNodeInstance->description = QString::fromLatin1("QQuickItem(%1)").arg(QString::fromLatin1(q->metaObject()->className())); #endif } return itemNodeInstance; } QSGNode *QQuickItemPrivate::childContainerNode() { if (!groupNode) { groupNode = new QSGNode(); if (rootNode()) rootNode()->appendChildNode(groupNode); else if (clipNode()) clipNode()->appendChildNode(groupNode); else if (opacityNode()) opacityNode()->appendChildNode(groupNode); else itemNode()->appendChildNode(groupNode); groupNode->setFlag(QSGNode::ChildrenDoNotOverlap, childrenDoNotOverlap); groupNode->setFlag(QSGNode::StaticSubtreeGeometry, staticSubtreeGeometry); #ifdef QML_RUNTIME_TESTING groupNode->description = QLatin1String("group"); #endif } return groupNode; } Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickItemPrivate::ChangeTypes); QT_END_NAMESPACE QML_DECLARE_TYPE(QQuickItemLayer) QML_DECLARE_TYPE(QQuickKeysAttached) QML_DECLARE_TYPEINFO(QQuickKeysAttached, QML_HAS_ATTACHED_PROPERTIES) QML_DECLARE_TYPE(QQuickKeyNavigationAttached) QML_DECLARE_TYPEINFO(QQuickKeyNavigationAttached, QML_HAS_ATTACHED_PROPERTIES) QML_DECLARE_TYPE(QQuickLayoutMirroringAttached) QML_DECLARE_TYPEINFO(QQuickLayoutMirroringAttached, QML_HAS_ATTACHED_PROPERTIES) #endif // QQUICKITEM_P_H