9#include <QtQml/qqmlinfo.h>
10#include <QtQuick/private/qquickflickable_p.h>
11#if QT_CONFIG(accessibility)
12#include <QtQuick/private/qquickaccessibleattached_p.h>
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
134 qreal visualPos = position;
136 if (minimumSize > size && size != 1.0)
137 visualPos = position / (1.0 - size) * (1.0 - minimumSize);
139 qreal maximumSize = qMax<qreal>(0.0, 1.0 - visualPos);
140 qreal visualSize = qMax<qreal>(minimumSize,
141 qMin<qreal>(qMax(size, minimumSize) + qMin<qreal>(0, visualPos),
144 visualPos = qMax<qreal>(0,qMin<qreal>(visualPos,qMax<qreal>(0, 1.0 - visualSize)));
146 return VisualArea(visualPos, visualSize);
151 if (minimumSize > size && minimumSize != 1.0)
152 return position * (1.0 - size) / (1.0 - minimumSize);
158 const qreal effectiveStep = stepSize * (1.0 - size);
159 if (qFuzzyIsNull(effectiveStep))
162 return qRound(position / effectiveStep) * effectiveStep;
167 Q_Q(
const QQuickScrollBar);
168 if (orientation == Qt::Horizontal)
169 return logicalPosition(point.x() - q->leftPadding()) / q->availableWidth();
171 return logicalPosition(point.y() - q->topPadding()) / q->availableHeight();
176 Q_Q(QQuickScrollBar);
182 q->setAcceptedMouseButtons(Qt::LeftButton);
183#if QT_CONFIG(quicktemplates2_multitouch)
184 q->setAcceptTouchEvents(
true);
187 q->setCursor(Qt::ArrowCursor);
190 q->setAcceptedMouseButtons(Qt::NoButton);
191#if QT_CONFIG(quicktemplates2_multitouch)
192 q->setAcceptTouchEvents(
false);
199 emit q->interactiveChanged();
204 Q_Q(QQuickScrollBar);
205#if QT_CONFIG(quicktemplates2_hover)
206 bool hover = hovered;
210 q->setActive(moving || (interactive && (pressed || hover)));
215 Q_Q(QQuickScrollBar);
221 const VisualArea visual = visualArea();
223 if (orientation == Qt::Horizontal) {
224 contentItem->setPosition(QPointF(q->leftPadding() + visual.position * q->availableWidth(), q->topPadding()));
225 contentItem->setSize(QSizeF(q->availableWidth() * visual.size, q->availableHeight()));
227 contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding() + visual.position * q->availableHeight()));
228 contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight() * visual.size));
234 Q_Q(QQuickScrollBar);
235 QQuickControlPrivate::itemImplicitWidthChanged(item);
236 QQuickIndicatorButton *indicatorButton = q->decreaseVisual();
237 if (!indicatorButton || item != indicatorButton->indicator()) {
238 indicatorButton = q->increaseVisual();
239 if (!indicatorButton || item != indicatorButton->indicator())
243 emit indicatorButton->implicitIndicatorWidthChanged();
248 Q_Q(QQuickScrollBar);
249 QQuickControlPrivate::itemImplicitHeightChanged(item);
250 QQuickIndicatorButton *indicatorButton = q->decreaseVisual();
251 if (!indicatorButton || item != indicatorButton->indicator()) {
252 indicatorButton = q->increaseVisual();
253 if (!indicatorButton || item != indicatorButton->indicator())
257 emit indicatorButton->implicitIndicatorHeightChanged();
262 Q_Q(QQuickScrollBar);
263 QQuickControlPrivate::handlePress(point, timestamp);
264 if (QQuickIndicatorButton *indicatorButton = q->decreaseVisual()) {
265 QQuickItem *decreaseArrow = indicatorButton->indicator();
266 if (decreaseArrow && decreaseArrow->contains(q->mapToItem(decreaseArrow, point + QPointF(0.5, 0.5)))) {
267 indicatorButton->setPressed(
true);
273 if (QQuickIndicatorButton *increaseObject = q->increaseVisual()) {
274 QQuickItem *increaseArrow = increaseObject->indicator();
275 if (increaseArrow && increaseArrow->contains(q->mapToItem(increaseArrow, point + QPointF(0.5, 0.5)))) {
276 increaseObject->setPressed(
true);
282 offset = positionAt(point) - position;
283 qreal sz = qMax(size, logicalPosition(minimumSize));
284 if (offset < 0 || offset > sz)
292 Q_Q(QQuickScrollBar);
293 QQuickControlPrivate::handleMove(point, timestamp);
296
297
298
299
300
301
305 qreal pos = qMax<qreal>(0.0, qMin<qreal>(positionAt(point) - offset, 1.0 - size));
306 if (snapMode == QQuickScrollBar::SnapAlways)
307 pos = snapPosition(pos);
314 Q_Q(QQuickScrollBar);
315 QQuickControlPrivate::handleRelease(point, timestamp);
317 if (orientation == Qt::Vertical) {
318 if (point.y() < q->topPadding() || point.y() >= (q->height() - q->bottomPadding()))
321 if (point.x() < q->leftPadding() || point.x() >= (q->width() - q->rightPadding()))
325 qreal pos = qMax<qreal>(0.0, qMin<qreal>(positionAt(point) - offset, 1.0 - size));
326 if (snapMode != QQuickScrollBar::NoSnap)
327 pos = snapPosition(pos);
330 q->setPressed(
false);
336 Q_Q(QQuickScrollBar);
337 QQuickControlPrivate::handleUngrab();
339 q->setPressed(
false);
344 Q_Q(QQuickScrollBar);
345 if (!qFuzzyCompare(newVisualArea.size, oldVisualArea.size))
346 emit q->visualSizeChanged();
347 if (!qFuzzyCompare(newVisualArea.position, oldVisualArea.position))
348 emit q->visualPositionChanged();
353 Q_Q(QQuickScrollBar);
354 auto updateHoverOnButton = [&](QQuickIndicatorButton *sbButton) {
356 bool hovered = newHoverState.value_or(
false);
357 if (!newHoverState.has_value()) {
358 if (QQuickItem *indicator = sbButton->indicator())
359 hovered = indicator->contains(q->mapToItem(indicator, pos));
361 sbButton->setHovered(hovered);
364 updateHoverOnButton(q->decreaseVisual());
365 updateHoverOnButton(q->increaseVisual());
368QQuickScrollBar::QQuickScrollBar(QQuickItem *parent)
369 : QQuickControl(*(
new QQuickScrollBarPrivate), parent)
371 Q_D(QQuickScrollBar);
372 d->decreaseVisual =
new QQuickIndicatorButton(
this);
373 d->increaseVisual =
new QQuickIndicatorButton(
this);
374 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
375 setKeepMouseGrab(
true);
376 setAcceptedMouseButtons(Qt::LeftButton);
377#if QT_CONFIG(quicktemplates2_multitouch)
378 setAcceptTouchEvents(
true);
381 setCursor(Qt::ArrowCursor);
385QQuickScrollBarAttached *QQuickScrollBar::qmlAttachedProperties(QObject *object)
387 return new QQuickScrollBarAttached(object);
391
392
393
394
395
396
397
398
399
400
401
402qreal QQuickScrollBar::size()
const
404 Q_D(
const QQuickScrollBar);
408void QQuickScrollBar::setSize(qreal size)
410 Q_D(QQuickScrollBar);
411 if (!qt_is_finite(size))
413 size = qBound(0.0, size, 1.0);
414 if (qFuzzyCompare(d->size, size))
417 const auto oldVisualArea = d->visualArea();
419 if (d->size + d->position > 1.0) {
420 d->setPosition(1.0 - d->size,
false);
423 if (isComponentComplete())
426 d->visualAreaChange(d->visualArea(), oldVisualArea);
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446qreal QQuickScrollBar::position()
const
448 Q_D(
const QQuickScrollBar);
452void QQuickScrollBar::setPosition(qreal position)
454 Q_D(QQuickScrollBar);
455 d->setPosition(position);
460 Q_Q(QQuickScrollBar);
461 if (!qt_is_finite(newPosition) || qFuzzyCompare(position, newPosition))
464 auto oldVisualArea = visualArea();
465 position = newPosition;
466 if (q->isComponentComplete())
468 emit q->positionChanged();
469 if (notifyVisualChange)
470 visualAreaChange(visualArea(), oldVisualArea);
474
475
476
477
478
479
480qreal QQuickScrollBar::stepSize()
const
482 Q_D(
const QQuickScrollBar);
486void QQuickScrollBar::setStepSize(qreal step)
488 Q_D(QQuickScrollBar);
489 if (!qt_is_finite(step) || qFuzzyCompare(d->stepSize, step))
493 emit stepSizeChanged();
497
498
499
500
501
502
503
504
505
506
507
508bool QQuickScrollBar::isActive()
const
510 Q_D(
const QQuickScrollBar);
514void QQuickScrollBar::setActive(
bool active)
516 Q_D(QQuickScrollBar);
517 if (d->active == active)
521 emit activeChanged();
525
526
527
528
529bool QQuickScrollBar::isPressed()
const
531 Q_D(
const QQuickScrollBar);
535void QQuickScrollBar::setPressed(
bool pressed)
537 Q_D(QQuickScrollBar);
539 if (QQuickIndicatorButton *button = decreaseVisual())
540 button->setPressed(
false);
541 if (QQuickIndicatorButton *button = increaseVisual())
542 button->setPressed(
false);
544 if (d->pressed == pressed)
547 d->pressed = pressed;
548 setAccessibleProperty(
"pressed", pressed);
550 emit pressedChanged();
554
555
556
557
558
559
560
561
562
563
564
565
566
567Qt::Orientation QQuickScrollBar::orientation()
const
569 Q_D(
const QQuickScrollBar);
570 return d->orientation;
573void QQuickScrollBar::setOrientation(Qt::Orientation orientation)
575 Q_D(QQuickScrollBar);
576 if (d->orientation == orientation)
579 if (orientation == Qt::Horizontal)
580 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
582 d->setSizePolicy(QLayoutPolicy::Fixed, QLayoutPolicy::Preferred);
584 d->orientation = orientation;
585 if (isComponentComplete())
587 emit orientationChanged();
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614QQuickScrollBar::SnapMode QQuickScrollBar::snapMode()
const
616 Q_D(
const QQuickScrollBar);
620void QQuickScrollBar::setSnapMode(SnapMode mode)
622 Q_D(QQuickScrollBar);
623 if (d->snapMode == mode)
627 emit snapModeChanged();
631
632
633
634
635
636
637
638
639
640bool QQuickScrollBar::isInteractive()
const
642 Q_D(
const QQuickScrollBar);
643 return d->interactive;
646void QQuickScrollBar::setInteractive(
bool interactive)
648 Q_D(QQuickScrollBar);
649 d->explicitInteractive =
true;
650 d->setInteractive(interactive);
653void QQuickScrollBar::resetInteractive()
655 Q_D(QQuickScrollBar);
656 d->explicitInteractive =
false;
657 d->setInteractive(
true);
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685QQuickScrollBar::Policy QQuickScrollBar::policy()
const
687 Q_D(
const QQuickScrollBar);
691void QQuickScrollBar::setPolicy(Policy policy)
693 Q_D(QQuickScrollBar);
694 if (d->policy == policy)
698 emit policyChanged();
702
703
704
705
706
707
708
709
710bool QQuickScrollBar::isHorizontal()
const
712 Q_D(
const QQuickScrollBar);
713 return d->orientation == Qt::Horizontal;
717
718
719
720
721
722
723
724
725bool QQuickScrollBar::isVertical()
const
727 Q_D(
const QQuickScrollBar);
728 return d->orientation == Qt::Vertical;
732
733
734
735
736
737
738
739qreal QQuickScrollBar::minimumSize()
const
741 Q_D(
const QQuickScrollBar);
742 return d->minimumSize;
745void QQuickScrollBar::setMinimumSize(qreal minimumSize)
747 Q_D(QQuickScrollBar);
748 if (!qt_is_finite(minimumSize) || qFuzzyCompare(d->minimumSize, minimumSize))
751 auto oldVisualArea = d->visualArea();
752 d->minimumSize = qBound(0.0, minimumSize, 1.0);
753 if (isComponentComplete())
755 emit minimumSizeChanged();
756 d->visualAreaChange(d->visualArea(), oldVisualArea);
760
761
762
763
764
765
766
767
768
769qreal QQuickScrollBar::visualSize()
const
771 Q_D(
const QQuickScrollBar);
772 return d->visualArea().size;
776
777
778
779
780
781
782
783
784
785qreal QQuickScrollBar::visualPosition()
const
787 Q_D(
const QQuickScrollBar);
788 return d->visualArea().position;
791QQuickIndicatorButton *QQuickScrollBar::decreaseVisual()
793 Q_D(QQuickScrollBar);
794 return d->decreaseVisual;
797QQuickIndicatorButton *QQuickScrollBar::increaseVisual()
799 Q_D(QQuickScrollBar);
800 return d->increaseVisual;
804
805
806
807
808
809
810void QQuickScrollBar::increase()
812 Q_D(QQuickScrollBar);
813 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
814 bool wasActive = d->active;
816 setPosition(qMin<qreal>(1.0 - d->size, d->position + step));
817 setActive(wasActive);
821
822
823
824
825
826
827void QQuickScrollBar::decrease()
829 Q_D(QQuickScrollBar);
830 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
831 bool wasActive = d->active;
833 setPosition(qMax<qreal>(0.0, d->position - step));
834 setActive(wasActive);
837void QQuickScrollBar::mousePressEvent(QMouseEvent *event)
839 Q_D(QQuickScrollBar);
840 QQuickControl::mousePressEvent(event);
841 d->handleMove(event->position(), event->timestamp());
844#if QT_CONFIG(quicktemplates2_hover)
845void QQuickScrollBar::hoverChange()
847 Q_D(QQuickScrollBar);
851void QQuickScrollBar::hoverEnterEvent(QHoverEvent *event)
853 Q_D(QQuickScrollBar);
854 QQuickControl::hoverEnterEvent(event);
855 d->updateHover(event->position());
859void QQuickScrollBar::hoverMoveEvent(QHoverEvent *event)
861 Q_D(QQuickScrollBar);
862 QQuickControl::hoverMoveEvent(event);
863 d->updateHover(event->position());
867void QQuickScrollBar::hoverLeaveEvent(QHoverEvent *event)
869 Q_D(QQuickScrollBar);
870 QQuickControl::hoverLeaveEvent(event);
872 d->updateHover(QPoint(),
false);
877void QQuickScrollBar::classBegin()
879 Q_D(QQuickScrollBar);
880 QQuickControl::classBegin();
882 QQmlContext *context = qmlContext(
this);
884 QQmlEngine::setContextForObject(d->decreaseVisual, context);
885 QQmlEngine::setContextForObject(d->increaseVisual, context);
889void QQuickScrollBar::componentComplete()
891 Q_D(QQuickScrollBar);
892 QQuickIndicatorButtonPrivate::get(d->decreaseVisual)->executeIndicator(
true);
893 QQuickIndicatorButtonPrivate::get(d->increaseVisual)->executeIndicator(
true);
895 QQuickControl::componentComplete();
898#if QT_CONFIG(accessibility)
899void QQuickScrollBar::accessibilityActiveChanged(
bool active)
901 QQuickControl::accessibilityActiveChanged(active);
903 Q_D(QQuickScrollBar);
905 setAccessibleProperty(
"pressed", d->pressed);
907 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this)) {
908 connect(accessibleAttached, &QQuickAccessibleAttached::increaseAction,
this, &QQuickScrollBar::increase);
909 connect(accessibleAttached, &QQuickAccessibleAttached::decreaseAction,
this, &QQuickScrollBar::decrease);
912 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this)) {
913 disconnect(accessibleAttached, &QQuickAccessibleAttached::increaseAction,
this, &QQuickScrollBar::increase);
914 disconnect(accessibleAttached, &QQuickAccessibleAttached::decreaseAction,
this, &QQuickScrollBar::decrease);
919QAccessible::Role QQuickScrollBar::accessibleRole()
const
921 return QAccessible::ScrollBar;
931 QQuickItemPrivate::get(flickable)->removeItemChangeListener(
this, QQuickItemPrivate::Geometry);
932 QQuickItemPrivate::get(flickable)->removeItemChangeListener(
this, QQuickItemPrivate::Destroyed);
944 QQuickItemPrivate::get(item)->updateOrAddGeometryChangeListener(
this, QQuickGeometryChange::Size);
945 QQuickItemPrivate::get(item)->updateOrAddItemChangeListener(
this, QQuickItemPrivate::Destroyed);
955 Q_ASSERT(flickable && horizontal);
957 connect(flickable, &QQuickFlickable::movingHorizontallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateHorizontal);
960 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
961 QObject::connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
962 QObject::connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
965 QQuickItem *parent = horizontal->parentItem();
966 if (parent && parent == flickable->parentItem())
967 horizontal->stackAfter(flickable);
971 if (
auto control = qobject_cast<QQuickControl*>(q_func()->parent())) {
972 const auto visibility = horizontal->policy() != QQuickScrollBar::AlwaysOff
973 ? QQuickControlPrivate::UnhideVisibility::Show : QQuickControlPrivate::UnhideVisibility::Hide;
974 QQuickControlPrivate::unhideOldItem(control, horizontal, visibility);
978 horizontal->setSize(area->property(
"widthRatio").toReal());
979 horizontal->setPosition(area->property(
"xPosition").toReal());
984 Q_ASSERT(flickable && vertical);
986 connect(flickable, &QQuickFlickable::movingVerticallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateVertical);
989 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
990 QObject::connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
991 QObject::connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
994 QQuickItem *parent = vertical->parentItem();
995 if (parent && parent == flickable->parentItem())
996 vertical->stackAfter(flickable);
998 if (
auto control = qobject_cast<QQuickControl*>(q_func()->parent())) {
999 const auto visibility = vertical->policy() != QQuickScrollBar::AlwaysOff
1000 ? QQuickControlPrivate::UnhideVisibility::Show : QQuickControlPrivate::UnhideVisibility::Hide;
1001 QQuickControlPrivate::unhideOldItem(control, vertical, visibility);
1005 vertical->setSize(area->property(
"heightRatio").toReal());
1006 vertical->setPosition(area->property(
"yPosition").toReal());
1011 Q_ASSERT(flickable && horizontal);
1013 QQuickControlPrivate::hideOldItem(horizontal);
1018 const QQmlProperty visibleProperty(horizontal, QStringLiteral(
"visible"));
1019 const QQmlProperty parentProperty(horizontal, QStringLiteral(
"parent"));
1020 QQmlPropertyPrivate::removeBinding(visibleProperty);
1021 QQmlPropertyPrivate::removeBinding(parentProperty);
1023 disconnect(flickable, &QQuickFlickable::movingHorizontallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateHorizontal);
1026 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1027 QObject::disconnect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
1028 QObject::disconnect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
1033 Q_ASSERT(flickable && vertical);
1035 QQuickControlPrivate::hideOldItem(vertical);
1036 const QQmlProperty visibleProperty(vertical, QStringLiteral(
"visible"));
1037 const QQmlProperty parentProperty(vertical, QStringLiteral(
"parent"));
1038 QQmlPropertyPrivate::removeBinding(visibleProperty);
1039 QQmlPropertyPrivate::removeBinding(parentProperty);
1041 disconnect(flickable, &QQuickFlickable::movingVerticallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateVertical);
1044 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1045 QObject::disconnect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
1046 QObject::disconnect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
1076 const qreal viewwidth = f->width();
1077 const qreal maxxextent = -f->maxXExtent() + f->minXExtent();
1078 const qreal cx = horizontal->position() * (maxxextent + viewwidth) - f->minXExtent();
1080 if (!qIsNaN(cx) && !qFuzzyCompare(cx,
flickable->contentX()))
1091 const qreal viewheight = f->height();
1092 const qreal maxyextent = -f->maxYExtent() + f->minYExtent();
1093 const qreal cy = vertical->position() * (maxyextent + viewheight) - f->minYExtent();
1095 if (!qIsNaN(cy) && !qFuzzyCompare(cy,
flickable->contentY()))
1106 Q_ASSERT(horizontal && flickable);
1107 if (horizontal->parentItem() != flickable)
1109 horizontal->setWidth(flickable->width());
1111 horizontal->setY(flickable->height() - horizontal->height());
1116 Q_ASSERT(vertical && flickable);
1117 if (vertical->parentItem() != flickable)
1119 vertical->setHeight(flickable->height());
1121 vertical->setX(vertical->isMirrored() ? 0 : flickable->width() - vertical->width());
1128 if (horizontal && horizontal->height() > 0) {
1129#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
1130 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), diff.height() - horizontal->height());
1132 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), item->height() - diff.height() - horizontal->height());
1137 if (vertical && vertical->width() > 0) {
1138#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
1139 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), diff.width() - vertical->width());
1141 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), item->width() - diff.width() - vertical->width());
1150 if (item == vertical && flickable)
1156 if (item == horizontal && flickable)
1164 if (item == horizontal)
1165 horizontal =
nullptr;
1166 if (item == vertical)
1170QQuickScrollBarAttached::QQuickScrollBarAttached(QObject *parent)
1171 : QObject(*(
new QQuickScrollBarAttachedPrivate), parent)
1173 Q_D(QQuickScrollBarAttached);
1174 d->setFlickable(qobject_cast<QQuickFlickable *>(parent));
1176 if (parent && !d->flickable && !qobject_cast<QQuickScrollView *>(parent))
1177 qmlWarning(parent) <<
"ScrollBar attached property must be attached to an object deriving from Flickable or ScrollView";
1180QQuickScrollBarAttached::~QQuickScrollBarAttached()
1182 Q_D(QQuickScrollBarAttached);
1183 if (d->horizontal) {
1184 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsbHorizontalChangeTypes);
1185 d->horizontal =
nullptr;
1188 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsbVerticalChangeTypes);
1189 d->vertical =
nullptr;
1191 d->setFlickable(
nullptr);
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208QQuickScrollBar *QQuickScrollBarAttached::horizontal()
const
1210 Q_D(
const QQuickScrollBarAttached);
1211 return d->horizontal;
1214void QQuickScrollBarAttached::setHorizontal(QQuickScrollBar *horizontal)
1216 Q_D(QQuickScrollBarAttached);
1217 if (d->horizontal == horizontal)
1220 if (d->horizontal) {
1221 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsbHorizontalChangeTypes);
1222 QObjectPrivate::disconnect(d->horizontal, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal);
1225 d->cleanupHorizontal();
1228 d->horizontal = horizontal;
1231 if (!horizontal->parentItem())
1232 horizontal->setParentItem(qobject_cast<QQuickItem *>(parent()));
1233 horizontal->setOrientation(Qt::Horizontal);
1235 QQuickItemPrivate::get(horizontal)->addItemChangeListener(d, QsbHorizontalChangeTypes);
1236 QObjectPrivate::connect(horizontal, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal);
1239 d->initHorizontal();
1241 emit horizontalChanged();
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258QQuickScrollBar *QQuickScrollBarAttached::vertical()
const
1260 Q_D(
const QQuickScrollBarAttached);
1264void QQuickScrollBarAttached::setVertical(QQuickScrollBar *vertical)
1266 Q_D(QQuickScrollBarAttached);
1267 if (d->vertical == vertical)
1271 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsbVerticalChangeTypes);
1272 QObjectPrivate::disconnect(d->vertical, &QQuickScrollBar::mirroredChanged, d, &QQuickScrollBarAttachedPrivate::mirrorVertical);
1273 QObjectPrivate::disconnect(d->vertical, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical);
1276 d->cleanupVertical();
1279 d->vertical = vertical;
1282 if (!vertical->parentItem())
1283 vertical->setParentItem(qobject_cast<QQuickItem *>(parent()));
1284 vertical->setOrientation(Qt::Vertical);
1286 QQuickItemPrivate::get(vertical)->addItemChangeListener(d, QsbVerticalChangeTypes);
1287 QObjectPrivate::connect(vertical, &QQuickScrollBar::mirroredChanged, d, &QQuickScrollBarAttachedPrivate::mirrorVertical);
1288 QObjectPrivate::connect(vertical, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical);
1293 emit verticalChanged();
1298#include "moc_qquickscrollbar_p.cpp"