diff options
Diffstat (limited to 'src/quick/items/qquickstateoperations.cpp')
-rw-r--r-- | src/quick/items/qquickstateoperations.cpp | 302 |
1 files changed, 154 insertions, 148 deletions
diff --git a/src/quick/items/qquickstateoperations.cpp b/src/quick/items/qquickstateoperations.cpp index fe1dfd349e..35b29b9134 100644 --- a/src/quick/items/qquickstateoperations.cpp +++ b/src/quick/items/qquickstateoperations.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQuick module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qquickstateoperations_p.h" #include "qquickitem_p.h" @@ -43,7 +7,11 @@ #include <private/qquickstate_p_p.h> #include <QtQml/qqmlinfo.h> + #include <QtCore/qmath.h> +#include <QtCore/qpointer.h> + +#include <memory> QT_BEGIN_NAMESPACE @@ -51,15 +19,17 @@ class QQuickParentChangePrivate : public QQuickStateOperationPrivate { Q_DECLARE_PUBLIC(QQuickParentChange) public: - QQuickParentChangePrivate() : target(nullptr), parent(nullptr), origParent(nullptr), origStackBefore(nullptr), - rewindParent(nullptr), rewindStackBefore(nullptr) {} - - QQuickItem *target; + QQuickItem *target = nullptr; QPointer<QQuickItem> parent; - QPointer<QQuickItem> origParent; - QPointer<QQuickItem> origStackBefore; - QQuickItem *rewindParent; - QQuickItem *rewindStackBefore; + + struct StateSnapshot { + QPointer<QQuickItem> parent; + QPointer<QQuickItem> stackBefore; + qreal x = 0, y = 0, width = 0, height = 0, scale = 0, rotation = 0; + }; + + std::unique_ptr<StateSnapshot> orig; + std::unique_ptr<StateSnapshot> rewind; QQmlNullableValue<QQmlScriptString> xString; QQmlNullableValue<QQmlScriptString> yString; @@ -68,10 +38,11 @@ public: QQmlNullableValue<QQmlScriptString> scaleString; QQmlNullableValue<QQmlScriptString> rotationString; - void doChange(QQuickItem *targetParent, QQuickItem *stackBefore = nullptr); + void doChange(QQuickItem *targetParent); + void reverseRewindHelper(const std::unique_ptr<StateSnapshot> &snapshot); }; -void QQuickParentChangePrivate::doChange(QQuickItem *targetParent, QQuickItem *stackBefore) +void QQuickParentChangePrivate::doChange(QQuickItem *targetParent) { if (targetParent && target && target->parentItem()) { Q_Q(QQuickParentChange); @@ -137,11 +108,6 @@ void QQuickParentChangePrivate::doChange(QQuickItem *targetParent, QQuickItem *s } else if (target) { target->setParentItem(targetParent); } - - //restore the original stack position. - //### if stackBefore has also been reparented this won't work - if (target && stackBefore) - target->stackBefore(stackBefore); } /*! @@ -180,10 +146,6 @@ QQuickParentChange::QQuickParentChange(QObject *parent) { } -QQuickParentChange::~QQuickParentChange() -{ -} - /*! \qmlproperty real QtQuick::ParentChange::x \qmlproperty real QtQuick::ParentChange::y @@ -197,10 +159,10 @@ QQuickParentChange::~QQuickParentChange() QQmlScriptString QQuickParentChange::x() const { Q_D(const QQuickParentChange); - return d->xString.value; + return d->xString.value(); } -void QQuickParentChange::setX(QQmlScriptString x) +void QQuickParentChange::setX(const QQmlScriptString &x) { Q_D(QQuickParentChange); d->xString = x; @@ -215,10 +177,10 @@ bool QQuickParentChange::xIsSet() const QQmlScriptString QQuickParentChange::y() const { Q_D(const QQuickParentChange); - return d->yString.value; + return d->yString.value(); } -void QQuickParentChange::setY(QQmlScriptString y) +void QQuickParentChange::setY(const QQmlScriptString &y) { Q_D(QQuickParentChange); d->yString = y; @@ -233,10 +195,10 @@ bool QQuickParentChange::yIsSet() const QQmlScriptString QQuickParentChange::width() const { Q_D(const QQuickParentChange); - return d->widthString.value; + return d->widthString.value(); } -void QQuickParentChange::setWidth(QQmlScriptString width) +void QQuickParentChange::setWidth(const QQmlScriptString &width) { Q_D(QQuickParentChange); d->widthString = width; @@ -251,10 +213,10 @@ bool QQuickParentChange::widthIsSet() const QQmlScriptString QQuickParentChange::height() const { Q_D(const QQuickParentChange); - return d->heightString.value; + return d->heightString.value(); } -void QQuickParentChange::setHeight(QQmlScriptString height) +void QQuickParentChange::setHeight(const QQmlScriptString &height) { Q_D(QQuickParentChange); d->heightString = height; @@ -269,10 +231,10 @@ bool QQuickParentChange::heightIsSet() const QQmlScriptString QQuickParentChange::scale() const { Q_D(const QQuickParentChange); - return d->scaleString.value; + return d->scaleString.value(); } -void QQuickParentChange::setScale(QQmlScriptString scale) +void QQuickParentChange::setScale(const QQmlScriptString &scale) { Q_D(QQuickParentChange); d->scaleString = scale; @@ -287,10 +249,10 @@ bool QQuickParentChange::scaleIsSet() const QQmlScriptString QQuickParentChange::rotation() const { Q_D(const QQuickParentChange); - return d->rotationString.value; + return d->rotationString.value(); } -void QQuickParentChange::setRotation(QQmlScriptString rotation) +void QQuickParentChange::setRotation(const QQmlScriptString &rotation) { Q_D(QQuickParentChange); d->rotationString = rotation; @@ -305,7 +267,7 @@ bool QQuickParentChange::rotationIsSet() const QQuickItem *QQuickParentChange::originalParent() const { Q_D(const QQuickParentChange); - return d->origParent; + return d->orig ? d->orig->parent : nullptr; } /*! @@ -354,14 +316,14 @@ QQuickStateOperation::ActionList QQuickParentChange::actions() if (d->xString.isValid()) { bool ok = false; - qreal x = d->xString.value.numberLiteral(&ok); + qreal x = d->xString.value().numberLiteral(&ok); if (ok) { QQuickStateAction xa(d->target, QLatin1String("x"), x); actions << xa; } else { QQmlProperty property(d->target, QLatin1String("x")); - QQmlBinding *newBinding = QQmlBinding::create(&QQmlPropertyPrivate::get(property)->core, d->xString.value, d->target, qmlContext(this)); - newBinding->setTarget(property); + auto newBinding = QQmlAnyBinding::createFromScriptString( + property, d->xString.value(), d->target, qmlContext(this)); QQuickStateAction xa; xa.property = property; xa.toBinding = newBinding; @@ -373,14 +335,14 @@ QQuickStateOperation::ActionList QQuickParentChange::actions() if (d->yString.isValid()) { bool ok = false; - qreal y = d->yString.value.numberLiteral(&ok); + qreal y = d->yString.value().numberLiteral(&ok); if (ok) { QQuickStateAction ya(d->target, QLatin1String("y"), y); actions << ya; } else { QQmlProperty property(d->target, QLatin1String("y")); - QQmlBinding *newBinding = QQmlBinding::create(&QQmlPropertyPrivate::get(property)->core, d->yString.value, d->target, qmlContext(this)); - newBinding->setTarget(property); + auto newBinding = QQmlAnyBinding::createFromScriptString( + property, d->yString.value(), d->target, qmlContext(this)); QQuickStateAction ya; ya.property = property; ya.toBinding = newBinding; @@ -392,14 +354,14 @@ QQuickStateOperation::ActionList QQuickParentChange::actions() if (d->scaleString.isValid()) { bool ok = false; - qreal scale = d->scaleString.value.numberLiteral(&ok); + qreal scale = d->scaleString.value().numberLiteral(&ok); if (ok) { QQuickStateAction sa(d->target, QLatin1String("scale"), scale); actions << sa; } else { QQmlProperty property(d->target, QLatin1String("scale")); - QQmlBinding *newBinding = QQmlBinding::create(&QQmlPropertyPrivate::get(property)->core, d->scaleString.value, d->target, qmlContext(this)); - newBinding->setTarget(property); + auto newBinding = QQmlAnyBinding::createFromScriptString( + property, d->scaleString.value(), d->target, qmlContext(this)); QQuickStateAction sa; sa.property = property; sa.toBinding = newBinding; @@ -411,14 +373,14 @@ QQuickStateOperation::ActionList QQuickParentChange::actions() if (d->rotationString.isValid()) { bool ok = false; - qreal rotation = d->rotationString.value.numberLiteral(&ok); + qreal rotation = d->rotationString.value().numberLiteral(&ok); if (ok) { QQuickStateAction ra(d->target, QLatin1String("rotation"), rotation); actions << ra; } else { QQmlProperty property(d->target, QLatin1String("rotation")); - QQmlBinding *newBinding = QQmlBinding::create(&QQmlPropertyPrivate::get(property)->core, d->rotationString.value, d->target, qmlContext(this)); - newBinding->setTarget(property); + auto newBinding = QQmlAnyBinding::createFromScriptString( + property, d->rotationString.value(), d->target, qmlContext(this)); QQuickStateAction ra; ra.property = property; ra.toBinding = newBinding; @@ -430,14 +392,13 @@ QQuickStateOperation::ActionList QQuickParentChange::actions() if (d->widthString.isValid()) { bool ok = false; - qreal width = d->widthString.value.numberLiteral(&ok); + qreal width = d->widthString.value().numberLiteral(&ok); if (ok) { QQuickStateAction wa(d->target, QLatin1String("width"), width); actions << wa; } else { QQmlProperty property(d->target, QLatin1String("width")); - QQmlBinding *newBinding = QQmlBinding::create(&QQmlPropertyPrivate::get(property)->core, d->widthString.value, d->target, qmlContext(this)); - newBinding->setTarget(property); + auto newBinding = QQmlAnyBinding::createFromScriptString(property, d->widthString, d->target, qmlContext(this)); QQuickStateAction wa; wa.property = property; wa.toBinding = newBinding; @@ -449,14 +410,13 @@ QQuickStateOperation::ActionList QQuickParentChange::actions() if (d->heightString.isValid()) { bool ok = false; - qreal height = d->heightString.value.numberLiteral(&ok); + qreal height = d->heightString.value().numberLiteral(&ok); if (ok) { QQuickStateAction ha(d->target, QLatin1String("height"), height); actions << ha; } else { QQmlProperty property(d->target, QLatin1String("height")); - QQmlBinding *newBinding = QQmlBinding::create(&QQmlPropertyPrivate::get(property)->core, d->heightString.value, d->target, qmlContext(this)); - newBinding->setTarget(property); + auto newBinding = QQmlAnyBinding::createFromScriptString(property, d->heightString, d->target, qmlContext(this)); QQuickStateAction ha; ha.property = property; ha.toBinding = newBinding; @@ -473,21 +433,11 @@ void QQuickParentChange::saveOriginals() { Q_D(QQuickParentChange); saveCurrentValues(); - d->origParent = d->rewindParent; - d->origStackBefore = d->rewindStackBefore; + if (!d->orig) + d->orig.reset(new QQuickParentChangePrivate::StateSnapshot); + *d->orig = *d->rewind; } -/*void QQuickParentChange::copyOriginals(QQuickStateActionEvent *other) -{ - Q_D(QQuickParentChange); - QQuickParentChange *pc = static_cast<QQuickParentChange*>(other); - - d->origParent = pc->d_func()->rewindParent; - d->origStackBefore = pc->d_func()->rewindStackBefore; - - saveCurrentValues(); -}*/ - void QQuickParentChange::execute() { Q_D(QQuickParentChange); @@ -499,10 +449,28 @@ bool QQuickParentChange::isReversable() return true; } +void QQuickParentChangePrivate::reverseRewindHelper(const std::unique_ptr<QQuickParentChangePrivate::StateSnapshot> &snapshot) +{ + if (!target || !snapshot) + return; + + // leave existing bindings alive; new bindings are applied in applyBindings + // setPosition and setSize update the geometry without invalidating bindings + target->setPosition(QPointF(snapshot->x, snapshot->y)); + target->setSize(QSizeF(snapshot->width, snapshot->height)); + + target->setScale(snapshot->scale); + target->setRotation(snapshot->rotation); + target->setParentItem(snapshot->parent); + if (snapshot->stackBefore) + target->stackBefore(snapshot->stackBefore); +} + + void QQuickParentChange::reverse() { Q_D(QQuickParentChange); - d->doChange(d->origParent, d->origStackBefore); + d->reverseRewindHelper(d->orig); } QQuickStateActionEvent::EventType QQuickParentChange::type() const @@ -524,21 +492,28 @@ void QQuickParentChange::saveCurrentValues() { Q_D(QQuickParentChange); if (!d->target) { - d->rewindParent = nullptr; - d->rewindStackBefore = nullptr; + d->rewind = nullptr; return; } - d->rewindParent = d->target->parentItem(); - d->rewindStackBefore = nullptr; + d->rewind.reset(new QQuickParentChangePrivate::StateSnapshot); + d->rewind->x = d->target->x(); + d->rewind->y = d->target->y(); + d->rewind->scale = d->target->scale(); + d->rewind->width = d->target->width(); + d->rewind->height = d->target->height(); + d->rewind->rotation = d->target->rotation(); - if (!d->rewindParent) + d->rewind->parent = d->target->parentItem(); + d->rewind->stackBefore = nullptr; + + if (!d->rewind->parent) return; - QList<QQuickItem *> children = d->rewindParent->childItems(); - for (int ii = 0; ii < children.count() - 1; ++ii) { + QList<QQuickItem *> children = d->rewind->parent->childItems(); + for (int ii = 0; ii < children.size() - 1; ++ii) { if (children.at(ii) == d->target) { - d->rewindStackBefore = children.at(ii + 1); + d->rewind->stackBefore = children.at(ii + 1); break; } } @@ -547,7 +522,8 @@ void QQuickParentChange::saveCurrentValues() void QQuickParentChange::rewind() { Q_D(QQuickParentChange); - d->doChange(d->rewindParent, d->rewindStackBefore); + d->reverseRewindHelper(d->rewind); + d->rewind.reset(); } /*! @@ -560,7 +536,7 @@ void QQuickParentChange::rewind() The AnchorChanges type is used to modify the anchors of an item in a \l State. AnchorChanges cannot be used to modify the margins on an item. For this, use - PropertyChanges intead. + PropertyChanges instead. In the following example we change the top and bottom anchors of an item using AnchorChanges, and the top and bottom anchor margins using @@ -587,11 +563,6 @@ class QQuickAnchorSetPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QQuickAnchorSet) public: - QQuickAnchorSetPrivate() - : usedAnchors(nullptr), resetAnchors(nullptr) - { - } - QQuickAnchors::Anchors usedAnchors; QQuickAnchors::Anchors resetAnchors; @@ -780,13 +751,13 @@ public: QQuickItem *target; QQuickAnchorSet *anchorSet; - QExplicitlySharedDataPointer<QQmlBinding> leftBinding; - QExplicitlySharedDataPointer<QQmlBinding> rightBinding; - QExplicitlySharedDataPointer<QQmlBinding> hCenterBinding; - QExplicitlySharedDataPointer<QQmlBinding> topBinding; - QExplicitlySharedDataPointer<QQmlBinding> bottomBinding; - QExplicitlySharedDataPointer<QQmlBinding> vCenterBinding; - QExplicitlySharedDataPointer<QQmlBinding> baselineBinding; + QQmlBinding::Ptr leftBinding; + QQmlBinding::Ptr rightBinding; + QQmlBinding::Ptr hCenterBinding; + QQmlBinding::Ptr topBinding; + QQmlBinding::Ptr bottomBinding; + QQmlBinding::Ptr vCenterBinding; + QQmlBinding::Ptr baselineBinding; QQmlAbstractBinding::Ptr origLeftBinding; QQmlAbstractBinding::Ptr origRightBinding; @@ -846,10 +817,6 @@ QQuickAnchorChanges::QQuickAnchorChanges(QObject *parent) { } -QQuickAnchorChanges::~QQuickAnchorChanges() -{ -} - QQuickAnchorChanges::ActionList QQuickAnchorChanges::actions() { Q_D(QQuickAnchorChanges); @@ -1098,35 +1065,59 @@ void QQuickAnchorChanges::reverse() QQuickAnchors::Anchors stateHAnchors = d->anchorSet->d_func()->usedAnchors & QQuickAnchors::Horizontal_Mask; QQuickAnchors::Anchors origHAnchors = targetPrivate->anchors()->usedAnchors() & QQuickAnchors::Horizontal_Mask; + const QRectF oldGeometry(d->target->position(), d->target->size()); bool stateSetWidth = (stateHAnchors && stateHAnchors != QQuickAnchors::LeftAnchor && stateHAnchors != QQuickAnchors::RightAnchor && stateHAnchors != QQuickAnchors::HCenterAnchor); + // in case of an additive AnchorChange, we _did_ end up modifying the width + stateSetWidth |= ((stateHAnchors & QQuickAnchors::LeftAnchor) && (origHAnchors & QQuickAnchors::RightAnchor)) || + ((stateHAnchors & QQuickAnchors::RightAnchor) && (origHAnchors & QQuickAnchors::LeftAnchor)); bool origSetWidth = (origHAnchors && origHAnchors != QQuickAnchors::LeftAnchor && origHAnchors != QQuickAnchors::RightAnchor && origHAnchors != QQuickAnchors::HCenterAnchor); - if (d->origWidth.isValid() && stateSetWidth && !origSetWidth) - d->target->setWidth(d->origWidth.value); + if (d->origWidth.isValid() && stateSetWidth && !origSetWidth && !qt_is_nan(d->origWidth)) { + targetPrivate->widthValidFlag = true; + if (targetPrivate->width != d->origWidth) + targetPrivate->width.setValueBypassingBindings(d->origWidth); + } bool stateSetHeight = (stateVAnchors && stateVAnchors != QQuickAnchors::TopAnchor && stateVAnchors != QQuickAnchors::BottomAnchor && stateVAnchors != QQuickAnchors::VCenterAnchor && stateVAnchors != QQuickAnchors::BaselineAnchor); + // in case of an additive AnchorChange, we _did_ end up modifying the height + stateSetHeight |= ((stateVAnchors & QQuickAnchors::TopAnchor) && (origVAnchors & QQuickAnchors::BottomAnchor)) || + ((stateVAnchors & QQuickAnchors::BottomAnchor) && (origVAnchors & QQuickAnchors::TopAnchor)); bool origSetHeight = (origVAnchors && origVAnchors != QQuickAnchors::TopAnchor && origVAnchors != QQuickAnchors::BottomAnchor && origVAnchors != QQuickAnchors::VCenterAnchor && origVAnchors != QQuickAnchors::BaselineAnchor); - if (d->origHeight.isValid() && stateSetHeight && !origSetHeight) - d->target->setHeight(d->origHeight.value); - - if (stateHAnchors && !origHAnchors) - d->target->setX(d->origX); + if (d->origHeight.isValid() && stateSetHeight && !origSetHeight && !qt_is_nan(d->origHeight)) { + targetPrivate->heightValidFlag = true; + if (targetPrivate->height != d->origHeight) + targetPrivate->height.setValueBypassingBindings(d->origHeight); + } - if (stateVAnchors && !origVAnchors) - d->target->setY(d->origY); + if (stateHAnchors && !origHAnchors && !qt_is_nan(d->origX) && d->origX != targetPrivate->x) + targetPrivate->x.setValueBypassingBindings(d->origX); + + if (stateVAnchors && !origVAnchors && !qt_is_nan(d->origY) && d->origY != targetPrivate->y) + targetPrivate->y.setValueBypassingBindings(d->origY); + + const QRectF newGeometry(d->target->position(), d->target->size()); + if (newGeometry != oldGeometry) { + QQuickItemPrivate::DirtyType dirtyFlags {}; + if (newGeometry.topLeft() != oldGeometry.topLeft()) + dirtyFlags = QQuickItemPrivate::DirtyType(dirtyFlags | QQuickItemPrivate::Position); + if (newGeometry.size() != oldGeometry.size()) + dirtyFlags = QQuickItemPrivate::DirtyType(dirtyFlags | QQuickItemPrivate::Size); + targetPrivate->dirty(dirtyFlags); + d->target->geometryChange(newGeometry, oldGeometry); + } } QQuickStateActionEvent::EventType QQuickAnchorChanges::type() const @@ -1190,9 +1181,9 @@ void QQuickAnchorChanges::saveOriginals() d->origBaselineBinding = QQmlPropertyPrivate::binding(d->baselineProp); QQuickItemPrivate *targetPrivate = QQuickItemPrivate::get(d->target); - if (targetPrivate->widthValid) + if (targetPrivate->widthValid()) d->origWidth = d->target->width(); - if (targetPrivate->heightValid) + if (targetPrivate->heightValid()) d->origHeight = d->target->height(); d->origX = d->target->x(); d->origY = d->target->y(); @@ -1320,15 +1311,31 @@ void QQuickAnchorChanges::rewind() return; QQuickItemPrivate *targetPrivate = QQuickItemPrivate::get(d->target); + const QRectF oldGeometry(d->target->position(), d->target->size()); + + // Restore previous values (but not previous bindings, i.e. anchors). + // Also, don't drop any new bindings. + if (!qt_is_nan(d->rewindX) && d->rewindX != targetPrivate->x) + targetPrivate->x.setValueBypassingBindings(d->rewindX); + if (!qt_is_nan(d->rewindY) && d->rewindY != targetPrivate->y) + targetPrivate->y.setValueBypassingBindings(d->rewindY); + + if (targetPrivate->widthValid() && !qt_is_nan(d->rewindWidth)) { + targetPrivate->widthValidFlag = true; + if (d->rewindWidth != targetPrivate->width) + targetPrivate->width.setValueBypassingBindings(d->rewindWidth); + } - //restore previous values (but not previous bindings, i.e. anchors) - d->target->setX(d->rewindX); - d->target->setY(d->rewindY); - if (targetPrivate->widthValid) { - d->target->setWidth(d->rewindWidth); + if (targetPrivate->heightValid() && !qt_is_nan(d->rewindHeight)) { + targetPrivate->heightValidFlag = true; + if (d->rewindHeight != targetPrivate->height) + targetPrivate->height.setValueBypassingBindings(d->rewindHeight); } - if (targetPrivate->heightValid) { - d->target->setHeight(d->rewindHeight); + + const QRectF newGeometry(d->target->position(), d->target->size()); + if (newGeometry != oldGeometry) { + targetPrivate->dirty(QQuickItemPrivate::Position); + d->target->geometryChange(newGeometry, oldGeometry); } } @@ -1365,7 +1372,6 @@ void QQuickAnchorChanges::saveTargetValues() d->toHeight = d->target->height(); } -#include <moc_qquickstateoperations_p.cpp> - QT_END_NAMESPACE +#include <moc_qquickstateoperations_p.cpp> |