Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickanchors.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
6
7#include "qquickitem_p.h"
8
9#include <qqmlinfo.h>
10
12
13static Q_ALWAYS_INLINE QQuickItem *readParentItem(const QQuickItem *item)
14{
15 return QQuickItemPrivate::get(item)->parentItem;
16}
17
18static Q_ALWAYS_INLINE qreal readX(const QQuickItem *item)
19{
20 return QQuickItemPrivate::get(item)->x;
21}
22
23static Q_ALWAYS_INLINE qreal readY(const QQuickItem *item)
24{
25 return QQuickItemPrivate::get(item)->y;
26}
27
28static Q_ALWAYS_INLINE qreal readWidth(const QQuickItem *item)
29{
30 return QQuickItemPrivate::get(item)->width;
31}
32
33static Q_ALWAYS_INLINE qreal readHeight(const QQuickItem *item)
34{
35 return QQuickItemPrivate::get(item)->height;
36}
37
38static Q_ALWAYS_INLINE qreal readBaselineOffset(const QQuickItem *item)
39{
40 return QQuickItemPrivate::get(item)->baselineOffset;
41}
42
43//TODO: should we cache relationships, so we don't have to check each time (parent-child or sibling)?
44//TODO: support non-parent, non-sibling (need to find lowest common ancestor)
45
46static inline qreal hcenter(const QQuickItem *item)
47{
48 qreal width = readWidth(item);
49 if (QQuickAnchors *anchors = QQuickItemPrivate::get(item)->_anchors) {
50 if (!QQuickAnchorsPrivate::get(anchors)->centerAligned)
51 return width / 2;
52 }
53 return qRound(width / 2);
54}
55
56static inline qreal vcenter(const QQuickItem *item)
57{
58 qreal height = readHeight(item);
59 if (QQuickAnchors *anchors = QQuickItemPrivate::get(item)->_anchors) {
60 if (!QQuickAnchorsPrivate::get(anchors)->centerAligned)
61 return height / 2;
62 }
63 return qRound(height / 2);
64}
65
66//local position
67static inline qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
68{
69 qreal ret = 0.0;
70 switch (anchorLine) {
71 case QQuickAnchors::LeftAnchor:
72 ret = readX(item);
73 break;
74 case QQuickAnchors::RightAnchor:
75 ret = readX(item) + readWidth(item);
76 break;
77 case QQuickAnchors::TopAnchor:
78 ret = readY(item);
79 break;
80 case QQuickAnchors::BottomAnchor:
81 ret = readY(item) + readHeight(item);
82 break;
83 case QQuickAnchors::HCenterAnchor:
84 ret = readX(item) + hcenter(item);
85 break;
86 case QQuickAnchors::VCenterAnchor:
87 ret = readY(item) + vcenter(item);
88 break;
89 case QQuickAnchors::BaselineAnchor:
90 ret = readY(item) + readBaselineOffset(item);
91 break;
92 default:
93 break;
94 }
95
96 return ret;
97}
98
99//position when origin is 0,0
100static inline qreal adjustedPosition(QQuickItem *item, QQuickAnchors::Anchor anchorLine)
101{
102 qreal ret = 0.0;
103 switch (anchorLine) {
104 case QQuickAnchors::LeftAnchor:
105 ret = 0.0;
106 break;
107 case QQuickAnchors::RightAnchor:
108 ret = readWidth(item);
109 break;
110 case QQuickAnchors::TopAnchor:
111 ret = 0.0;
112 break;
113 case QQuickAnchors::BottomAnchor:
114 ret = readHeight(item);
115 break;
116 case QQuickAnchors::HCenterAnchor:
117 ret = hcenter(item);
118 break;
119 case QQuickAnchors::VCenterAnchor:
120 ret = vcenter(item);
121 break;
122 case QQuickAnchors::BaselineAnchor:
123 ret = readBaselineOffset(item);
124 break;
125 default:
126 break;
127 }
128
129 return ret;
130}
131
132QQuickAnchors::QQuickAnchors(QQuickItem *item, QObject *parent)
133: QObject(*new QQuickAnchorsPrivate(item), parent)
134{
135}
136
137QQuickAnchors::~QQuickAnchors()
138{
139 Q_D(QQuickAnchors);
140 d->inDestructor = true;
141 d->remDepend(d->fill);
142 d->remDepend(d->centerIn);
143 d->remDepend(d->leftAnchorItem);
144 d->remDepend(d->rightAnchorItem);
145 d->remDepend(d->topAnchorItem);
146 d->remDepend(d->bottomAnchorItem);
147 d->remDepend(d->vCenterAnchorItem);
148 d->remDepend(d->hCenterAnchorItem);
149 d->remDepend(d->baselineAnchorItem);
150}
151
153{
154 Q_Q(QQuickAnchors);
155 if (!fill || !isItemComplete())
156 return;
157
158 if (updatingFill < 2) {
159 ++updatingFill;
160
161 qreal horizontalMargin = q->mirrored() ? rightMargin : leftMargin;
162
163 if (fill == readParentItem(item)) { //child-parent
164 setItemPos(QPointF(horizontalMargin, topMargin));
165 } else if (readParentItem(fill) == readParentItem(item)) { //siblings
166 setItemPos(QPointF(readX(fill)+horizontalMargin, readY(fill) + topMargin));
167 }
168 setItemSize(QSizeF(readWidth(fill) - leftMargin - rightMargin,
169 readHeight(fill) - topMargin - bottomMargin));
170
171 --updatingFill;
172 } else {
173 // ### Make this certain :)
174 qmlWarning(item) << QQuickAnchors::tr("Possible anchor loop detected on fill.");
175 }
176
177}
178
180{
181 Q_Q(QQuickAnchors);
182 if (!centerIn || fill || !isItemComplete())
183 return;
184
185 if (updatingCenterIn < 2) {
186 ++updatingCenterIn;
187
188 qreal effectiveHCenterOffset = q->mirrored() ? -hCenterOffset : hCenterOffset;
189 if (centerIn == readParentItem(item)) {
190 QPointF p(hcenter(readParentItem(item)) - hcenter(item) + effectiveHCenterOffset,
191 vcenter(readParentItem(item)) - vcenter(item) + vCenterOffset);
192 setItemPos(p);
193
194 } else if (readParentItem(centerIn) == readParentItem(item)) {
195 QPointF p(centerIn->x() + hcenter(centerIn) - hcenter(item) + effectiveHCenterOffset,
196 centerIn->y() + vcenter(centerIn) - vcenter(item) + vCenterOffset);
197 setItemPos(p);
198 }
199
200 --updatingCenterIn;
201 } else {
202 // ### Make this certain :)
203 qmlWarning(item) << QQuickAnchors::tr("Possible anchor loop detected on centerIn.");
204 }
205}
206
207void QQuickAnchorsPrivate::clearItem(QQuickItem *item)
208{
209 if (!item)
210 return;
211 if (fill == item)
212 fill = nullptr;
213 if (centerIn == item)
214 centerIn = nullptr;
215 if (leftAnchorItem == item) {
216 leftAnchorItem = nullptr;
217 usedAnchors &= ~QQuickAnchors::LeftAnchor;
218 }
219 if (rightAnchorItem == item) {
220 rightAnchorItem = nullptr;
221 usedAnchors &= ~QQuickAnchors::RightAnchor;
222 }
223 if (topAnchorItem == item) {
224 topAnchorItem = nullptr;
225 usedAnchors &= ~QQuickAnchors::TopAnchor;
226 }
227 if (bottomAnchorItem == item) {
228 bottomAnchorItem = nullptr;
229 usedAnchors &= ~QQuickAnchors::BottomAnchor;
230 }
231 if (vCenterAnchorItem == item) {
232 vCenterAnchorItem = nullptr;
233 usedAnchors &= ~QQuickAnchors::VCenterAnchor;
234 }
235 if (hCenterAnchorItem == item) {
236 hCenterAnchorItem = nullptr;
237 usedAnchors &= ~QQuickAnchors::HCenterAnchor;
238 }
239 if (baselineAnchorItem == item) {
240 baselineAnchorItem = nullptr;
241 usedAnchors &= ~QQuickAnchors::BaselineAnchor;
242 }
243}
244
246{
247 QQuickGeometryChange dependency;
248
249 if (!controlItem || inDestructor)
250 return dependency;
251
252 if (fill == controlItem) {
253 if (controlItem == readParentItem(item))
254 dependency.setSizeChange(true);
255 else //sibling
256 dependency.setAllChanged(true);
257 return dependency; //exit early
258 }
259
260 if (centerIn == controlItem) {
261 if (controlItem == readParentItem(item))
262 dependency.setSizeChange(true);
263 else //sibling
264 dependency.setAllChanged(true);
265 return dependency; //exit early
266 }
267
268 if ((usedAnchors & QQuickAnchors::LeftAnchor && leftAnchorItem == controlItem) ||
269 (usedAnchors & QQuickAnchors::RightAnchor && rightAnchorItem == controlItem) ||
270 (usedAnchors & QQuickAnchors::HCenterAnchor && hCenterAnchorItem == controlItem)) {
271 if (controlItem == readParentItem(item))
272 dependency.setWidthChange(true);
273 else //sibling
274 dependency.setHorizontalChange(true);
275 }
276
277 if ((usedAnchors & QQuickAnchors::TopAnchor && topAnchorItem == controlItem) ||
278 (usedAnchors & QQuickAnchors::BottomAnchor && bottomAnchorItem == controlItem) ||
279 (usedAnchors & QQuickAnchors::VCenterAnchor && vCenterAnchorItem == controlItem) ||
280 (usedAnchors & QQuickAnchors::BaselineAnchor && baselineAnchorItem == controlItem)) {
281 if (controlItem == readParentItem(item))
282 dependency.setHeightChange(true);
283 else //sibling
284 dependency.setVerticalChange(true);
285 }
286
287 return dependency;
288}
289
290void QQuickAnchorsPrivate::addDepend(QQuickItem *item)
291{
292 if (!item || !componentComplete)
293 return;
294
295 QQuickItemPrivate *p = QQuickItemPrivate::get(item);
296 p->updateOrAddGeometryChangeListener(this, calculateDependency(item));
297}
298
299void QQuickAnchorsPrivate::remDepend(QQuickItem *item)
300{
301 if (!item || !componentComplete)
302 return;
303
304 QQuickItemPrivate *p = QQuickItemPrivate::get(item);
305 p->updateOrRemoveGeometryChangeListener(this, calculateDependency(item));
306}
307
308bool QQuickAnchors::mirrored()
309{
310 Q_D(QQuickAnchors);
311 return QQuickItemPrivate::get(d->item)->effectiveLayoutMirror;
312}
313
314bool QQuickAnchors::alignWhenCentered() const
315{
316 Q_D(const QQuickAnchors);
317 return d->centerAligned;
318}
319
320void QQuickAnchors::setAlignWhenCentered(bool aligned)
321{
322 Q_D(QQuickAnchors);
323 if (aligned == d->centerAligned)
324 return;
325 d->centerAligned = aligned;
326 emit centerAlignedChanged();
327 if (d->centerIn) {
328 d->centerInChanged();
329 } else {
330 if (d->usedAnchors & QQuickAnchors::VCenterAnchor)
331 d->updateVerticalAnchors();
332 else if (d->usedAnchors & QQuickAnchors::HCenterAnchor)
333 d->updateHorizontalAnchors();
334 }
335}
336
338{
339 return componentComplete;
340}
341
342void QQuickAnchors::classBegin()
343{
344 Q_D(QQuickAnchors);
345 d->componentComplete = false;
346}
347
348void QQuickAnchors::componentComplete()
349{
350 Q_D(QQuickAnchors);
351 d->componentComplete = true;
352}
353
355{
356 updatingMe = true;
357 item->setHeight(v);
358 updatingMe = false;
359}
360
362{
363 updatingMe = true;
364 item->setWidth(v);
365 updatingMe = false;
366}
367
369{
370 updatingMe = true;
371 item->setX(v);
372 updatingMe = false;
373}
374
376{
377 updatingMe = true;
378 item->setY(v);
379 updatingMe = false;
380}
381
382void QQuickAnchorsPrivate::setItemPos(const QPointF &v)
383{
384 updatingMe = true;
385 item->setPosition(v);
386 updatingMe = false;
387}
388
389void QQuickAnchorsPrivate::setItemSize(const QSizeF &v)
390{
391 updatingMe = true;
392 item->setSize(v);
393 updatingMe = false;
394}
395
397{
398 if (updatingMe) {
399 updatingMe = false;
400 return;
401 }
402
403 update();
404}
405
407{
408 //optimization to only set initial dependencies once, at completion time
409 QQuickItem *dependencies[9];
410 dependencies[0] = fill;
411 dependencies[1] = centerIn;
412 dependencies[2] = leftAnchorItem;
413 dependencies[3] = rightAnchorItem;
414 dependencies[4] = hCenterAnchorItem;
415 dependencies[5] = topAnchorItem;
416 dependencies[6] = bottomAnchorItem;
417 dependencies[7] = vCenterAnchorItem;
418 dependencies[8] = baselineAnchorItem;
419
420 std::sort(dependencies, dependencies + 9);
421
422 QQuickItem *lastDependency = nullptr;
423 for (int i = 0; i < 9; ++i) {
424 QQuickItem *dependency = dependencies[i];
425 if (lastDependency != dependency) {
426 addDepend(dependency);
427 lastDependency = dependency;
428 }
429 }
430
431 update();
432}
433
434
436{
437 if (!isItemComplete())
438 return;
439
440 if (fill) {
442 } else if (centerIn) {
444 } else {
445 if (usedAnchors & QQuickAnchors::Horizontal_Mask)
447 if (usedAnchors & QQuickAnchors::Vertical_Mask)
449 }
450}
451
452void QQuickAnchorsPrivate::itemGeometryChanged(QQuickItem *, QQuickGeometryChange change, const QRectF &)
453{
454 if (!isItemComplete())
455 return;
456
457 if (fill) {
459 } else if (centerIn) {
461 } else {
462 if ((usedAnchors & QQuickAnchors::Horizontal_Mask) && change.horizontalChange())
464 if ((usedAnchors & QQuickAnchors::Vertical_Mask) && change.verticalChange())
466 }
467}
468
469QQuickItem *QQuickAnchors::fill() const
470{
471 Q_D(const QQuickAnchors);
472 return d->fill;
473}
474
475void QQuickAnchors::setFill(QQuickItem *f)
476{
477 Q_D(QQuickAnchors);
478 if (d->fill == f)
479 return;
480
481 if (!f) {
482 QQuickItem *oldFill = d->fill;
483 d->fill = f;
484 d->remDepend(oldFill);
485 emit fillChanged();
486 return;
487 }
488 if (f != readParentItem(d->item) && readParentItem(f) != readParentItem(d->item)){
489 qmlWarning(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
490 return;
491 }
492 QQuickItem *oldFill = d->fill;
493 d->fill = f;
494 d->remDepend(oldFill);
495 d->addDepend(d->fill);
496 emit fillChanged();
497 d->fillChanged();
498}
499
500void QQuickAnchors::resetFill()
501{
502 setFill(nullptr);
503}
504
505QQuickItem *QQuickAnchors::centerIn() const
506{
507 Q_D(const QQuickAnchors);
508 return d->centerIn;
509}
510
511void QQuickAnchors::setCenterIn(QQuickItem* c)
512{
513 Q_D(QQuickAnchors);
514 if (d->centerIn == c)
515 return;
516
517 if (!c) {
518 QQuickItem *oldCI = d->centerIn;
519 d->centerIn = c;
520 d->remDepend(oldCI);
521 emit centerInChanged();
522 return;
523 }
524 if (c != readParentItem(d->item) && readParentItem(c) != readParentItem(d->item)){
525 qmlWarning(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
526 return;
527 }
528 QQuickItem *oldCI = d->centerIn;
529 d->centerIn = c;
530 d->remDepend(oldCI);
531 d->addDepend(d->centerIn);
532 emit centerInChanged();
533 d->centerInChanged();
534}
535
536void QQuickAnchors::resetCenterIn()
537{
538 setCenterIn(nullptr);
539}
540
541bool QQuickAnchorsPrivate::calcStretch(QQuickItem *edge1Item,
542 QQuickAnchors::Anchor edge1Line,
543 QQuickItem *edge2Item,
544 QQuickAnchors::Anchor edge2Line,
545 qreal offset1,
546 qreal offset2,
547 QQuickAnchors::Anchor line,
548 qreal &stretch) const
549{
550 bool edge1IsParent = (edge1Item == readParentItem(item));
551 bool edge2IsParent = (edge2Item == readParentItem(item));
552 bool edge1IsSibling = (readParentItem(edge1Item) == readParentItem(item));
553 bool edge2IsSibling = (readParentItem(edge2Item) == readParentItem(item));
554
555 bool invalid = false;
556 if ((edge2IsParent && edge1IsParent) || (edge2IsSibling && edge1IsSibling)) {
557 stretch = (position(edge2Item, edge2Line) + offset2)
558 - (position(edge1Item, edge1Line) + offset1);
559 } else if (edge2IsParent && edge1IsSibling) {
560 stretch = (position(edge2Item, edge2Line) + offset2)
561 - (position(readParentItem(item), line)
562 + position(edge1Item, edge1Line) + offset1);
563 } else if (edge2IsSibling && edge1IsParent) {
564 stretch = (position(readParentItem(item), line) + position(edge2Item, edge2Line) + offset2)
565 - (position(edge1Item, edge1Line) + offset1);
566 } else
567 invalid = true;
568
569 return invalid;
570}
571
573{
574 if (fill || centerIn || !isItemComplete())
575 return;
576
577 if (Q_UNLIKELY(updatingVerticalAnchor > 1)) {
578 // ### Make this certain :)
579 qmlWarning(item) << QQuickAnchors::tr("Possible anchor loop detected on vertical anchor.");
580 return;
581 }
582
583 ++updatingVerticalAnchor;
584 if (usedAnchors & QQuickAnchors::TopAnchor) {
585 //Handle stretching
586 bool invalid = true;
587 qreal height = 0.0;
588 if (usedAnchors & QQuickAnchors::BottomAnchor) {
589 invalid = calcStretch(topAnchorItem, topAnchorLine,
590 bottomAnchorItem, bottomAnchorLine,
591 topMargin, -bottomMargin, QQuickAnchors::TopAnchor, height);
592 } else if (usedAnchors & QQuickAnchors::VCenterAnchor) {
593 invalid = calcStretch(topAnchorItem, topAnchorLine,
594 vCenterAnchorItem, vCenterAnchorLine,
595 topMargin, vCenterOffset, QQuickAnchors::TopAnchor, height);
596 height *= 2;
597 }
598 if (!invalid)
599 setItemHeight(height);
600
601 //Handle top
602 if (topAnchorItem == readParentItem(item)) {
603 setItemY(adjustedPosition(topAnchorItem, topAnchorLine) + topMargin);
604 } else if (readParentItem(topAnchorItem) == readParentItem(item)) {
605 setItemY(position(topAnchorItem, topAnchorLine) + topMargin);
606 }
607 } else if (usedAnchors & QQuickAnchors::BottomAnchor) {
608 //Handle stretching (top + bottom case is handled above)
609 if (usedAnchors & QQuickAnchors::VCenterAnchor) {
610 qreal height = 0.0;
611 bool invalid = calcStretch(vCenterAnchorItem, vCenterAnchorLine,
612 bottomAnchorItem, bottomAnchorLine,
613 vCenterOffset, -bottomMargin, QQuickAnchors::TopAnchor,
614 height);
615 if (!invalid)
616 setItemHeight(height*2);
617 }
618
619 //Handle bottom
620 if (bottomAnchorItem == readParentItem(item)) {
621 setItemY(adjustedPosition(bottomAnchorItem, bottomAnchorLine) - readHeight(item) - bottomMargin);
622 } else if (readParentItem(bottomAnchorItem) == readParentItem(item)) {
623 setItemY(position(bottomAnchorItem, bottomAnchorLine) - readHeight(item) - bottomMargin);
624 }
625 } else if (usedAnchors & QQuickAnchors::VCenterAnchor) {
626 //(stetching handled above)
627
628 //Handle vCenter
629 if (vCenterAnchorItem == readParentItem(item)) {
630 setItemY(adjustedPosition(vCenterAnchorItem, vCenterAnchorLine)
631 - vcenter(item) + vCenterOffset);
632 } else if (readParentItem(vCenterAnchorItem) == readParentItem(item)) {
633 setItemY(position(vCenterAnchorItem, vCenterAnchorLine) - vcenter(item) + vCenterOffset);
634 }
635 } else if (usedAnchors & QQuickAnchors::BaselineAnchor) {
636 //Handle baseline
637 if (baselineAnchorItem == readParentItem(item)) {
638 setItemY(adjustedPosition(baselineAnchorItem, baselineAnchorLine)
639 - readBaselineOffset(item) + baselineOffset);
640 } else if (readParentItem(baselineAnchorItem) == readParentItem(item)) {
641 setItemY(position(baselineAnchorItem, baselineAnchorLine)
642 - readBaselineOffset(item) + baselineOffset);
643 }
644 }
645 --updatingVerticalAnchor;
646}
647
648static inline QQuickAnchors::Anchor reverseAnchorLine(QQuickAnchors::Anchor anchorLine)
649{
650 if (anchorLine == QQuickAnchors::LeftAnchor) {
651 return QQuickAnchors::RightAnchor;
652 } else if (anchorLine == QQuickAnchors::RightAnchor) {
653 return QQuickAnchors::LeftAnchor;
654 } else {
655 return anchorLine;
656 }
657}
658
660{
661 Q_Q(QQuickAnchors);
662 if (fill || centerIn || !isItemComplete())
663 return;
664
665 if (updatingHorizontalAnchor < 3) {
666 ++updatingHorizontalAnchor;
667 qreal effectiveRightMargin, effectiveLeftMargin, effectiveHorizontalCenterOffset;
668 QQuickItem *effectiveLeftItem, *effectiveRightItem, *effectiveHorizontalCenterItem;
669 QQuickAnchors::Anchor effectiveLeftLine, effectiveRightLine, effectiveHorizontalCenterLine;
670 QQuickAnchors::Anchor effectiveLeftAnchor, effectiveRightAnchor;
671 if (q->mirrored()) {
672 effectiveLeftAnchor = QQuickAnchors::RightAnchor;
673 effectiveRightAnchor = QQuickAnchors::LeftAnchor;
674 effectiveLeftItem = rightAnchorItem;
675 effectiveLeftLine = reverseAnchorLine(rightAnchorLine);
676 effectiveRightItem = leftAnchorItem;
677 effectiveRightLine = reverseAnchorLine(leftAnchorLine);
678 effectiveHorizontalCenterItem = hCenterAnchorItem;
679 effectiveHorizontalCenterLine = reverseAnchorLine(hCenterAnchorLine);
680 effectiveLeftMargin = rightMargin;
681 effectiveRightMargin = leftMargin;
682 effectiveHorizontalCenterOffset = -hCenterOffset;
683 } else {
684 effectiveLeftAnchor = QQuickAnchors::LeftAnchor;
685 effectiveRightAnchor = QQuickAnchors::RightAnchor;
686 effectiveLeftItem = leftAnchorItem;
687 effectiveLeftLine = leftAnchorLine;
688 effectiveRightItem = rightAnchorItem;
689 effectiveRightLine = rightAnchorLine;
690 effectiveHorizontalCenterItem = hCenterAnchorItem;
691 effectiveHorizontalCenterLine = hCenterAnchorLine;
692 effectiveLeftMargin = leftMargin;
693 effectiveRightMargin = rightMargin;
694 effectiveHorizontalCenterOffset = hCenterOffset;
695 }
696
697 if (usedAnchors & effectiveLeftAnchor) {
698 //Handle stretching
699 bool invalid = true;
700 qreal width = 0.0;
701 if (usedAnchors & effectiveRightAnchor) {
702 invalid = calcStretch(effectiveLeftItem, effectiveLeftLine,
703 effectiveRightItem, effectiveRightLine,
704 effectiveLeftMargin, -effectiveRightMargin,
705 QQuickAnchors::LeftAnchor, width);
706 } else if (usedAnchors & QQuickAnchors::HCenterAnchor) {
707 invalid = calcStretch(effectiveLeftItem, effectiveLeftLine,
708 effectiveHorizontalCenterItem, effectiveHorizontalCenterLine,
709 effectiveLeftMargin, effectiveHorizontalCenterOffset,
710 QQuickAnchors::LeftAnchor, width);
711 width *= 2;
712 }
713 if (!invalid)
714 setItemWidth(width);
715
716 //Handle left
717 if (effectiveLeftItem == readParentItem(item)) {
718 setItemX(adjustedPosition(effectiveLeftItem, effectiveLeftLine) + effectiveLeftMargin);
719 } else if (readParentItem(effectiveLeftItem) == readParentItem(item)) {
720 setItemX(position(effectiveLeftItem, effectiveLeftLine) + effectiveLeftMargin);
721 }
722 } else if (usedAnchors & effectiveRightAnchor) {
723 //Handle stretching (left + right case is handled in updateLeftAnchor)
724 if (usedAnchors & QQuickAnchors::HCenterAnchor) {
725 qreal width = 0.0;
726 bool invalid = calcStretch(effectiveHorizontalCenterItem,
727 effectiveHorizontalCenterLine,
728 effectiveRightItem, effectiveRightLine,
729 effectiveHorizontalCenterOffset, -effectiveRightMargin,
730 QQuickAnchors::LeftAnchor, width);
731 if (!invalid)
732 setItemWidth(width*2);
733 }
734
735 //Handle right
736 if (effectiveRightItem == readParentItem(item)) {
737 setItemX(adjustedPosition(effectiveRightItem, effectiveRightLine)
738 - readWidth(item) - effectiveRightMargin);
739 } else if (readParentItem(effectiveRightItem) == readParentItem(item)) {
740 setItemX(position(effectiveRightItem, effectiveRightLine)
741 - readWidth(item) - effectiveRightMargin);
742 }
743 } else if (usedAnchors & QQuickAnchors::HCenterAnchor) {
744 //Handle hCenter
745 if (effectiveHorizontalCenterItem == readParentItem(item)) {
746 setItemX(adjustedPosition(effectiveHorizontalCenterItem, effectiveHorizontalCenterLine) - hcenter(item) + effectiveHorizontalCenterOffset);
747 } else if (readParentItem(effectiveHorizontalCenterItem) == readParentItem(item)) {
748 setItemX(position(effectiveHorizontalCenterItem, effectiveHorizontalCenterLine) - hcenter(item) + effectiveHorizontalCenterOffset);
749 }
750 }
751 --updatingHorizontalAnchor;
752 } else {
753 // ### Make this certain :)
754 qmlWarning(item) << QQuickAnchors::tr("Possible anchor loop detected on horizontal anchor.");
755 }
756}
757
758QQuickAnchorLine QQuickAnchors::top() const
759{
760 Q_D(const QQuickAnchors);
761 return QQuickAnchorLine(d->topAnchorItem, d->topAnchorLine);
762}
763
764void QQuickAnchors::setTop(const QQuickAnchorLine &edge)
765{
766 Q_D(QQuickAnchors);
767 if (!d->checkVAnchorValid(edge) ||
768 (d->topAnchorItem == edge.item && d->topAnchorLine == edge.anchorLine))
769 return;
770
771 d->usedAnchors |= TopAnchor;
772
773 if (!d->checkVValid()) {
774 d->usedAnchors &= ~TopAnchor;
775 return;
776 }
777
778 QQuickItem *oldTop = d->topAnchorItem;
779 d->topAnchorItem = edge.item;
780 d->topAnchorLine = edge.anchorLine;
781 d->remDepend(oldTop);
782 d->addDepend(d->topAnchorItem);
783 emit topChanged();
784 d->updateVerticalAnchors();
785}
786
787void QQuickAnchors::resetTop()
788{
789 Q_D(QQuickAnchors);
790 d->usedAnchors &= ~TopAnchor;
791 d->remDepend(d->topAnchorItem);
792 d->topAnchorItem = nullptr;
793 d->topAnchorLine = QQuickAnchors::InvalidAnchor;
794 emit topChanged();
795 d->updateVerticalAnchors();
796}
797
798QQuickAnchorLine QQuickAnchors::bottom() const
799{
800 Q_D(const QQuickAnchors);
801 return QQuickAnchorLine(d->bottomAnchorItem, d->bottomAnchorLine);
802}
803
804void QQuickAnchors::setBottom(const QQuickAnchorLine &edge)
805{
806 Q_D(QQuickAnchors);
807 if (!d->checkVAnchorValid(edge) ||
808 (d->bottomAnchorItem == edge.item && d->bottomAnchorLine == edge.anchorLine))
809 return;
810
811 d->usedAnchors |= BottomAnchor;
812
813 if (!d->checkVValid()) {
814 d->usedAnchors &= ~BottomAnchor;
815 return;
816 }
817
818 QQuickItem *oldBottom = d->bottomAnchorItem;
819 d->bottomAnchorItem = edge.item;
820 d->bottomAnchorLine = edge.anchorLine;
821 d->remDepend(oldBottom);
822 d->addDepend(d->bottomAnchorItem);
823 emit bottomChanged();
824 d->updateVerticalAnchors();
825}
826
827void QQuickAnchors::resetBottom()
828{
829 Q_D(QQuickAnchors);
830 d->usedAnchors &= ~BottomAnchor;
831 d->remDepend(d->bottomAnchorItem);
832 d->bottomAnchorItem = nullptr;
833 d->bottomAnchorLine = QQuickAnchors::InvalidAnchor;
834 emit bottomChanged();
835 d->updateVerticalAnchors();
836}
837
838QQuickAnchorLine QQuickAnchors::verticalCenter() const
839{
840 Q_D(const QQuickAnchors);
841 return QQuickAnchorLine(d->vCenterAnchorItem, d->vCenterAnchorLine);
842}
843
844void QQuickAnchors::setVerticalCenter(const QQuickAnchorLine &edge)
845{
846 Q_D(QQuickAnchors);
847 if (!d->checkVAnchorValid(edge) ||
848 (d->vCenterAnchorItem == edge.item && d->vCenterAnchorLine == edge.anchorLine))
849 return;
850
851 d->usedAnchors |= VCenterAnchor;
852
853 if (!d->checkVValid()) {
854 d->usedAnchors &= ~VCenterAnchor;
855 return;
856 }
857
858 QQuickItem *oldVCenter = d->vCenterAnchorItem;
859 d->vCenterAnchorItem = edge.item;
860 d->vCenterAnchorLine = edge.anchorLine;
861 d->remDepend(oldVCenter);
862 d->addDepend(d->vCenterAnchorItem);
863 emit verticalCenterChanged();
864 d->updateVerticalAnchors();
865}
866
867void QQuickAnchors::resetVerticalCenter()
868{
869 Q_D(QQuickAnchors);
870 d->usedAnchors &= ~VCenterAnchor;
871 d->remDepend(d->vCenterAnchorItem);
872 d->vCenterAnchorItem = nullptr;
873 d->vCenterAnchorLine = QQuickAnchors::InvalidAnchor;
874 emit verticalCenterChanged();
875 d->updateVerticalAnchors();
876}
877
878QQuickAnchorLine QQuickAnchors::baseline() const
879{
880 Q_D(const QQuickAnchors);
881 return QQuickAnchorLine(d->baselineAnchorItem, d->baselineAnchorLine);
882}
883
884void QQuickAnchors::setBaseline(const QQuickAnchorLine &edge)
885{
886 Q_D(QQuickAnchors);
887 if (!d->checkVAnchorValid(edge) ||
888 (d->baselineAnchorItem == edge.item && d->baselineAnchorLine == edge.anchorLine))
889 return;
890
891 d->usedAnchors |= BaselineAnchor;
892
893 if (!d->checkVValid()) {
894 d->usedAnchors &= ~BaselineAnchor;
895 return;
896 }
897
898 QQuickItem *oldBaseline = d->baselineAnchorItem;
899 d->baselineAnchorItem = edge.item;
900 d->baselineAnchorLine = edge.anchorLine;
901 d->remDepend(oldBaseline);
902 d->addDepend(d->baselineAnchorItem);
903 emit baselineChanged();
904 d->updateVerticalAnchors();
905}
906
907void QQuickAnchors::resetBaseline()
908{
909 Q_D(QQuickAnchors);
910 d->usedAnchors &= ~BaselineAnchor;
911 d->remDepend(d->baselineAnchorItem);
912 d->baselineAnchorItem = nullptr;
913 d->baselineAnchorLine = QQuickAnchors::InvalidAnchor;
914 emit baselineChanged();
915 d->updateVerticalAnchors();
916}
917
918QQuickAnchorLine QQuickAnchors::left() const
919{
920 Q_D(const QQuickAnchors);
921 return QQuickAnchorLine(d->leftAnchorItem, d->leftAnchorLine);
922}
923
924void QQuickAnchors::setLeft(const QQuickAnchorLine &edge)
925{
926 Q_D(QQuickAnchors);
927 if (!d->checkHAnchorValid(edge) ||
928 (d->leftAnchorItem == edge.item && d->leftAnchorLine == edge.anchorLine))
929 return;
930
931 d->usedAnchors |= LeftAnchor;
932
933 if (!d->checkHValid()) {
934 d->usedAnchors &= ~LeftAnchor;
935 return;
936 }
937
938 QQuickItem *oldLeft = d->leftAnchorItem;
939 d->leftAnchorItem = edge.item;
940 d->leftAnchorLine = edge.anchorLine;
941 d->remDepend(oldLeft);
942 d->addDepend(d->leftAnchorItem);
943 emit leftChanged();
944 d->updateHorizontalAnchors();
945}
946
947void QQuickAnchors::resetLeft()
948{
949 Q_D(QQuickAnchors);
950 d->usedAnchors &= ~LeftAnchor;
951 d->remDepend(d->leftAnchorItem);
952 d->leftAnchorItem = nullptr;
953 d->leftAnchorLine = QQuickAnchors::InvalidAnchor;
954 emit leftChanged();
955 d->updateHorizontalAnchors();
956}
957
958QQuickAnchorLine QQuickAnchors::right() const
959{
960 Q_D(const QQuickAnchors);
961 return QQuickAnchorLine(d->rightAnchorItem, d->rightAnchorLine);
962}
963
964void QQuickAnchors::setRight(const QQuickAnchorLine &edge)
965{
966 Q_D(QQuickAnchors);
967 if (!d->checkHAnchorValid(edge) ||
968 (d->rightAnchorItem == edge.item && d->rightAnchorLine == edge.anchorLine))
969 return;
970
971 d->usedAnchors |= RightAnchor;
972
973 if (!d->checkHValid()) {
974 d->usedAnchors &= ~RightAnchor;
975 return;
976 }
977
978 QQuickItem *oldRight = d->rightAnchorItem;
979 d->rightAnchorItem = edge.item;
980 d->rightAnchorLine = edge.anchorLine;
981 d->remDepend(oldRight);
982 d->addDepend(d->rightAnchorItem);
983 emit rightChanged();
984 d->updateHorizontalAnchors();
985}
986
987void QQuickAnchors::resetRight()
988{
989 Q_D(QQuickAnchors);
990 d->usedAnchors &= ~RightAnchor;
991 d->remDepend(d->rightAnchorItem);
992 d->rightAnchorItem = nullptr;
993 d->rightAnchorLine = QQuickAnchors::InvalidAnchor;
994 emit rightChanged();
995 d->updateHorizontalAnchors();
996}
997
998QQuickAnchorLine QQuickAnchors::horizontalCenter() const
999{
1000 Q_D(const QQuickAnchors);
1001 return QQuickAnchorLine(d->hCenterAnchorItem, d->hCenterAnchorLine);
1002}
1003
1004void QQuickAnchors::setHorizontalCenter(const QQuickAnchorLine &edge)
1005{
1006 Q_D(QQuickAnchors);
1007 if (!d->checkHAnchorValid(edge) ||
1008 (d->hCenterAnchorItem == edge.item && d->hCenterAnchorLine == edge.anchorLine))
1009 return;
1010
1011 d->usedAnchors |= HCenterAnchor;
1012
1013 if (!d->checkHValid()) {
1014 d->usedAnchors &= ~HCenterAnchor;
1015 return;
1016 }
1017
1018 QQuickItem *oldHCenter = d->hCenterAnchorItem;
1019 d->hCenterAnchorItem = edge.item;
1020 d->hCenterAnchorLine = edge.anchorLine;
1021 d->remDepend(oldHCenter);
1022 d->addDepend(d->hCenterAnchorItem);
1023 emit horizontalCenterChanged();
1024 d->updateHorizontalAnchors();
1025}
1026
1027void QQuickAnchors::resetHorizontalCenter()
1028{
1029 Q_D(QQuickAnchors);
1030 d->usedAnchors &= ~HCenterAnchor;
1031 d->remDepend(d->hCenterAnchorItem);
1032 d->hCenterAnchorItem = nullptr;
1033 d->hCenterAnchorLine = QQuickAnchors::InvalidAnchor;
1034 emit horizontalCenterChanged();
1035 d->updateHorizontalAnchors();
1036}
1037
1038qreal QQuickAnchors::leftMargin() const
1039{
1040 Q_D(const QQuickAnchors);
1041 return d->leftMargin;
1042}
1043
1044void QQuickAnchors::setLeftMargin(qreal offset)
1045{
1046 Q_D(QQuickAnchors);
1047 d->leftMarginExplicit = true;
1048 if (d->leftMargin == offset)
1049 return;
1050 d->leftMargin = offset;
1051 if (d->fill)
1052 d->fillChanged();
1053 else
1054 d->updateHorizontalAnchors();
1055 emit leftMarginChanged();
1056}
1057
1058void QQuickAnchors::resetLeftMargin()
1059{
1060 Q_D(QQuickAnchors);
1061 d->leftMarginExplicit = false;
1062 if (d->leftMargin == d->margins)
1063 return;
1064 d->leftMargin = d->margins;
1065 if (d->fill)
1066 d->fillChanged();
1067 else
1068 d->updateHorizontalAnchors();
1069 emit leftMarginChanged();
1070}
1071
1072qreal QQuickAnchors::rightMargin() const
1073{
1074 Q_D(const QQuickAnchors);
1075 return d->rightMargin;
1076}
1077
1078void QQuickAnchors::setRightMargin(qreal offset)
1079{
1080 Q_D(QQuickAnchors);
1081 d->rightMarginExplicit = true;
1082 if (d->rightMargin == offset)
1083 return;
1084 d->rightMargin = offset;
1085 if (d->fill)
1086 d->fillChanged();
1087 else
1088 d->updateHorizontalAnchors();
1089 emit rightMarginChanged();
1090}
1091
1092void QQuickAnchors::resetRightMargin()
1093{
1094 Q_D(QQuickAnchors);
1095 d->rightMarginExplicit = false;
1096 if (d->rightMargin == d->margins)
1097 return;
1098 d->rightMargin = d->margins;
1099 if (d->fill)
1100 d->fillChanged();
1101 else
1102 d->updateHorizontalAnchors();
1103 emit rightMarginChanged();
1104}
1105
1106qreal QQuickAnchors::margins() const
1107{
1108 Q_D(const QQuickAnchors);
1109 return d->margins;
1110}
1111
1112void QQuickAnchors::setMargins(qreal offset)
1113{
1114 Q_D(QQuickAnchors);
1115 if (d->margins == offset)
1116 return;
1117 d->margins = offset;
1118
1119 bool updateHorizontal = false;
1120 bool updateVertical = false;
1121
1122 if (!d->rightMarginExplicit && d->rightMargin != offset) {
1123 d->rightMargin = offset;
1124 updateHorizontal = true;
1125 emit rightMarginChanged();
1126 }
1127 if (!d->leftMarginExplicit && d->leftMargin != offset) {
1128 d->leftMargin = offset;
1129 updateHorizontal = true;
1130 emit leftMarginChanged();
1131 }
1132 if (!d->topMarginExplicit && d->topMargin != offset) {
1133 d->topMargin = offset;
1134 updateVertical = true;
1135 emit topMarginChanged();
1136 }
1137 if (!d->bottomMarginExplicit && d->bottomMargin != offset) {
1138 d->bottomMargin = offset;
1139 updateVertical = true;
1140 emit bottomMarginChanged();
1141 }
1142
1143 if (d->fill) {
1144 if (updateHorizontal || updateVertical)
1145 d->fillChanged();
1146 } else {
1147 if (updateHorizontal)
1148 d->updateHorizontalAnchors();
1149 if (updateVertical)
1150 d->updateVerticalAnchors();
1151 }
1152
1153 emit marginsChanged();
1154}
1155
1156qreal QQuickAnchors::horizontalCenterOffset() const
1157{
1158 Q_D(const QQuickAnchors);
1159 return d->hCenterOffset;
1160}
1161
1162void QQuickAnchors::setHorizontalCenterOffset(qreal offset)
1163{
1164 Q_D(QQuickAnchors);
1165 if (d->hCenterOffset == offset)
1166 return;
1167 d->hCenterOffset = offset;
1168 if (d->centerIn)
1169 d->centerInChanged();
1170 else
1171 d->updateHorizontalAnchors();
1172 emit horizontalCenterOffsetChanged();
1173}
1174
1175qreal QQuickAnchors::topMargin() const
1176{
1177 Q_D(const QQuickAnchors);
1178 return d->topMargin;
1179}
1180
1181void QQuickAnchors::setTopMargin(qreal offset)
1182{
1183 Q_D(QQuickAnchors);
1184 d->topMarginExplicit = true;
1185 if (d->topMargin == offset)
1186 return;
1187 d->topMargin = offset;
1188 if (d->fill)
1189 d->fillChanged();
1190 else
1191 d->updateVerticalAnchors();
1192 emit topMarginChanged();
1193}
1194
1195void QQuickAnchors::resetTopMargin()
1196{
1197 Q_D(QQuickAnchors);
1198 d->topMarginExplicit = false;
1199 if (d->topMargin == d->margins)
1200 return;
1201 d->topMargin = d->margins;
1202 if (d->fill)
1203 d->fillChanged();
1204 else
1205 d->updateVerticalAnchors();
1206 emit topMarginChanged();
1207}
1208
1209qreal QQuickAnchors::bottomMargin() const
1210{
1211 Q_D(const QQuickAnchors);
1212 return d->bottomMargin;
1213}
1214
1215void QQuickAnchors::setBottomMargin(qreal offset)
1216{
1217 Q_D(QQuickAnchors);
1218 d->bottomMarginExplicit = true;
1219 if (d->bottomMargin == offset)
1220 return;
1221 d->bottomMargin = offset;
1222 if (d->fill)
1223 d->fillChanged();
1224 else
1225 d->updateVerticalAnchors();
1226 emit bottomMarginChanged();
1227}
1228
1229void QQuickAnchors::resetBottomMargin()
1230{
1231 Q_D(QQuickAnchors);
1232 d->bottomMarginExplicit = false;
1233 if (d->bottomMargin == d->margins)
1234 return;
1235 d->bottomMargin = d->margins;
1236 if (d->fill)
1237 d->fillChanged();
1238 else
1239 d->updateVerticalAnchors();
1240 emit bottomMarginChanged();
1241}
1242
1243qreal QQuickAnchors::verticalCenterOffset() const
1244{
1245 Q_D(const QQuickAnchors);
1246 return d->vCenterOffset;
1247}
1248
1249void QQuickAnchors::setVerticalCenterOffset(qreal offset)
1250{
1251 Q_D(QQuickAnchors);
1252 if (d->vCenterOffset == offset)
1253 return;
1254 d->vCenterOffset = offset;
1255 if (d->centerIn)
1256 d->centerInChanged();
1257 else
1258 d->updateVerticalAnchors();
1259 emit verticalCenterOffsetChanged();
1260}
1261
1262qreal QQuickAnchors::baselineOffset() const
1263{
1264 Q_D(const QQuickAnchors);
1265 return d->baselineOffset;
1266}
1267
1268void QQuickAnchors::setBaselineOffset(qreal offset)
1269{
1270 Q_D(QQuickAnchors);
1271 if (d->baselineOffset == offset)
1272 return;
1273 d->baselineOffset = offset;
1274 d->updateVerticalAnchors();
1275 emit baselineOffsetChanged();
1276}
1277
1278QQuickAnchors::Anchors QQuickAnchors::usedAnchors() const
1279{
1280 Q_D(const QQuickAnchors);
1281 return static_cast<QQuickAnchors::Anchors>(d->usedAnchors);
1282}
1283
1284Qt::Orientations QQuickAnchors::activeDirections() const
1285{
1286 Q_D(const QQuickAnchors);
1287 if (d->fill || d->centerIn)
1288 return Qt::Horizontal | Qt::Vertical;
1289 Qt::Orientations o;
1290 if (d->usedAnchors & QQuickAnchors::Horizontal_Mask)
1291 o |= Qt::Horizontal;
1292 if (d->usedAnchors & QQuickAnchors::Vertical_Mask)
1293 o |= Qt::Vertical;
1294 return o;
1295}
1296
1298{
1299 if (usedAnchors & QQuickAnchors::LeftAnchor &&
1300 usedAnchors & QQuickAnchors::RightAnchor &&
1301 usedAnchors & QQuickAnchors::HCenterAnchor) {
1302 qmlWarning(item) << QQuickAnchors::tr("Cannot specify left, right, and horizontalCenter anchors at the same time.");
1303 return false;
1304 }
1305
1306 return true;
1307}
1308
1309bool QQuickAnchorsPrivate::checkHAnchorValid(QQuickAnchorLine anchor) const
1310{
1311 if (!anchor.item) {
1312 qmlWarning(item) << QQuickAnchors::tr("Cannot anchor to a null item.");
1313 return false;
1314 } else if (anchor.anchorLine & QQuickAnchors::Vertical_Mask) {
1315 qmlWarning(item) << QQuickAnchors::tr("Cannot anchor a horizontal edge to a vertical edge.");
1316 return false;
1317 } else if (anchor.item != readParentItem(item)
1318 && readParentItem(anchor.item) != readParentItem(item)) {
1319 qmlWarning(item) << QQuickAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
1320 return false;
1321 } else if (anchor.item == item) {
1322 qmlWarning(item) << QQuickAnchors::tr("Cannot anchor item to self.");
1323 return false;
1324 }
1325
1326 return true;
1327}
1328
1330{
1331 if (usedAnchors & QQuickAnchors::TopAnchor &&
1332 usedAnchors & QQuickAnchors::BottomAnchor &&
1333 usedAnchors & QQuickAnchors::VCenterAnchor) {
1334 qmlWarning(item) << QQuickAnchors::tr("Cannot specify top, bottom, and verticalCenter anchors at the same time.");
1335 return false;
1336 } else if (usedAnchors & QQuickAnchors::BaselineAnchor &&
1337 (usedAnchors & QQuickAnchors::TopAnchor ||
1338 usedAnchors & QQuickAnchors::BottomAnchor ||
1339 usedAnchors & QQuickAnchors::VCenterAnchor)) {
1340 qmlWarning(item) << QQuickAnchors::tr("Baseline anchor cannot be used in conjunction with top, bottom, or verticalCenter anchors.");
1341 return false;
1342 }
1343
1344 return true;
1345}
1346
1347bool QQuickAnchorsPrivate::checkVAnchorValid(QQuickAnchorLine anchor) const
1348{
1349 if (!anchor.item) {
1350 qmlWarning(item) << QQuickAnchors::tr("Cannot anchor to a null item.");
1351 return false;
1352 } else if (anchor.anchorLine & QQuickAnchors::Horizontal_Mask) {
1353 qmlWarning(item) << QQuickAnchors::tr("Cannot anchor a vertical edge to a horizontal edge.");
1354 return false;
1355 } else if (anchor.item != readParentItem(item)
1356 && readParentItem(anchor.item) != readParentItem(item)) {
1357 qmlWarning(item) << QQuickAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
1358 return false;
1359 } else if (anchor.item == item){
1360 qmlWarning(item) << QQuickAnchors::tr("Cannot anchor item to self.");
1361 return false;
1362 }
1363
1364 return true;
1365}
1366
1367QT_END_NAMESPACE
1368
1369#include "moc_qquickanchors_p_p.cpp"
1370
1371#include <moc_qquickanchors_p.cpp>
bool checkHAnchorValid(QQuickAnchorLine anchor) const
bool isItemComplete() const
void remDepend(QQuickItem *)
QQuickGeometryChange calculateDependency(QQuickItem *) const
bool checkVAnchorValid(QQuickAnchorLine anchor) const
void addDepend(QQuickItem *)
void setItemSize(const QSizeF &)
void itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) override
QQuickItem * baselineAnchorItem
bool calcStretch(QQuickItem *edge1Item, QQuickAnchors::Anchor edge1Line, QQuickItem *edge2Item, QQuickAnchors::Anchor edge2Line, qreal offset1, qreal offset2, QQuickAnchors::Anchor line, qreal &stretch) const
void setItemPos(const QPointF &)
void setVerticalChange(bool enabled)
void setHorizontalChange(bool enabled)
static qreal hcenter(const QQuickItem *item)
static qreal vcenter(const QQuickItem *item)
static QQuickAnchors::Anchor reverseAnchorLine(QQuickAnchors::Anchor anchorLine)
static qreal adjustedPosition(QQuickItem *item, QQuickAnchors::Anchor anchorLine)
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)