1
/****************************************************************************
3
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/
6
** This file is part of the QtQml module of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
9
** GNU Lesser General Public License Usage
10
** This file may be used under the terms of the GNU Lesser General Public
11
** License version 2.1 as published by the Free Software Foundation and
12
** appearing in the file LICENSE.LGPL included in the packaging of this
13
** file. Please review the following information to ensure the GNU Lesser
14
** General Public License version 2.1 requirements will be met:
15
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17
** In addition, as a special exception, Nokia gives you certain additional
18
** rights. These rights are described in the Nokia Qt LGPL Exception
19
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21
** GNU General Public License Usage
22
** Alternatively, this file may be used under the terms of the GNU General
23
** Public License version 3.0 as published by the Free Software Foundation
24
** and appearing in the file LICENSE.GPL included in the packaging of this
25
** file. Please review the following information to ensure the GNU General
26
** Public License version 3.0 requirements will be met:
27
** http://www.gnu.org/copyleft/gpl.html.
30
** Alternatively, this file may be used in accordance with the terms and
31
** conditions contained in a signed written agreement between you and Nokia.
40
****************************************************************************/
42
#include "qquickstateoperations_p.h"
43
#include "qquickitem_p.h"
45
#include <private/qquickstate_p_p.h>
47
#include <QtQml/qqmlinfo.h>
48
#include <QtCore/qmath.h>
52
class QQuickParentChangePrivate : public QQuickStateOperationPrivate
54
Q_DECLARE_PUBLIC(QQuickParentChange)
56
QQuickParentChangePrivate() : target(0), parent(0), origParent(0), origStackBefore(0),
57
rewindParent(0), rewindStackBefore(0) {}
60
QQmlGuard<QQuickItem> parent;
61
QQmlGuard<QQuickItem> origParent;
62
QQmlGuard<QQuickItem> origStackBefore;
63
QQuickItem *rewindParent;
64
QQuickItem *rewindStackBefore;
66
QQmlNullableValue<QQmlScriptString> xString;
67
QQmlNullableValue<QQmlScriptString> yString;
68
QQmlNullableValue<QQmlScriptString> widthString;
69
QQmlNullableValue<QQmlScriptString> heightString;
70
QQmlNullableValue<QQmlScriptString> scaleString;
71
QQmlNullableValue<QQmlScriptString> rotationString;
73
void doChange(QQuickItem *targetParent, QQuickItem *stackBefore = 0);
76
void QQuickParentChangePrivate::doChange(QQuickItem *targetParent, QQuickItem *stackBefore)
78
if (targetParent && target && target->parentItem()) {
79
Q_Q(QQuickParentChange);
81
const QTransform &transform = target->parentItem()->itemTransform(targetParent, &ok);
82
if (transform.type() >= QTransform::TxShear || !ok) {
83
qmlInfo(q) << QQuickParentChange::tr("Unable to preserve appearance under complex transform");
89
bool isRotate = (transform.type() == QTransform::TxRotate) || (transform.m11() < 0);
90
if (ok && !isRotate) {
91
if (transform.m11() == transform.m22())
92
scale = transform.m11();
94
qmlInfo(q) << QQuickParentChange::tr("Unable to preserve appearance under non-uniform scale");
97
} else if (ok && isRotate) {
98
if (transform.m11() == transform.m22())
99
scale = qSqrt(transform.m11()*transform.m11() + transform.m12()*transform.m12());
101
qmlInfo(q) << QQuickParentChange::tr("Unable to preserve appearance under non-uniform scale");
106
rotation = atan2(transform.m12()/scale, transform.m11()/scale) * 180/M_PI;
108
qmlInfo(q) << QQuickParentChange::tr("Unable to preserve appearance under scale of 0");
113
const QPointF &point = transform.map(QPointF(target->x(),target->y()));
117
// setParentItem will update the transformOriginPoint if needed
118
target->setParentItem(targetParent);
120
if (ok && target->transformOrigin() != QQuickItem::TopLeft) {
121
qreal tempxt = target->transformOriginPoint().x();
122
qreal tempyt = target->transformOriginPoint().y();
124
t.translate(-tempxt, -tempyt);
126
t.scale(scale, scale);
127
t.translate(tempxt, tempyt);
128
const QPointF &offset = t.map(QPointF(0,0));
134
//qDebug() << x << y << rotation << scale;
135
target->setPos(QPointF(x, y));
136
target->setRotation(target->rotation() + rotation);
137
target->setScale(target->scale() * scale);
140
target->setParentItem(targetParent);
143
//restore the original stack position.
144
//### if stackBefore has also been reparented this won't work
146
target->stackBefore(stackBefore);
149
QQuickParentChange::QQuickParentChange(QObject *parent)
150
: QQuickStateOperation(*(new QQuickParentChangePrivate), parent)
154
QQuickParentChange::~QQuickParentChange()
158
QQmlScriptString QQuickParentChange::x() const
160
Q_D(const QQuickParentChange);
161
return d->xString.value;
164
void QQuickParentChange::setX(QQmlScriptString x)
166
Q_D(QQuickParentChange);
170
bool QQuickParentChange::xIsSet() const
172
Q_D(const QQuickParentChange);
173
return d->xString.isValid();
176
QQmlScriptString QQuickParentChange::y() const
178
Q_D(const QQuickParentChange);
179
return d->yString.value;
182
void QQuickParentChange::setY(QQmlScriptString y)
184
Q_D(QQuickParentChange);
188
bool QQuickParentChange::yIsSet() const
190
Q_D(const QQuickParentChange);
191
return d->yString.isValid();
194
QQmlScriptString QQuickParentChange::width() const
196
Q_D(const QQuickParentChange);
197
return d->widthString.value;
200
void QQuickParentChange::setWidth(QQmlScriptString width)
202
Q_D(QQuickParentChange);
203
d->widthString = width;
206
bool QQuickParentChange::widthIsSet() const
208
Q_D(const QQuickParentChange);
209
return d->widthString.isValid();
212
QQmlScriptString QQuickParentChange::height() const
214
Q_D(const QQuickParentChange);
215
return d->heightString.value;
218
void QQuickParentChange::setHeight(QQmlScriptString height)
220
Q_D(QQuickParentChange);
221
d->heightString = height;
224
bool QQuickParentChange::heightIsSet() const
226
Q_D(const QQuickParentChange);
227
return d->heightString.isValid();
230
QQmlScriptString QQuickParentChange::scale() const
232
Q_D(const QQuickParentChange);
233
return d->scaleString.value;
236
void QQuickParentChange::setScale(QQmlScriptString scale)
238
Q_D(QQuickParentChange);
239
d->scaleString = scale;
242
bool QQuickParentChange::scaleIsSet() const
244
Q_D(const QQuickParentChange);
245
return d->scaleString.isValid();
248
QQmlScriptString QQuickParentChange::rotation() const
250
Q_D(const QQuickParentChange);
251
return d->rotationString.value;
254
void QQuickParentChange::setRotation(QQmlScriptString rotation)
256
Q_D(QQuickParentChange);
257
d->rotationString = rotation;
260
bool QQuickParentChange::rotationIsSet() const
262
Q_D(const QQuickParentChange);
263
return d->rotationString.isValid();
266
QQuickItem *QQuickParentChange::originalParent() const
268
Q_D(const QQuickParentChange);
269
return d->origParent;
272
QQuickItem *QQuickParentChange::object() const
274
Q_D(const QQuickParentChange);
278
void QQuickParentChange::setObject(QQuickItem *target)
280
Q_D(QQuickParentChange);
284
QQuickItem *QQuickParentChange::parent() const
286
Q_D(const QQuickParentChange);
290
void QQuickParentChange::setParent(QQuickItem *parent)
292
Q_D(QQuickParentChange);
296
QQuickStateOperation::ActionList QQuickParentChange::actions()
298
Q_D(QQuickParentChange);
299
if (!d->target || !d->parent)
308
if (d->xString.isValid()) {
310
QString script = d->xString.value.script();
311
qreal x = script.toFloat(&ok);
313
QQuickAction xa(d->target, QLatin1String("x"), x);
316
QQmlBinding *newBinding = new QQmlBinding(script, d->target, qmlContext(this));
317
QQmlProperty property(d->target, QLatin1String("x"));
318
newBinding->setTarget(property);
320
xa.property = property;
321
xa.toBinding = QQmlAbstractBinding::getPointer(newBinding);
322
xa.fromValue = xa.property.read();
323
xa.deletableToBinding = true;
328
if (d->yString.isValid()) {
330
QString script = d->yString.value.script();
331
qreal y = script.toFloat(&ok);
333
QQuickAction ya(d->target, QLatin1String("y"), y);
336
QQmlBinding *newBinding = new QQmlBinding(script, d->target, qmlContext(this));
337
QQmlProperty property(d->target, QLatin1String("y"));
338
newBinding->setTarget(property);
340
ya.property = property;
341
ya.toBinding = QQmlAbstractBinding::getPointer(newBinding);
342
ya.fromValue = ya.property.read();
343
ya.deletableToBinding = true;
348
if (d->scaleString.isValid()) {
350
QString script = d->scaleString.value.script();
351
qreal scale = script.toFloat(&ok);
353
QQuickAction sa(d->target, QLatin1String("scale"), scale);
356
QQmlBinding *newBinding = new QQmlBinding(script, d->target, qmlContext(this));
357
QQmlProperty property(d->target, QLatin1String("scale"));
358
newBinding->setTarget(property);
360
sa.property = property;
361
sa.toBinding = QQmlAbstractBinding::getPointer(newBinding);
362
sa.fromValue = sa.property.read();
363
sa.deletableToBinding = true;
368
if (d->rotationString.isValid()) {
370
QString script = d->rotationString.value.script();
371
qreal rotation = script.toFloat(&ok);
373
QQuickAction ra(d->target, QLatin1String("rotation"), rotation);
376
QQmlBinding *newBinding = new QQmlBinding(script, d->target, qmlContext(this));
377
QQmlProperty property(d->target, QLatin1String("rotation"));
378
newBinding->setTarget(property);
380
ra.property = property;
381
ra.toBinding = QQmlAbstractBinding::getPointer(newBinding);
382
ra.fromValue = ra.property.read();
383
ra.deletableToBinding = true;
388
if (d->widthString.isValid()) {
390
QString script = d->widthString.value.script();
391
qreal width = script.toFloat(&ok);
393
QQuickAction wa(d->target, QLatin1String("width"), width);
396
QQmlBinding *newBinding = new QQmlBinding(script, d->target, qmlContext(this));
397
QQmlProperty property(d->target, QLatin1String("width"));
398
newBinding->setTarget(property);
400
wa.property = property;
401
wa.toBinding = QQmlAbstractBinding::getPointer(newBinding);
402
wa.fromValue = wa.property.read();
403
wa.deletableToBinding = true;
408
if (d->heightString.isValid()) {
410
QString script = d->heightString.value.script();
411
qreal height = script.toFloat(&ok);
413
QQuickAction ha(d->target, QLatin1String("height"), height);
416
QQmlBinding *newBinding = new QQmlBinding(script, d->target, qmlContext(this));
417
QQmlProperty property(d->target, QLatin1String("height"));
418
newBinding->setTarget(property);
420
ha.property = property;
421
ha.toBinding = QQmlAbstractBinding::getPointer(newBinding);
422
ha.fromValue = ha.property.read();
423
ha.deletableToBinding = true;
431
void QQuickParentChange::saveOriginals()
433
Q_D(QQuickParentChange);
435
d->origParent = d->rewindParent;
436
d->origStackBefore = d->rewindStackBefore;
439
/*void QQuickParentChange::copyOriginals(QQuickActionEvent *other)
441
Q_D(QQuickParentChange);
442
QQuickParentChange *pc = static_cast<QQuickParentChange*>(other);
444
d->origParent = pc->d_func()->rewindParent;
445
d->origStackBefore = pc->d_func()->rewindStackBefore;
450
void QQuickParentChange::execute(Reason)
452
Q_D(QQuickParentChange);
453
d->doChange(d->parent);
456
bool QQuickParentChange::isReversable()
461
void QQuickParentChange::reverse(Reason)
463
Q_D(QQuickParentChange);
464
d->doChange(d->origParent, d->origStackBefore);
467
QQuickActionEvent::EventType QQuickParentChange::type() const
472
bool QQuickParentChange::override(QQuickActionEvent*other)
474
Q_D(QQuickParentChange);
475
if (other->type() != ParentChange)
477
if (QQuickParentChange *otherPC = static_cast<QQuickParentChange*>(other))
478
return (d->target == otherPC->object());
482
void QQuickParentChange::saveCurrentValues()
484
Q_D(QQuickParentChange);
487
d->rewindStackBefore = 0;
491
d->rewindParent = d->target->parentItem();
492
d->rewindStackBefore = 0;
494
if (!d->rewindParent)
497
QList<QQuickItem *> children = d->rewindParent->childItems();
498
for (int ii = 0; ii < children.count() - 1; ++ii) {
499
if (children.at(ii) == d->target) {
500
d->rewindStackBefore = children.at(ii + 1);
506
void QQuickParentChange::rewind()
508
Q_D(QQuickParentChange);
509
d->doChange(d->rewindParent, d->rewindStackBefore);
512
class QQuickAnchorSetPrivate : public QObjectPrivate
514
Q_DECLARE_PUBLIC(QQuickAnchorSet)
516
QQuickAnchorSetPrivate()
517
: usedAnchors(0), resetAnchors(0), fill(0),
518
centerIn(0)/*, leftMargin(0), rightMargin(0), topMargin(0), bottomMargin(0),
519
margins(0), vCenterOffset(0), hCenterOffset(0), baselineOffset(0)*/
523
QQuickAnchors::Anchors usedAnchors;
524
QQuickAnchors::Anchors resetAnchors;
527
QQuickItem *centerIn;
529
QQmlScriptString leftScript;
530
QQmlScriptString rightScript;
531
QQmlScriptString topScript;
532
QQmlScriptString bottomScript;
533
QQmlScriptString hCenterScript;
534
QQmlScriptString vCenterScript;
535
QQmlScriptString baselineScript;
544
qreal baselineOffset;*/
547
QQuickAnchorSet::QQuickAnchorSet(QObject *parent)
548
: QObject(*new QQuickAnchorSetPrivate, parent)
552
QQuickAnchorSet::~QQuickAnchorSet()
556
QQmlScriptString QQuickAnchorSet::top() const
558
Q_D(const QQuickAnchorSet);
562
void QQuickAnchorSet::setTop(const QQmlScriptString &edge)
564
Q_D(QQuickAnchorSet);
565
d->usedAnchors |= QQuickAnchors::TopAnchor;
567
if (edge.script() == QLatin1String("undefined"))
571
void QQuickAnchorSet::resetTop()
573
Q_D(QQuickAnchorSet);
574
d->usedAnchors &= ~QQuickAnchors::TopAnchor;
575
d->resetAnchors |= QQuickAnchors::TopAnchor;
578
QQmlScriptString QQuickAnchorSet::bottom() const
580
Q_D(const QQuickAnchorSet);
581
return d->bottomScript;
584
void QQuickAnchorSet::setBottom(const QQmlScriptString &edge)
586
Q_D(QQuickAnchorSet);
587
d->usedAnchors |= QQuickAnchors::BottomAnchor;
588
d->bottomScript = edge;
589
if (edge.script() == QLatin1String("undefined"))
593
void QQuickAnchorSet::resetBottom()
595
Q_D(QQuickAnchorSet);
596
d->usedAnchors &= ~QQuickAnchors::BottomAnchor;
597
d->resetAnchors |= QQuickAnchors::BottomAnchor;
600
QQmlScriptString QQuickAnchorSet::verticalCenter() const
602
Q_D(const QQuickAnchorSet);
603
return d->vCenterScript;
606
void QQuickAnchorSet::setVerticalCenter(const QQmlScriptString &edge)
608
Q_D(QQuickAnchorSet);
609
d->usedAnchors |= QQuickAnchors::VCenterAnchor;
610
d->vCenterScript = edge;
611
if (edge.script() == QLatin1String("undefined"))
612
resetVerticalCenter();
615
void QQuickAnchorSet::resetVerticalCenter()
617
Q_D(QQuickAnchorSet);
618
d->usedAnchors &= ~QQuickAnchors::VCenterAnchor;
619
d->resetAnchors |= QQuickAnchors::VCenterAnchor;
622
QQmlScriptString QQuickAnchorSet::baseline() const
624
Q_D(const QQuickAnchorSet);
625
return d->baselineScript;
628
void QQuickAnchorSet::setBaseline(const QQmlScriptString &edge)
630
Q_D(QQuickAnchorSet);
631
d->usedAnchors |= QQuickAnchors::BaselineAnchor;
632
d->baselineScript = edge;
633
if (edge.script() == QLatin1String("undefined"))
637
void QQuickAnchorSet::resetBaseline()
639
Q_D(QQuickAnchorSet);
640
d->usedAnchors &= ~QQuickAnchors::BaselineAnchor;
641
d->resetAnchors |= QQuickAnchors::BaselineAnchor;
644
QQmlScriptString QQuickAnchorSet::left() const
646
Q_D(const QQuickAnchorSet);
647
return d->leftScript;
650
void QQuickAnchorSet::setLeft(const QQmlScriptString &edge)
652
Q_D(QQuickAnchorSet);
653
d->usedAnchors |= QQuickAnchors::LeftAnchor;
654
d->leftScript = edge;
655
if (edge.script() == QLatin1String("undefined"))
659
void QQuickAnchorSet::resetLeft()
661
Q_D(QQuickAnchorSet);
662
d->usedAnchors &= ~QQuickAnchors::LeftAnchor;
663
d->resetAnchors |= QQuickAnchors::LeftAnchor;
666
QQmlScriptString QQuickAnchorSet::right() const
668
Q_D(const QQuickAnchorSet);
669
return d->rightScript;
672
void QQuickAnchorSet::setRight(const QQmlScriptString &edge)
674
Q_D(QQuickAnchorSet);
675
d->usedAnchors |= QQuickAnchors::RightAnchor;
676
d->rightScript = edge;
677
if (edge.script() == QLatin1String("undefined"))
681
void QQuickAnchorSet::resetRight()
683
Q_D(QQuickAnchorSet);
684
d->usedAnchors &= ~QQuickAnchors::RightAnchor;
685
d->resetAnchors |= QQuickAnchors::RightAnchor;
688
QQmlScriptString QQuickAnchorSet::horizontalCenter() const
690
Q_D(const QQuickAnchorSet);
691
return d->hCenterScript;
694
void QQuickAnchorSet::setHorizontalCenter(const QQmlScriptString &edge)
696
Q_D(QQuickAnchorSet);
697
d->usedAnchors |= QQuickAnchors::HCenterAnchor;
698
d->hCenterScript = edge;
699
if (edge.script() == QLatin1String("undefined"))
700
resetHorizontalCenter();
703
void QQuickAnchorSet::resetHorizontalCenter()
705
Q_D(QQuickAnchorSet);
706
d->usedAnchors &= ~QQuickAnchors::HCenterAnchor;
707
d->resetAnchors |= QQuickAnchors::HCenterAnchor;
710
QQuickItem *QQuickAnchorSet::fill() const
712
Q_D(const QQuickAnchorSet);
716
void QQuickAnchorSet::setFill(QQuickItem *f)
718
Q_D(QQuickAnchorSet);
722
void QQuickAnchorSet::resetFill()
727
QQuickItem *QQuickAnchorSet::centerIn() const
729
Q_D(const QQuickAnchorSet);
733
void QQuickAnchorSet::setCenterIn(QQuickItem* c)
735
Q_D(QQuickAnchorSet);
739
void QQuickAnchorSet::resetCenterIn()
745
class QQuickAnchorChangesPrivate : public QQuickStateOperationPrivate
748
QQuickAnchorChangesPrivate()
749
: target(0), anchorSet(new QQuickAnchorSet),
750
leftBinding(0), rightBinding(0), hCenterBinding(0),
751
topBinding(0), bottomBinding(0), vCenterBinding(0), baselineBinding(0),
752
origLeftBinding(0), origRightBinding(0), origHCenterBinding(0),
753
origTopBinding(0), origBottomBinding(0), origVCenterBinding(0),
754
origBaselineBinding(0)
758
~QQuickAnchorChangesPrivate() { delete anchorSet; }
761
QQuickAnchorSet *anchorSet;
763
QQmlBinding *leftBinding;
764
QQmlBinding *rightBinding;
765
QQmlBinding *hCenterBinding;
766
QQmlBinding *topBinding;
767
QQmlBinding *bottomBinding;
768
QQmlBinding *vCenterBinding;
769
QQmlBinding *baselineBinding;
771
QQmlAbstractBinding *origLeftBinding;
772
QQmlAbstractBinding *origRightBinding;
773
QQmlAbstractBinding *origHCenterBinding;
774
QQmlAbstractBinding *origTopBinding;
775
QQmlAbstractBinding *origBottomBinding;
776
QQmlAbstractBinding *origVCenterBinding;
777
QQmlAbstractBinding *origBaselineBinding;
779
QQuickAnchorLine rewindLeft;
780
QQuickAnchorLine rewindRight;
781
QQuickAnchorLine rewindHCenter;
782
QQuickAnchorLine rewindTop;
783
QQuickAnchorLine rewindBottom;
784
QQuickAnchorLine rewindVCenter;
785
QQuickAnchorLine rewindBaseline;
804
bool applyOrigHCenter;
806
bool applyOrigBottom;
807
bool applyOrigVCenter;
808
bool applyOrigBaseline;
810
QQmlNullableValue<qreal> origWidth;
811
QQmlNullableValue<qreal> origHeight;
815
QList<QQmlAbstractBinding*> oldBindings;
817
QQmlProperty leftProp;
818
QQmlProperty rightProp;
819
QQmlProperty hCenterProp;
820
QQmlProperty topProp;
821
QQmlProperty bottomProp;
822
QQmlProperty vCenterProp;
823
QQmlProperty baselineProp;
826
QQuickAnchorChanges::QQuickAnchorChanges(QObject *parent)
827
: QQuickStateOperation(*(new QQuickAnchorChangesPrivate), parent)
831
QQuickAnchorChanges::~QQuickAnchorChanges()
835
QQuickAnchorChanges::ActionList QQuickAnchorChanges::actions()
837
Q_D(QQuickAnchorChanges);
838
d->leftBinding = d->rightBinding = d->hCenterBinding = d->topBinding
839
= d->bottomBinding = d->vCenterBinding = d->baselineBinding = 0;
841
d->leftProp = QQmlProperty(d->target, QLatin1String("anchors.left"));
842
d->rightProp = QQmlProperty(d->target, QLatin1String("anchors.right"));
843
d->hCenterProp = QQmlProperty(d->target, QLatin1String("anchors.horizontalCenter"));
844
d->topProp = QQmlProperty(d->target, QLatin1String("anchors.top"));
845
d->bottomProp = QQmlProperty(d->target, QLatin1String("anchors.bottom"));
846
d->vCenterProp = QQmlProperty(d->target, QLatin1String("anchors.verticalCenter"));
847
d->baselineProp = QQmlProperty(d->target, QLatin1String("anchors.baseline"));
849
if (d->anchorSet->d_func()->usedAnchors & QQuickAnchors::LeftAnchor) {
850
d->leftBinding = new QQmlBinding(d->anchorSet->d_func()->leftScript.script(), d->target, qmlContext(this));
851
d->leftBinding->setTarget(d->leftProp);
853
if (d->anchorSet->d_func()->usedAnchors & QQuickAnchors::RightAnchor) {
854
d->rightBinding = new QQmlBinding(d->anchorSet->d_func()->rightScript.script(), d->target, qmlContext(this));
855
d->rightBinding->setTarget(d->rightProp);
857
if (d->anchorSet->d_func()->usedAnchors & QQuickAnchors::HCenterAnchor) {
858
d->hCenterBinding = new QQmlBinding(d->anchorSet->d_func()->hCenterScript.script(), d->target, qmlContext(this));
859
d->hCenterBinding->setTarget(d->hCenterProp);
861
if (d->anchorSet->d_func()->usedAnchors & QQuickAnchors::TopAnchor) {
862
d->topBinding = new QQmlBinding(d->anchorSet->d_func()->topScript.script(), d->target, qmlContext(this));
863
d->topBinding->setTarget(d->topProp);
865
if (d->anchorSet->d_func()->usedAnchors & QQuickAnchors::BottomAnchor) {
866
d->bottomBinding = new QQmlBinding(d->anchorSet->d_func()->bottomScript.script(), d->target, qmlContext(this));
867
d->bottomBinding->setTarget(d->bottomProp);
869
if (d->anchorSet->d_func()->usedAnchors & QQuickAnchors::VCenterAnchor) {
870
d->vCenterBinding = new QQmlBinding(d->anchorSet->d_func()->vCenterScript.script(), d->target, qmlContext(this));
871
d->vCenterBinding->setTarget(d->vCenterProp);
873
if (d->anchorSet->d_func()->usedAnchors & QQuickAnchors::BaselineAnchor) {
874
d->baselineBinding = new QQmlBinding(d->anchorSet->d_func()->baselineScript.script(), d->target, qmlContext(this));
875
d->baselineBinding->setTarget(d->baselineProp);
880
return ActionList() << a;
883
QQuickAnchorSet *QQuickAnchorChanges::anchors()
885
Q_D(QQuickAnchorChanges);
889
QQuickItem *QQuickAnchorChanges::object() const
891
Q_D(const QQuickAnchorChanges);
895
void QQuickAnchorChanges::setObject(QQuickItem *target)
897
Q_D(QQuickAnchorChanges);
901
void QQuickAnchorChanges::execute(Reason reason)
903
Q_D(QQuickAnchorChanges);
907
QQuickItemPrivate *targetPrivate = QQuickItemPrivate::get(d->target);
908
//incorporate any needed "reverts"
909
if (d->applyOrigLeft) {
910
if (!d->origLeftBinding)
911
targetPrivate->anchors()->resetLeft();
912
QQmlPropertyPrivate::setBinding(d->leftProp, d->origLeftBinding);
914
if (d->applyOrigRight) {
915
if (!d->origRightBinding)
916
targetPrivate->anchors()->resetRight();
917
QQmlPropertyPrivate::setBinding(d->rightProp, d->origRightBinding);
919
if (d->applyOrigHCenter) {
920
if (!d->origHCenterBinding)
921
targetPrivate->anchors()->resetHorizontalCenter();
922
QQmlPropertyPrivate::setBinding(d->hCenterProp, d->origHCenterBinding);
924
if (d->applyOrigTop) {
925
if (!d->origTopBinding)
926
targetPrivate->anchors()->resetTop();
927
QQmlPropertyPrivate::setBinding(d->topProp, d->origTopBinding);
929
if (d->applyOrigBottom) {
930
if (!d->origBottomBinding)
931
targetPrivate->anchors()->resetBottom();
932
QQmlPropertyPrivate::setBinding(d->bottomProp, d->origBottomBinding);
934
if (d->applyOrigVCenter) {
935
if (!d->origVCenterBinding)
936
targetPrivate->anchors()->resetVerticalCenter();
937
QQmlPropertyPrivate::setBinding(d->vCenterProp, d->origVCenterBinding);
939
if (d->applyOrigBaseline) {
940
if (!d->origBaselineBinding)
941
targetPrivate->anchors()->resetBaseline();
942
QQmlPropertyPrivate::setBinding(d->baselineProp, d->origBaselineBinding);
945
//destroy old bindings
946
if (reason == ActualChange) {
947
for (int i = 0; i < d->oldBindings.size(); ++i) {
948
QQmlAbstractBinding *binding = d->oldBindings.at(i);
952
d->oldBindings.clear();
955
//reset any anchors that have been specified as "undefined"
956
if (d->anchorSet->d_func()->resetAnchors & QQuickAnchors::LeftAnchor) {
957
targetPrivate->anchors()->resetLeft();
958
QQmlPropertyPrivate::setBinding(d->leftProp, 0);
960
if (d->anchorSet->d_func()->resetAnchors & QQuickAnchors::RightAnchor) {
961
targetPrivate->anchors()->resetRight();
962
QQmlPropertyPrivate::setBinding(d->rightProp, 0);
964
if (d->anchorSet->d_func()->resetAnchors & QQuickAnchors::HCenterAnchor) {
965
targetPrivate->anchors()->resetHorizontalCenter();
966
QQmlPropertyPrivate::setBinding(d->hCenterProp, 0);
968
if (d->anchorSet->d_func()->resetAnchors & QQuickAnchors::TopAnchor) {
969
targetPrivate->anchors()->resetTop();
970
QQmlPropertyPrivate::setBinding(d->topProp, 0);
972
if (d->anchorSet->d_func()->resetAnchors & QQuickAnchors::BottomAnchor) {
973
targetPrivate->anchors()->resetBottom();
974
QQmlPropertyPrivate::setBinding(d->bottomProp, 0);
976
if (d->anchorSet->d_func()->resetAnchors & QQuickAnchors::VCenterAnchor) {
977
targetPrivate->anchors()->resetVerticalCenter();
978
QQmlPropertyPrivate::setBinding(d->vCenterProp, 0);
980
if (d->anchorSet->d_func()->resetAnchors & QQuickAnchors::BaselineAnchor) {
981
targetPrivate->anchors()->resetBaseline();
982
QQmlPropertyPrivate::setBinding(d->baselineProp, 0);
985
//set any anchors that have been specified
987
QQmlPropertyPrivate::setBinding(d->leftBinding->property(), d->leftBinding);
989
QQmlPropertyPrivate::setBinding(d->rightBinding->property(), d->rightBinding);
990
if (d->hCenterBinding)
991
QQmlPropertyPrivate::setBinding(d->hCenterBinding->property(), d->hCenterBinding);
993
QQmlPropertyPrivate::setBinding(d->topBinding->property(), d->topBinding);
994
if (d->bottomBinding)
995
QQmlPropertyPrivate::setBinding(d->bottomBinding->property(), d->bottomBinding);
996
if (d->vCenterBinding)
997
QQmlPropertyPrivate::setBinding(d->vCenterBinding->property(), d->vCenterBinding);
998
if (d->baselineBinding)
999
QQmlPropertyPrivate::setBinding(d->baselineBinding->property(), d->baselineBinding);
1002
bool QQuickAnchorChanges::isReversable()
1007
void QQuickAnchorChanges::reverse(Reason reason)
1009
Q_D(QQuickAnchorChanges);
1013
QQuickItemPrivate *targetPrivate = QQuickItemPrivate::get(d->target);
1014
//reset any anchors set by the state
1015
if (d->leftBinding) {
1016
targetPrivate->anchors()->resetLeft();
1017
QQmlPropertyPrivate::setBinding(d->leftBinding->property(), 0);
1018
if (reason == ActualChange) {
1019
d->leftBinding->destroy(); d->leftBinding = 0;
1022
if (d->rightBinding) {
1023
targetPrivate->anchors()->resetRight();
1024
QQmlPropertyPrivate::setBinding(d->rightBinding->property(), 0);
1025
if (reason == ActualChange) {
1026
d->rightBinding->destroy(); d->rightBinding = 0;
1029
if (d->hCenterBinding) {
1030
targetPrivate->anchors()->resetHorizontalCenter();
1031
QQmlPropertyPrivate::setBinding(d->hCenterBinding->property(), 0);
1032
if (reason == ActualChange) {
1033
d->hCenterBinding->destroy(); d->hCenterBinding = 0;
1036
if (d->topBinding) {
1037
targetPrivate->anchors()->resetTop();
1038
QQmlPropertyPrivate::setBinding(d->topBinding->property(), 0);
1039
if (reason == ActualChange) {
1040
d->topBinding->destroy(); d->topBinding = 0;
1043
if (d->bottomBinding) {
1044
targetPrivate->anchors()->resetBottom();
1045
QQmlPropertyPrivate::setBinding(d->bottomBinding->property(), 0);
1046
if (reason == ActualChange) {
1047
d->bottomBinding->destroy(); d->bottomBinding = 0;
1050
if (d->vCenterBinding) {
1051
targetPrivate->anchors()->resetVerticalCenter();
1052
QQmlPropertyPrivate::setBinding(d->vCenterBinding->property(), 0);
1053
if (reason == ActualChange) {
1054
d->vCenterBinding->destroy(); d->vCenterBinding = 0;
1057
if (d->baselineBinding) {
1058
targetPrivate->anchors()->resetBaseline();
1059
QQmlPropertyPrivate::setBinding(d->baselineBinding->property(), 0);
1060
if (reason == ActualChange) {
1061
d->baselineBinding->destroy(); d->baselineBinding = 0;
1065
//restore previous anchors
1066
if (d->origLeftBinding)
1067
QQmlPropertyPrivate::setBinding(d->leftProp, d->origLeftBinding);
1068
if (d->origRightBinding)
1069
QQmlPropertyPrivate::setBinding(d->rightProp, d->origRightBinding);
1070
if (d->origHCenterBinding)
1071
QQmlPropertyPrivate::setBinding(d->hCenterProp, d->origHCenterBinding);
1072
if (d->origTopBinding)
1073
QQmlPropertyPrivate::setBinding(d->topProp, d->origTopBinding);
1074
if (d->origBottomBinding)
1075
QQmlPropertyPrivate::setBinding(d->bottomProp, d->origBottomBinding);
1076
if (d->origVCenterBinding)
1077
QQmlPropertyPrivate::setBinding(d->vCenterProp, d->origVCenterBinding);
1078
if (d->origBaselineBinding)
1079
QQmlPropertyPrivate::setBinding(d->baselineProp, d->origBaselineBinding);
1081
//restore any absolute geometry changed by the state's anchors
1082
QQuickAnchors::Anchors stateVAnchors = d->anchorSet->d_func()->usedAnchors & QQuickAnchors::Vertical_Mask;
1083
QQuickAnchors::Anchors origVAnchors = targetPrivate->anchors()->usedAnchors() & QQuickAnchors::Vertical_Mask;
1084
QQuickAnchors::Anchors stateHAnchors = d->anchorSet->d_func()->usedAnchors & QQuickAnchors::Horizontal_Mask;
1085
QQuickAnchors::Anchors origHAnchors = targetPrivate->anchors()->usedAnchors() & QQuickAnchors::Horizontal_Mask;
1087
bool stateSetWidth = (stateHAnchors &&
1088
stateHAnchors != QQuickAnchors::LeftAnchor &&
1089
stateHAnchors != QQuickAnchors::RightAnchor &&
1090
stateHAnchors != QQuickAnchors::HCenterAnchor);
1091
bool origSetWidth = (origHAnchors &&
1092
origHAnchors != QQuickAnchors::LeftAnchor &&
1093
origHAnchors != QQuickAnchors::RightAnchor &&
1094
origHAnchors != QQuickAnchors::HCenterAnchor);
1095
if (d->origWidth.isValid() && stateSetWidth && !origSetWidth)
1096
d->target->setWidth(d->origWidth.value);
1098
bool stateSetHeight = (stateVAnchors &&
1099
stateVAnchors != QQuickAnchors::TopAnchor &&
1100
stateVAnchors != QQuickAnchors::BottomAnchor &&
1101
stateVAnchors != QQuickAnchors::VCenterAnchor &&
1102
stateVAnchors != QQuickAnchors::BaselineAnchor);
1103
bool origSetHeight = (origVAnchors &&
1104
origVAnchors != QQuickAnchors::TopAnchor &&
1105
origVAnchors != QQuickAnchors::BottomAnchor &&
1106
origVAnchors != QQuickAnchors::VCenterAnchor &&
1107
origVAnchors != QQuickAnchors::BaselineAnchor);
1108
if (d->origHeight.isValid() && stateSetHeight && !origSetHeight)
1109
d->target->setHeight(d->origHeight.value);
1111
if (stateHAnchors && !origHAnchors)
1112
d->target->setX(d->origX);
1114
if (stateVAnchors && !origVAnchors)
1115
d->target->setY(d->origY);
1118
QQuickActionEvent::EventType QQuickAnchorChanges::type() const
1120
return AnchorChanges;
1123
QList<QQuickAction> QQuickAnchorChanges::additionalActions()
1125
Q_D(QQuickAnchorChanges);
1126
QList<QQuickAction> extra;
1128
QQuickAnchors::Anchors combined = d->anchorSet->d_func()->usedAnchors | d->anchorSet->d_func()->resetAnchors;
1129
bool hChange = combined & QQuickAnchors::Horizontal_Mask;
1130
bool vChange = combined & QQuickAnchors::Vertical_Mask;
1134
if (hChange && d->fromX != d->toX) {
1135
a.property = QQmlProperty(d->target, QLatin1String("x"));
1139
if (vChange && d->fromY != d->toY) {
1140
a.property = QQmlProperty(d->target, QLatin1String("y"));
1144
if (hChange && d->fromWidth != d->toWidth) {
1145
a.property = QQmlProperty(d->target, QLatin1String("width"));
1146
a.toValue = d->toWidth;
1149
if (vChange && d->fromHeight != d->toHeight) {
1150
a.property = QQmlProperty(d->target, QLatin1String("height"));
1151
a.toValue = d->toHeight;
1159
bool QQuickAnchorChanges::changesBindings()
1164
void QQuickAnchorChanges::saveOriginals()
1166
Q_D(QQuickAnchorChanges);
1170
d->origLeftBinding = QQmlPropertyPrivate::binding(d->leftProp);
1171
d->origRightBinding = QQmlPropertyPrivate::binding(d->rightProp);
1172
d->origHCenterBinding = QQmlPropertyPrivate::binding(d->hCenterProp);
1173
d->origTopBinding = QQmlPropertyPrivate::binding(d->topProp);
1174
d->origBottomBinding = QQmlPropertyPrivate::binding(d->bottomProp);
1175
d->origVCenterBinding = QQmlPropertyPrivate::binding(d->vCenterProp);
1176
d->origBaselineBinding = QQmlPropertyPrivate::binding(d->baselineProp);
1178
QQuickItemPrivate *targetPrivate = QQuickItemPrivate::get(d->target);
1179
if (targetPrivate->widthValid)
1180
d->origWidth = d->target->width();
1181
if (targetPrivate->heightValid)
1182
d->origHeight = d->target->height();
1183
d->origX = d->target->x();
1184
d->origY = d->target->y();
1186
d->applyOrigLeft = d->applyOrigRight = d->applyOrigHCenter = d->applyOrigTop
1187
= d->applyOrigBottom = d->applyOrigVCenter = d->applyOrigBaseline = false;
1189
saveCurrentValues();
1192
void QQuickAnchorChanges::copyOriginals(QQuickActionEvent *other)
1194
Q_D(QQuickAnchorChanges);
1195
QQuickAnchorChanges *ac = static_cast<QQuickAnchorChanges*>(other);
1196
QQuickAnchorChangesPrivate *acp = ac->d_func();
1198
QQuickAnchors::Anchors combined = acp->anchorSet->d_func()->usedAnchors |
1199
acp->anchorSet->d_func()->resetAnchors;
1201
//probably also need to revert some things
1202
d->applyOrigLeft = (combined & QQuickAnchors::LeftAnchor);
1203
d->applyOrigRight = (combined & QQuickAnchors::RightAnchor);
1204
d->applyOrigHCenter = (combined & QQuickAnchors::HCenterAnchor);
1205
d->applyOrigTop = (combined & QQuickAnchors::TopAnchor);
1206
d->applyOrigBottom = (combined & QQuickAnchors::BottomAnchor);
1207
d->applyOrigVCenter = (combined & QQuickAnchors::VCenterAnchor);
1208
d->applyOrigBaseline = (combined & QQuickAnchors::BaselineAnchor);
1210
d->origLeftBinding = acp->origLeftBinding;
1211
d->origRightBinding = acp->origRightBinding;
1212
d->origHCenterBinding = acp->origHCenterBinding;
1213
d->origTopBinding = acp->origTopBinding;
1214
d->origBottomBinding = acp->origBottomBinding;
1215
d->origVCenterBinding = acp->origVCenterBinding;
1216
d->origBaselineBinding = acp->origBaselineBinding;
1218
d->origWidth = acp->origWidth;
1219
d->origHeight = acp->origHeight;
1220
d->origX = acp->origX;
1221
d->origY = acp->origY;
1223
d->oldBindings.clear();
1224
d->oldBindings << acp->leftBinding << acp->rightBinding << acp->hCenterBinding
1225
<< acp->topBinding << acp->bottomBinding << acp->baselineBinding;
1227
saveCurrentValues();
1230
void QQuickAnchorChanges::clearBindings()
1232
Q_D(QQuickAnchorChanges);
1236
//### should this (saving "from" values) be moved to saveCurrentValues()?
1237
d->fromX = d->target->x();
1238
d->fromY = d->target->y();
1239
d->fromWidth = d->target->width();
1240
d->fromHeight = d->target->height();
1242
QQuickItemPrivate *targetPrivate = QQuickItemPrivate::get(d->target);
1243
//reset any anchors with corresponding reverts
1244
//reset any anchors that have been specified as "undefined"
1245
//reset any anchors that we'll be setting in the state
1246
QQuickAnchors::Anchors combined = d->anchorSet->d_func()->resetAnchors |
1247
d->anchorSet->d_func()->usedAnchors;
1248
if (d->applyOrigLeft || (combined & QQuickAnchors::LeftAnchor)) {
1249
targetPrivate->anchors()->resetLeft();
1250
QQmlPropertyPrivate::setBinding(d->leftProp, 0);
1252
if (d->applyOrigRight || (combined & QQuickAnchors::RightAnchor)) {
1253
targetPrivate->anchors()->resetRight();
1254
QQmlPropertyPrivate::setBinding(d->rightProp, 0);
1256
if (d->applyOrigHCenter || (combined & QQuickAnchors::HCenterAnchor)) {
1257
targetPrivate->anchors()->resetHorizontalCenter();
1258
QQmlPropertyPrivate::setBinding(d->hCenterProp, 0);
1260
if (d->applyOrigTop || (combined & QQuickAnchors::TopAnchor)) {
1261
targetPrivate->anchors()->resetTop();
1262
QQmlPropertyPrivate::setBinding(d->topProp, 0);
1264
if (d->applyOrigBottom || (combined & QQuickAnchors::BottomAnchor)) {
1265
targetPrivate->anchors()->resetBottom();
1266
QQmlPropertyPrivate::setBinding(d->bottomProp, 0);
1268
if (d->applyOrigVCenter || (combined & QQuickAnchors::VCenterAnchor)) {
1269
targetPrivate->anchors()->resetVerticalCenter();
1270
QQmlPropertyPrivate::setBinding(d->vCenterProp, 0);
1272
if (d->applyOrigBaseline || (combined & QQuickAnchors::BaselineAnchor)) {
1273
targetPrivate->anchors()->resetBaseline();
1274
QQmlPropertyPrivate::setBinding(d->baselineProp, 0);
1278
bool QQuickAnchorChanges::override(QQuickActionEvent*other)
1280
if (other->type() != AnchorChanges)
1282
if (static_cast<QQuickActionEvent*>(this) == other)
1284
if (static_cast<QQuickAnchorChanges*>(other)->object() == object())
1289
void QQuickAnchorChanges::rewind()
1291
Q_D(QQuickAnchorChanges);
1295
QQuickItemPrivate *targetPrivate = QQuickItemPrivate::get(d->target);
1297
//restore previous values (but not previous bindings, i.e. anchors)
1298
d->target->setX(d->rewindX);
1299
d->target->setY(d->rewindY);
1300
if (targetPrivate->widthValid) {
1301
d->target->setWidth(d->rewindWidth);
1303
if (targetPrivate->heightValid) {
1304
d->target->setHeight(d->rewindHeight);
1308
void QQuickAnchorChanges::saveCurrentValues()
1310
Q_D(QQuickAnchorChanges);
1314
QQuickItemPrivate *targetPrivate = QQuickItemPrivate::get(d->target);
1315
d->rewindLeft = targetPrivate->anchors()->left();
1316
d->rewindRight = targetPrivate->anchors()->right();
1317
d->rewindHCenter = targetPrivate->anchors()->horizontalCenter();
1318
d->rewindTop = targetPrivate->anchors()->top();
1319
d->rewindBottom = targetPrivate->anchors()->bottom();
1320
d->rewindVCenter = targetPrivate->anchors()->verticalCenter();
1321
d->rewindBaseline = targetPrivate->anchors()->baseline();
1323
d->rewindX = d->target->x();
1324
d->rewindY = d->target->y();
1325
d->rewindWidth = d->target->width();
1326
d->rewindHeight = d->target->height();
1329
void QQuickAnchorChanges::saveTargetValues()
1331
Q_D(QQuickAnchorChanges);
1335
d->toX = d->target->x();
1336
d->toY = d->target->y();
1337
d->toWidth = d->target->width();
1338
d->toHeight = d->target->height();
1341
#include <moc_qquickstateoperations_p.cpp>