diff options
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/accessible/qaccessiblequickitem.cpp | 22 | ||||
-rw-r--r-- | src/quick/accessible/qaccessiblequickitem_p.h | 5 | ||||
-rw-r--r-- | src/quick/doc/src/concepts/convenience/topic.qdoc | 13 | ||||
-rw-r--r-- | src/quick/items/context2d/qquickcontext2d.cpp | 6 | ||||
-rw-r--r-- | src/quick/items/qquickimage.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquickimage_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquickitem.cpp | 8 | ||||
-rw-r--r-- | src/quick/items/qquickitemsmodule.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextcontrol.cpp | 7 | ||||
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 10 | ||||
-rw-r--r-- | src/quick/items/qquickwindowmodule.cpp | 1 | ||||
-rw-r--r-- | src/quick/util/qquickanimatorcontroller.cpp | 42 | ||||
-rw-r--r-- | src/quick/util/qquickanimatorcontroller_p.h | 4 | ||||
-rw-r--r-- | src/quick/util/qquickanimatorjob.cpp | 26 | ||||
-rw-r--r-- | src/quick/util/qquickanimatorjob_p.h | 4 |
15 files changed, 126 insertions, 28 deletions
diff --git a/src/quick/accessible/qaccessiblequickitem.cpp b/src/quick/accessible/qaccessiblequickitem.cpp index bc2b4de86a..c8b2d9ec3e 100644 --- a/src/quick/accessible/qaccessiblequickitem.cpp +++ b/src/quick/accessible/qaccessiblequickitem.cpp @@ -193,6 +193,28 @@ bool QAccessibleQuickItem::isAccessible() const return item()->d_func()->isAccessible; } +QStringList QAccessibleQuickItem::actionNames() const +{ + QStringList actions = QQmlAccessible::actionNames(); + if (state().focusable) + actions.append(QAccessibleActionInterface::setFocusAction()); + return actions; +} + +void QAccessibleQuickItem::doAction(const QString &actionName) +{ + if (actionName == QAccessibleActionInterface::setFocusAction()) { + item()->forceActiveFocus(); + } else { + QQmlAccessible::doAction(actionName); + } +} + +QStringList QAccessibleQuickItem::keyBindingsForAction(const QString &actionName) const +{ + return QQmlAccessible::keyBindingsForAction(actionName); +} + QString QAccessibleQuickItem::text(QAccessible::Text textType) const { // handles generic behavior not specific to an item diff --git a/src/quick/accessible/qaccessiblequickitem_p.h b/src/quick/accessible/qaccessiblequickitem_p.h index 354e0bf9f7..d1facf2199 100644 --- a/src/quick/accessible/qaccessiblequickitem_p.h +++ b/src/quick/accessible/qaccessiblequickitem_p.h @@ -74,6 +74,11 @@ public: bool isAccessible() const; + // Action Interface + QStringList actionNames() const; + void doAction(const QString &actionName); + QStringList keyBindingsForAction(const QString &actionName) const; + // Value Interface QVariant currentValue() const; void setCurrentValue(const QVariant &value); diff --git a/src/quick/doc/src/concepts/convenience/topic.qdoc b/src/quick/doc/src/concepts/convenience/topic.qdoc index 1a6feeaa61..b87cfd84c1 100644 --- a/src/quick/doc/src/concepts/convenience/topic.qdoc +++ b/src/quick/doc/src/concepts/convenience/topic.qdoc @@ -54,14 +54,11 @@ application performance. \section1 Dynamic Bindings -Assigning binding expressions to properties is a fundamental concept of QML, -and Qt Quick extends upon the idea with the \l Binding type. While bindings -are typically specified as property initialization assignments, the \l Binding -type allows the target of a binding to be defined explicitly and separately -from the definition of the binding expression itself. -By declaring a \l Binding instance, the client can dynamically bind properties -from arbitrary objects at run-time, and can modify the binding target when -required (or when it becomes available). +\l{Property Binding}{Property bindings} are a fundamental feature of QML. +Typically, a property is initialized with its binding. However, the \l Binding +type and \l {Qt::binding()}{Qt.binding()} function allows the client to +dynamically bind properties from any object at run-time, and modify the binding +target when required (or when it becomes available). \section1 Dynamic Signal Connections diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index 2a6eae71f7..29e83e8247 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -1774,10 +1774,12 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createPattern(QV4::CallCon pattern->patternRepeatY = true; } else if (repetition == QStringLiteral("repeat-x")) { pattern->patternRepeatX = true; + pattern->patternRepeatY = false; } else if (repetition == QStringLiteral("repeat-y")) { + pattern->patternRepeatX = false; pattern->patternRepeatY = true; } else if (repetition == QStringLiteral("no-repeat")) { - pattern->patternRepeatY = false; + pattern->patternRepeatX = false; pattern->patternRepeatY = false; } else { //TODO: exception: SYNTAX_ERR @@ -3316,7 +3318,7 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_getImageData(QV4::CallCont qreal y = ctx->callData->args[1].toNumber(); qreal w = ctx->callData->args[2].toNumber(); qreal h = ctx->callData->args[3].toNumber(); - if (!qIsFinite(x) || !qIsFinite(y) || !qIsFinite(w) || !qIsFinite(w)) + if (!qIsFinite(x) || !qIsFinite(y) || !qIsFinite(w) || !qIsFinite(h)) V4THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "getImageData(): Invalid arguments"); if (w <= 0 || h <= 0) diff --git a/src/quick/items/qquickimage.cpp b/src/quick/items/qquickimage.cpp index 08dbfa3c23..d7527742dc 100644 --- a/src/quick/items/qquickimage.cpp +++ b/src/quick/items/qquickimage.cpp @@ -108,7 +108,7 @@ QQuickImagePrivate::QQuickImagePrivate() \inherits Item \brief Displays an image - The Image type display an image. + The Image type displays an image. The source of the image is specified as a URL using the \l source property. Images can be supplied in any of the standard image formats supported by Qt, diff --git a/src/quick/items/qquickimage_p.h b/src/quick/items/qquickimage_p.h index 902e613b04..56b064f525 100644 --- a/src/quick/items/qquickimage_p.h +++ b/src/quick/items/qquickimage_p.h @@ -100,7 +100,7 @@ Q_SIGNALS: void paintedGeometryChanged(); void horizontalAlignmentChanged(HAlignment alignment); void verticalAlignmentChanged(VAlignment alignment); - void mipmapChanged(bool); + Q_REVISION(1) void mipmapChanged(bool); protected: QQuickImage(QQuickImagePrivate &dd, QQuickItem *parent); diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index 03a78895cf..da8ca9fd5d 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -5705,10 +5705,12 @@ void QQuickItem::setAntialiasing(bool aa) { Q_D(QQuickItem); - bool changed = (aa != antialiasing()); - d->antialiasingValid = true; + if (!d->antialiasingValid) { + d->antialiasingValid = true; + d->antialiasing = d->implicitAntialiasing; + } - if (!changed) + if (aa == d->antialiasing) return; d->antialiasing = aa; diff --git a/src/quick/items/qquickitemsmodule.cpp b/src/quick/items/qquickitemsmodule.cpp index 0a60ab77f8..2f20dd763b 100644 --- a/src/quick/items/qquickitemsmodule.cpp +++ b/src/quick/items/qquickitemsmodule.cpp @@ -178,7 +178,7 @@ static void qt_quickitems_defineModule(const char *uri, int major, int minor) qmlRegisterType<QQuickTranslate>(uri,major,minor,"Translate"); qmlRegisterType<QQuickRotation>(uri,major,minor,"Rotation"); qmlRegisterType<QQuickScale>(uri,major,minor,"Scale"); - qmlRegisterType<QQuickMatrix4x4>(uri,2,4,"Matrix4x4"); + qmlRegisterType<QQuickMatrix4x4>(uri,2,3,"Matrix4x4"); qmlRegisterType<QQuickText>(uri,major,minor,"Text"); qmlRegisterType<QQuickTextEdit>(uri,major,minor,"TextEdit"); qmlRegisterType<QQuickTextEdit,1>(uri,2,1,"TextEdit"); diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index 53d736fb36..3087835212 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -423,7 +423,6 @@ void QQuickTextControlPrivate::selectionChanged(bool forceEmitSelectionChanged / #endif emit q->selectionChanged(); } - q->updateCursorRectangle(true); } void QQuickTextControlPrivate::_q_updateCurrentCharFormatAndSelection() @@ -1152,8 +1151,10 @@ void QQuickTextControlPrivate::mouseMoveEvent(QMouseEvent *e, const QPointF &mou #endif if (interactionFlags & Qt::TextEditable) { - if (cursor.position() != oldCursorPos) + if (cursor.position() != oldCursorPos) { emit q->cursorPositionChanged(); + q->updateCursorRectangle(true); + } _q_updateCurrentCharFormatAndSelection(); #ifndef QT_NO_IM if (qGuiApp) @@ -1161,6 +1162,7 @@ void QQuickTextControlPrivate::mouseMoveEvent(QMouseEvent *e, const QPointF &mou #endif } else if (cursor.position() != oldCursorPos) { emit q->cursorPositionChanged(); + q->updateCursorRectangle(true); } selectionChanged(true); repaintOldAndNewSelection(oldSelection); @@ -1255,6 +1257,7 @@ void QQuickTextControlPrivate::mouseDoubleClickEvent(QMouseEvent *e, const QPoin setClipboardSelection(); #endif emit q->cursorPositionChanged(); + q->updateCursorRectangle(true); } } else if (!sendMouseEventToInputContext(e, pos)) { e->ignore(); diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 16b48efd86..a95c13f161 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -687,6 +687,13 @@ void QQuickWindowPrivate::translateTouchEvent(QTouchEvent *touchEvent) touchEvent->setTouchPoints(touchPoints); } + +static inline bool windowHasFocus(QQuickWindow *win) +{ + const QWindow *focusWindow = QGuiApplication::focusWindow(); + return win == focusWindow || QQuickRenderControl::renderWindowFor(win) == focusWindow; +} + /*! Set the focus inside \a scope to be \a item. If the scope contains the active focus item, it will be changed to \a item. @@ -762,7 +769,7 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q } if (!(options & DontChangeFocusProperty)) { - if (item != contentItem || QGuiApplication::focusWindow() == q) { + if (item != contentItem || windowHasFocus(q)) { itemPrivate->focus = true; changed << item; } @@ -2522,6 +2529,7 @@ void QQuickWindowPrivate::cleanupNodesOnShutdown() QSet<QQuickItem *>::const_iterator it = parentlessItems.begin(); for (; it != parentlessItems.end(); ++it) cleanupNodesOnShutdown(*it); + animationController->windowNodesDestroyed(); q->cleanupSceneGraph(); } diff --git a/src/quick/items/qquickwindowmodule.cpp b/src/quick/items/qquickwindowmodule.cpp index d06fff8c3e..91388ea30f 100644 --- a/src/quick/items/qquickwindowmodule.cpp +++ b/src/quick/items/qquickwindowmodule.cpp @@ -175,6 +175,7 @@ void QQuickWindowModule::defineModule() qmlRegisterType<QQuickWindow>(uri, 2, 0, "Window"); qmlRegisterRevision<QWindow,1>(uri, 2, 1); + qmlRegisterRevision<QWindow,2>(uri, 2, 2); qmlRegisterRevision<QQuickWindow,1>(uri, 2, 1);//Type moved to a subclass, but also has new members qmlRegisterRevision<QQuickWindow,2>(uri, 2, 2); qmlRegisterType<QQuickWindowQmlImpl>(uri, 2, 1, "Window"); diff --git a/src/quick/util/qquickanimatorcontroller.cpp b/src/quick/util/qquickanimatorcontroller.cpp index 7991dd8110..697c25b211 100644 --- a/src/quick/util/qquickanimatorcontroller.cpp +++ b/src/quick/util/qquickanimatorcontroller.cpp @@ -54,6 +54,7 @@ QT_BEGIN_NAMESPACE QQuickAnimatorController::QQuickAnimatorController() : m_window(0) + , m_nodesAreInvalid(false) { } @@ -80,6 +81,26 @@ QQuickAnimatorController::~QQuickAnimatorController() } } +static void qquickanimator_invalidate_node(QAbstractAnimationJob *job) +{ + if (job->isRenderThreadJob()) { + static_cast<QQuickAnimatorJob *>(job)->nodeWasDestroyed(); + } else if (job->isGroup()) { + QAnimationGroupJob *g = static_cast<QAnimationGroupJob *>(job); + for (QAbstractAnimationJob *a = g->firstChild(); a; a = a->nextSibling()) + qquickanimator_invalidate_node(a); + } +} + +void QQuickAnimatorController::windowNodesDestroyed() +{ + m_nodesAreInvalid = true; + for (QHash<QAbstractAnimationJob *, QQuickAnimatorProxyJob *>::const_iterator it = m_animatorRoots.constBegin(); + it != m_animatorRoots.constEnd(); ++it) { + qquickanimator_invalidate_node(it.key()); + } +} + void QQuickAnimatorController::itemDestroyed(QObject *o) { m_deletedSinceLastFrame << (QQuickItem *) o; @@ -112,7 +133,7 @@ void QQuickAnimatorController::advance() m_window->update(); } -static void qquick_initialize_helper(QAbstractAnimationJob *job, QQuickAnimatorController *c) +static void qquick_initialize_helper(QAbstractAnimationJob *job, QQuickAnimatorController *c, bool attachListener) { if (job->isRenderThreadJob()) { QQuickAnimatorJob *j = static_cast<QQuickAnimatorJob *>(job); @@ -121,13 +142,14 @@ static void qquick_initialize_helper(QAbstractAnimationJob *job, QQuickAnimatorC } else if (c->m_deletedSinceLastFrame.contains(j->target())) { j->targetWasDeleted(); } else { - j->addAnimationChangeListener(c, QAbstractAnimationJob::StateChange); + if (attachListener) + j->addAnimationChangeListener(c, QAbstractAnimationJob::StateChange); j->initialize(c); } } else if (job->isGroup()) { QAnimationGroupJob *g = static_cast<QAnimationGroupJob *>(job); for (QAbstractAnimationJob *a = g->firstChild(); a; a = a->nextSibling()) - qquick_initialize_helper(a, c); + qquick_initialize_helper(a, c, attachListener); } } @@ -147,7 +169,7 @@ void QQuickAnimatorController::beforeNodeSync() foreach (QQuickAnimatorProxyJob *proxy, m_starting) { QAbstractAnimationJob *job = proxy->job(); job->addAnimationChangeListener(this, QAbstractAnimationJob::Completion); - qquick_initialize_helper(job, this); + qquick_initialize_helper(job, this, true); m_animatorRoots[job] = proxy; job->start(); proxy->startedByController(); @@ -160,6 +182,18 @@ void QQuickAnimatorController::beforeNodeSync() } m_stopping.clear(); + // First sync after a window was hidden or otherwise invalidated. + // call initialize again to pick up new nodes.. + if (m_nodesAreInvalid) { + for (QHash<QAbstractAnimationJob *, QQuickAnimatorProxyJob *>::const_iterator it = m_animatorRoots.constBegin(); + it != m_animatorRoots.constEnd(); ++it) { + qquick_initialize_helper(it.key(), this, false); + } + m_nodesAreInvalid = false; + } + + + foreach (QQuickAnimatorJob *job, m_activeLeafAnimations) { if (!job->target()) continue; diff --git a/src/quick/util/qquickanimatorcontroller_p.h b/src/quick/util/qquickanimatorcontroller_p.h index 6223a9938f..745a494eec 100644 --- a/src/quick/util/qquickanimatorcontroller_p.h +++ b/src/quick/util/qquickanimatorcontroller_p.h @@ -76,6 +76,8 @@ public: void lock() { m_mutex.lock(); } void unlock() { m_mutex.unlock(); } + void windowNodesDestroyed(); + public Q_SLOTS: void itemDestroyed(QObject *); @@ -92,6 +94,8 @@ public: QSet<QQuickItem *> m_deletedSinceLastFrame; QQuickWindow *m_window; QMutex m_mutex; + + bool m_nodesAreInvalid; }; QT_END_NAMESPACE diff --git a/src/quick/util/qquickanimatorjob.cpp b/src/quick/util/qquickanimatorjob.cpp index 3bc4cef5b9..0bf95a49b4 100644 --- a/src/quick/util/qquickanimatorjob.cpp +++ b/src/quick/util/qquickanimatorjob.cpp @@ -281,6 +281,12 @@ void QQuickTransformAnimatorJob::initialize(QQuickAnimatorController *controller } } +void QQuickTransformAnimatorJob::nodeWasDestroyed() +{ + if (m_helper) + m_helper->node = 0; +} + void QQuickTransformAnimatorJob::Helper::sync() { const quint32 mask = QQuickItemPrivate::Position @@ -326,7 +332,7 @@ void QQuickTransformAnimatorJob::Helper::sync() void QQuickTransformAnimatorJob::Helper::apply() { - if (!wasChanged) + if (!wasChanged || !node) return; QMatrix4x4 m; @@ -412,6 +418,11 @@ void QQuickOpacityAnimatorJob::initialize(QQuickAnimatorController *controller) } } +void QQuickOpacityAnimatorJob::nodeWasDestroyed() +{ + m_opacityNode = 0; +} + void QQuickOpacityAnimatorJob::writeBack() { if (m_target) @@ -420,7 +431,7 @@ void QQuickOpacityAnimatorJob::writeBack() void QQuickOpacityAnimatorJob::updateCurrentTime(int time) { - if (!m_controller) + if (!m_controller || !m_opacityNode) return; Q_ASSERT(m_controller->m_window->openglContext()->thread() == QThread::currentThread()); @@ -504,13 +515,18 @@ void QQuickUniformAnimatorJob::setTarget(QQuickItem *target) m_target = target; } +void QQuickUniformAnimatorJob::nodeWasDestroyed() +{ + m_node = 0; + m_uniformIndex = -1; + m_uniformType = -1; +} + void QQuickUniformAnimatorJob::afterNodeSync() { m_node = static_cast<QQuickShaderEffectNode *>(QQuickItemPrivate::get(m_target)->paintNode); - if (m_node) { - m_uniformIndex = -1; - m_uniformType = -1; + if (m_node && m_uniformIndex == -1 && m_uniformType == -1) { QQuickShaderEffectMaterial *material = static_cast<QQuickShaderEffectMaterial *>(m_node->material()); bool found = false; diff --git a/src/quick/util/qquickanimatorjob_p.h b/src/quick/util/qquickanimatorjob_p.h index 8aae121106..03b13bcd30 100644 --- a/src/quick/util/qquickanimatorjob_p.h +++ b/src/quick/util/qquickanimatorjob_p.h @@ -131,6 +131,7 @@ public: void targetWasDeleted(); virtual void initialize(QQuickAnimatorController *controller); virtual void writeBack() = 0; + virtual void nodeWasDestroyed() = 0; bool isTransform() const { return m_isTransform; } bool isUniform() const { return m_isUniform; } @@ -208,6 +209,7 @@ public: protected: QQuickTransformAnimatorJob(); void initialize(QQuickAnimatorController *controller); + void nodeWasDestroyed(); Helper *m_helper; }; @@ -256,6 +258,7 @@ public: void initialize(QQuickAnimatorController *controller); void updateCurrentTime(int time); void writeBack(); + void nodeWasDestroyed(); private: QSGOpacityNode *m_opacityNode; @@ -275,6 +278,7 @@ public: void updateCurrentTime(int time); void writeBack(); + void nodeWasDestroyed(); private: QByteArray m_uniform; |