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
127
128
136 qreal visualPos = position;
138 if (minimumSize > size && size != 1.0)
139 visualPos = position / (1.0 - size) * (1.0 - minimumSize);
141 qreal maximumSize = qMax<qreal>(0.0, 1.0 - visualPos);
142 qreal visualSize = qMax<qreal>(minimumSize,
143 qMin<qreal>(qMax(size, minimumSize) + qMin<qreal>(0, visualPos),
146 visualPos = qMax<qreal>(0,qMin<qreal>(visualPos,qMax<qreal>(0, 1.0 - visualSize)));
148 return VisualArea(visualPos, visualSize);
153 if (minimumSize > size && minimumSize != 1.0)
154 return position * (1.0 - size) / (1.0 - minimumSize);
160 const qreal effectiveStep = stepSize * (1.0 - size);
161 if (qFuzzyIsNull(effectiveStep))
164 return qRound(position / effectiveStep) * effectiveStep;
169 Q_Q(
const QQuickScrollBar);
170 if (orientation == Qt::Horizontal)
171 return logicalPosition(point.x() - q->leftPadding()) / q->availableWidth();
173 return logicalPosition(point.y() - q->topPadding()) / q->availableHeight();
178 Q_Q(QQuickScrollBar);
184 q->setAcceptedMouseButtons(Qt::LeftButton);
185#if QT_CONFIG(quicktemplates2_multitouch)
186 q->setAcceptTouchEvents(
true);
189 q->setCursor(Qt::ArrowCursor);
192 q->setAcceptedMouseButtons(Qt::NoButton);
193#if QT_CONFIG(quicktemplates2_multitouch)
194 q->setAcceptTouchEvents(
false);
201 emit q->interactiveChanged();
206 Q_Q(QQuickScrollBar);
207#if QT_CONFIG(quicktemplates2_hover)
208 bool hover = hovered;
212 q->setActive(moving || (interactive && (pressed || hover)));
217 Q_Q(QQuickScrollBar);
223 const VisualArea visual = visualArea();
225 if (orientation == Qt::Horizontal) {
226 contentItem->setPosition(QPointF(q->leftPadding() + visual.position * q->availableWidth(), q->topPadding()));
227 contentItem->setSize(QSizeF(q->availableWidth() * visual.size, q->availableHeight()));
229 contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding() + visual.position * q->availableHeight()));
230 contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight() * visual.size));
236 Q_Q(QQuickScrollBar);
237 QQuickControlPrivate::itemImplicitWidthChanged(item);
238 QQuickIndicatorButton *indicatorButton = q->decreaseVisual();
239 if (!indicatorButton || item != indicatorButton->indicator()) {
240 indicatorButton = q->increaseVisual();
241 if (!indicatorButton || item != indicatorButton->indicator())
245 emit indicatorButton->implicitIndicatorWidthChanged();
250 Q_Q(QQuickScrollBar);
251 QQuickControlPrivate::itemImplicitHeightChanged(item);
252 QQuickIndicatorButton *indicatorButton = q->decreaseVisual();
253 if (!indicatorButton || item != indicatorButton->indicator()) {
254 indicatorButton = q->increaseVisual();
255 if (!indicatorButton || item != indicatorButton->indicator())
259 emit indicatorButton->implicitIndicatorHeightChanged();
264 Q_Q(QQuickScrollBar);
265 QQuickControlPrivate::handlePress(point, timestamp);
266 if (QQuickIndicatorButton *indicatorButton = q->decreaseVisual()) {
267 QQuickItem *decreaseArrow = indicatorButton->indicator();
268 if (decreaseArrow && decreaseArrow->contains(q->mapToItem(decreaseArrow, point + QPointF(0.5, 0.5)))) {
269 indicatorButton->setPressed(
true);
275 if (QQuickIndicatorButton *increaseObject = q->increaseVisual()) {
276 QQuickItem *increaseArrow = increaseObject->indicator();
277 if (increaseArrow && increaseArrow->contains(q->mapToItem(increaseArrow, point + QPointF(0.5, 0.5)))) {
278 increaseObject->setPressed(
true);
284 offset = positionAt(point) - position;
285 qreal sz = qMax(size, logicalPosition(minimumSize));
286 if (offset < 0 || offset > sz)
295 QQuickControlPrivate::handleMove(point, timestamp);
298
299
300
301
302
303
307 qreal pos = qMax<qreal>(0.0, qMin<qreal>(positionAt(point) - offset, 1.0 - size));
308 if (snapMode == QQuickScrollBar::SnapAlways)
309 pos = snapPosition(pos);
310 setPositionFromDrag(pos, point);
316 Q_Q(QQuickScrollBar);
317 QQuickControlPrivate::handleRelease(point, timestamp);
319 if (orientation == Qt::Vertical) {
320 if (point.y() < q->topPadding() || point.y() >= (q->height() - q->bottomPadding()))
323 if (point.x() < q->leftPadding() || point.x() >= (q->width() - q->rightPadding()))
327 qreal pos = qMax<qreal>(0.0, qMin<qreal>(positionAt(point) - offset, 1.0 - size));
328 if (snapMode != QQuickScrollBar::NoSnap)
329 pos = snapPosition(pos);
330 setPositionFromDrag(pos, point);
333 q->setPressed(
false);
339 Q_Q(QQuickScrollBar);
340 QQuickControlPrivate::handleUngrab();
343 q->setPressed(
false);
348 Q_Q(QQuickScrollBar);
349 if (!qFuzzyCompare(newVisualArea.size, oldVisualArea.size))
350 emit q->visualSizeChanged();
351 if (!qFuzzyCompare(newVisualArea.position, oldVisualArea.position))
352 emit q->visualPositionChanged();
357 Q_Q(QQuickScrollBar);
358 auto updateHoverOnButton = [&](QQuickIndicatorButton *sbButton) {
360 bool hovered = newHoverState.value_or(
false);
361 if (!newHoverState.has_value()) {
362 if (QQuickItem *indicator = sbButton->indicator())
363 hovered = indicator->contains(q->mapToItem(indicator, pos));
365 sbButton->setHovered(hovered);
368 updateHoverOnButton(q->decreaseVisual());
369 updateHoverOnButton(q->increaseVisual());
372QQuickScrollBar::QQuickScrollBar(QQuickItem *parent)
373 : QQuickControl(*(
new QQuickScrollBarPrivate), parent)
375 Q_D(QQuickScrollBar);
376 d->decreaseVisual =
new QQuickIndicatorButton(
this);
377 d->increaseVisual =
new QQuickIndicatorButton(
this);
378 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
379 setKeepMouseGrab(
true);
380 setAcceptedMouseButtons(Qt::LeftButton);
381#if QT_CONFIG(quicktemplates2_multitouch)
382 setAcceptTouchEvents(
true);
385 setCursor(Qt::ArrowCursor);
389QQuickScrollBarAttached *QQuickScrollBar::qmlAttachedProperties(QObject *object)
391 return new QQuickScrollBarAttached(object);
395
396
397
398
399
400
401
402
403
404
405
406qreal QQuickScrollBar::size()
const
408 Q_D(
const QQuickScrollBar);
412void QQuickScrollBar::setSize(qreal size)
414 Q_D(QQuickScrollBar);
415 if (!qt_is_finite(size))
417 size = qBound(0.0, size, 1.0);
418 if (qFuzzyCompare(d->size, size))
421 const auto oldVisualArea = d->visualArea();
423 if (d->size + d->position > 1.0) {
424 d->setPosition(1.0 - d->size,
false);
427 d->reanchorDragOffset(d->position);
429 if (isComponentComplete())
432 d->visualAreaChange(d->visualArea(), oldVisualArea);
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452qreal QQuickScrollBar::position()
const
454 Q_D(
const QQuickScrollBar);
458void QQuickScrollBar::setPosition(qreal position)
460 Q_D(QQuickScrollBar);
461 d->setPosition(position);
468 if (qt_is_finite(newPosition) && !qFuzzyCompare(position, newPosition))
469 reanchorDragOffset(newPosition);
470 updatePosition(newPosition, notifyVisualChange);
478 updatePosition(newPosition,
true );
483 Q_Q(QQuickScrollBar);
484 if (!qt_is_finite(newPosition) || qFuzzyCompare(position, newPosition))
487 auto oldVisualArea = visualArea();
488 position = newPosition;
489 if (q->isComponentComplete())
491 emit q->positionChanged();
492 if (notifyVisualChange)
493 visualAreaChange(visualArea(), oldVisualArea);
495#if QT_CONFIG(accessibility)
496 if (QAccessible::isActive() && isAccessible) {
497 if (QAccessibleInterface *accessible = QAccessible::queryAccessibleInterface(q)) {
498 if (QAccessibleValueInterface *valueInterface = accessible->valueInterface()) {
499 QAccessibleValueChangeEvent event(q, valueInterface->currentValue());
500 QAccessible::updateAccessibility(&event);
513 offset = positionAt(dragPoint) - newPosition;
517
518
519
520
521
522
523qreal QQuickScrollBar::stepSize()
const
525 Q_D(
const QQuickScrollBar);
529void QQuickScrollBar::setStepSize(qreal step)
531 Q_D(QQuickScrollBar);
532 if (!qt_is_finite(step) || qFuzzyCompare(d->stepSize, step))
536 emit stepSizeChanged();
540
541
542
543
544
545
546
547
548
549
550
551bool QQuickScrollBar::isActive()
const
553 Q_D(
const QQuickScrollBar);
557void QQuickScrollBar::setActive(
bool active)
559 Q_D(QQuickScrollBar);
560 if (d->active == active)
564 emit activeChanged();
568
569
570
571
572bool QQuickScrollBar::isPressed()
const
574 Q_D(
const QQuickScrollBar);
578void QQuickScrollBar::setPressed(
bool pressed)
580 Q_D(QQuickScrollBar);
582 if (QQuickIndicatorButton *button = decreaseVisual())
583 button->setPressed(
false);
584 if (QQuickIndicatorButton *button = increaseVisual())
585 button->setPressed(
false);
587 if (d->pressed == pressed)
590 d->pressed = pressed;
591 setAccessibleProperty(
"pressed", pressed);
593 emit pressedChanged();
597
598
599
600
601
602
603
604
605
606
607
608
609
610Qt::Orientation QQuickScrollBar::orientation()
const
612 Q_D(
const QQuickScrollBar);
613 return d->orientation;
616void QQuickScrollBar::setOrientation(Qt::Orientation orientation)
618 Q_D(QQuickScrollBar);
619 if (d->orientation == orientation)
622 if (orientation == Qt::Horizontal)
623 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
625 d->setSizePolicy(QLayoutPolicy::Fixed, QLayoutPolicy::Preferred);
627 d->orientation = orientation;
628 if (isComponentComplete())
630 emit orientationChanged();
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663QQuickScrollBar::SnapMode QQuickScrollBar::snapMode()
const
665 Q_D(
const QQuickScrollBar);
669void QQuickScrollBar::setSnapMode(SnapMode mode)
671 Q_D(QQuickScrollBar);
672 if (d->snapMode == mode)
676 emit snapModeChanged();
680
681
682
683
684
685
686
687
688
689bool QQuickScrollBar::isInteractive()
const
691 Q_D(
const QQuickScrollBar);
692 return d->interactive;
695void QQuickScrollBar::setInteractive(
bool interactive)
697 Q_D(QQuickScrollBar);
698 d->explicitInteractive =
true;
699 d->setInteractive(interactive);
702void QQuickScrollBar::resetInteractive()
704 Q_D(QQuickScrollBar);
705 d->explicitInteractive =
false;
706 d->setInteractive(
true);
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734QQuickScrollBar::Policy QQuickScrollBar::policy()
const
736 Q_D(
const QQuickScrollBar);
740void QQuickScrollBar::setPolicy(Policy policy)
742 Q_D(QQuickScrollBar);
743 if (d->policy == policy)
747 emit policyChanged();
751
752
753
754
755
756
757
758
759bool QQuickScrollBar::isHorizontal()
const
761 Q_D(
const QQuickScrollBar);
762 return d->orientation == Qt::Horizontal;
766
767
768
769
770
771
772
773
774bool QQuickScrollBar::isVertical()
const
776 Q_D(
const QQuickScrollBar);
777 return d->orientation == Qt::Vertical;
781
782
783
784
785
786
787
788qreal QQuickScrollBar::minimumSize()
const
790 Q_D(
const QQuickScrollBar);
791 return d->minimumSize;
794void QQuickScrollBar::setMinimumSize(qreal minimumSize)
796 Q_D(QQuickScrollBar);
797 if (!qt_is_finite(minimumSize) || qFuzzyCompare(d->minimumSize, minimumSize))
800 auto oldVisualArea = d->visualArea();
801 d->minimumSize = qBound(0.0, minimumSize, 1.0);
802 if (isComponentComplete())
804 emit minimumSizeChanged();
805 d->visualAreaChange(d->visualArea(), oldVisualArea);
809
810
811
812
813
814
815
816
817
818qreal QQuickScrollBar::visualSize()
const
820 Q_D(
const QQuickScrollBar);
821 return d->visualArea().size;
825
826
827
828
829
830
831
832
833
834qreal QQuickScrollBar::visualPosition()
const
836 Q_D(
const QQuickScrollBar);
837 return d->visualArea().position;
840QQuickIndicatorButton *QQuickScrollBar::decreaseVisual()
842 Q_D(QQuickScrollBar);
843 return d->decreaseVisual;
846QQuickIndicatorButton *QQuickScrollBar::increaseVisual()
848 Q_D(QQuickScrollBar);
849 return d->increaseVisual;
853
854
855
856
857
858
859void QQuickScrollBar::increase()
861 Q_D(QQuickScrollBar);
862 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
863 bool wasActive = d->active;
865 setPosition(qMin<qreal>(1.0 - d->size, d->position + step));
866 setActive(wasActive);
870
871
872
873
874
875
876void QQuickScrollBar::decrease()
878 Q_D(QQuickScrollBar);
879 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
880 bool wasActive = d->active;
882 setPosition(qMax<qreal>(0.0, d->position - step));
883 setActive(wasActive);
886void QQuickScrollBar::mousePressEvent(QMouseEvent *event)
888 Q_D(QQuickScrollBar);
889 QQuickControl::mousePressEvent(event);
890 d->handleMove(event->position(), event->timestamp());
893#if QT_CONFIG(quicktemplates2_hover)
894void QQuickScrollBar::hoverChange()
896 Q_D(QQuickScrollBar);
900void QQuickScrollBar::hoverEnterEvent(QHoverEvent *event)
902 Q_D(QQuickScrollBar);
903 QQuickControl::hoverEnterEvent(event);
904 d->updateHover(event->position());
908void QQuickScrollBar::hoverMoveEvent(QHoverEvent *event)
910 Q_D(QQuickScrollBar);
911 QQuickControl::hoverMoveEvent(event);
912 d->updateHover(event->position());
916void QQuickScrollBar::hoverLeaveEvent(QHoverEvent *event)
918 Q_D(QQuickScrollBar);
919 QQuickControl::hoverLeaveEvent(event);
921 d->updateHover(QPoint(),
false);
926void QQuickScrollBar::classBegin()
928 Q_D(QQuickScrollBar);
929 QQuickControl::classBegin();
931 QQmlContext *context = qmlContext(
this);
933 QQmlEngine::setContextForObject(d->decreaseVisual, context);
934 QQmlEngine::setContextForObject(d->increaseVisual, context);
938void QQuickScrollBar::componentComplete()
940 Q_D(QQuickScrollBar);
941 QQuickIndicatorButtonPrivate::get(d->decreaseVisual)->executeIndicator(
true);
942 QQuickIndicatorButtonPrivate::get(d->increaseVisual)->executeIndicator(
true);
944 QQuickControl::componentComplete();
947#if QT_CONFIG(accessibility)
948void QQuickScrollBar::accessibilityActiveChanged(
bool active)
950 QQuickControl::accessibilityActiveChanged(active);
952 Q_D(QQuickScrollBar);
954 setAccessibleProperty(
"pressed", d->pressed);
956 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this)) {
957 connect(accessibleAttached, &QQuickAccessibleAttached::increaseAction,
this, &QQuickScrollBar::increase);
958 connect(accessibleAttached, &QQuickAccessibleAttached::decreaseAction,
this, &QQuickScrollBar::decrease);
961 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this)) {
962 disconnect(accessibleAttached, &QQuickAccessibleAttached::increaseAction,
this, &QQuickScrollBar::increase);
963 disconnect(accessibleAttached, &QQuickAccessibleAttached::decreaseAction,
this, &QQuickScrollBar::decrease);
968QAccessible::Role QQuickScrollBar::accessibleRole()
const
970 return QAccessible::ScrollBar;
980 QQuickItemPrivate::get(flickable)->removeItemChangeListener(
this, QQuickItemPrivate::Geometry);
981 QQuickItemPrivate::get(flickable)->removeItemChangeListener(
this, QQuickItemPrivate::Destroyed);
993 QQuickItemPrivate::get(item)->updateOrAddGeometryChangeListener(
this, QQuickGeometryChange::Size);
994 QQuickItemPrivate::get(item)->updateOrAddItemChangeListener(
this, QQuickItemPrivate::Destroyed);
1004 Q_ASSERT(flickable && horizontal);
1009 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1010 QObject::connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
1011 QObject::connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
1014 QQuickItem *parent = horizontal->parentItem();
1015 if (parent && parent == flickable->parentItem())
1016 horizontal->stackAfter(flickable);
1020 if (
auto control = qobject_cast<QQuickControl*>(q_func()->parent())) {
1021 const auto visibility = horizontal->policy() != QQuickScrollBar::AlwaysOff
1022 ? QQuickControlPrivate::UnhideVisibility::Show : QQuickControlPrivate::UnhideVisibility::Hide;
1023 QQuickControlPrivate::unhideOldItem(control, horizontal, visibility);
1027 horizontal->setSize(area->property(
"widthRatio").toReal());
1028 horizontal->setPosition(area->property(
"xPosition").toReal());
1033 Q_ASSERT(flickable && vertical);
1038 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1039 QObject::connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
1040 QObject::connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
1043 QQuickItem *parent = vertical->parentItem();
1044 if (parent && parent == flickable->parentItem())
1045 vertical->stackAfter(flickable);
1047 if (
auto control = qobject_cast<QQuickControl*>(q_func()->parent())) {
1048 const auto visibility = vertical->policy() != QQuickScrollBar::AlwaysOff
1049 ? QQuickControlPrivate::UnhideVisibility::Show : QQuickControlPrivate::UnhideVisibility::Hide;
1050 QQuickControlPrivate::unhideOldItem(control, vertical, visibility);
1054 vertical->setSize(area->property(
"heightRatio").toReal());
1055 vertical->setPosition(area->property(
"yPosition").toReal());
1060 Q_ASSERT(horizontal);
1062 QQuickControlPrivate::hideOldItem(horizontal);
1067 const QQmlProperty visibleProperty(horizontal, QStringLiteral(
"visible"));
1068 const QQmlProperty parentProperty(horizontal, QStringLiteral(
"parent"));
1069 QQmlPropertyPrivate::removeBinding(visibleProperty);
1070 QQmlPropertyPrivate::removeBinding(parentProperty);
1078 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1079 QObject::disconnect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
1080 QObject::disconnect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
1087 QQuickControlPrivate::hideOldItem(vertical);
1088 const QQmlProperty visibleProperty(vertical, QStringLiteral(
"visible"));
1089 const QQmlProperty parentProperty(vertical, QStringLiteral(
"parent"));
1090 QQmlPropertyPrivate::removeBinding(visibleProperty);
1091 QQmlPropertyPrivate::removeBinding(parentProperty);
1099 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1100 QObject::disconnect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
1101 QObject::disconnect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
1131 const qreal viewwidth = f->width();
1132 const qreal maxxextent = -f->maxXExtent() + f->minXExtent();
1133 const qreal cx = horizontal->position() * (maxxextent + viewwidth) - f->minXExtent();
1135 if (!qIsNaN(cx) && !qFuzzyCompare(cx,
flickable->contentX()))
1146 const qreal viewheight = f->height();
1147 const qreal maxyextent = -f->maxYExtent() + f->minYExtent();
1148 const qreal cy = vertical->position() * (maxyextent + viewheight) - f->minYExtent();
1150 if (!qIsNaN(cy) && !qFuzzyCompare(cy,
flickable->contentY()))
1161 Q_ASSERT(horizontal && flickable);
1162 if (horizontal->parentItem() != flickable)
1164 horizontal->setWidth(flickable->width());
1166 horizontal->setY(flickable->height() - horizontal->height());
1171 Q_ASSERT(vertical && flickable);
1172 if (vertical->parentItem() != flickable)
1174 vertical->setHeight(flickable->height());
1176 vertical->setX(vertical->isMirrored() ? 0 : flickable->width() - vertical->width());
1183 if (horizontal && horizontal->height() > 0) {
1184#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
1185 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), diff.height() - horizontal->height());
1187 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), item->height() - diff.height() - horizontal->height());
1192 if (vertical && vertical->width() > 0) {
1193#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
1194 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), diff.width() - vertical->width());
1196 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), item->width() - diff.width() - vertical->width());
1205 if (item == vertical && flickable)
1211 if (item == horizontal && flickable)
1219 if (item == horizontal)
1220 horizontal =
nullptr;
1221 if (item == vertical)
1225QQuickScrollBarAttached::QQuickScrollBarAttached(QObject *parent)
1226 : QObject(*(
new QQuickScrollBarAttachedPrivate), parent)
1228 Q_D(QQuickScrollBarAttached);
1229 d->setFlickable(qobject_cast<QQuickFlickable *>(parent));
1231 if (parent && !d->flickable && !qobject_cast<QQuickScrollView *>(parent))
1232 qmlWarning(parent) <<
"ScrollBar attached property must be attached to an object deriving from Flickable or ScrollView";
1235QQuickScrollBarAttached::~QQuickScrollBarAttached()
1237 Q_D(QQuickScrollBarAttached);
1238 if (d->horizontal) {
1239 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsbHorizontalChangeTypes);
1240 d->horizontal =
nullptr;
1243 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsbVerticalChangeTypes);
1244 d->vertical =
nullptr;
1246 d->setFlickable(
nullptr);
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263QQuickScrollBar *QQuickScrollBarAttached::horizontal()
const
1265 Q_D(
const QQuickScrollBarAttached);
1266 return d->horizontal;
1269void QQuickScrollBarAttached::setHorizontal(QQuickScrollBar *horizontal)
1271 Q_D(QQuickScrollBarAttached);
1272 if (d->horizontal == horizontal)
1275 if (d->horizontal) {
1276 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsbHorizontalChangeTypes);
1277 QObjectPrivate::disconnect(d->horizontal, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal);
1281 d->cleanupHorizontal();
1284 d->horizontal = horizontal;
1287 if (!horizontal->parentItem())
1288 horizontal->setParentItem(qobject_cast<QQuickItem *>(parent()));
1289 horizontal->setOrientation(Qt::Horizontal);
1291 QQuickItemPrivate::get(horizontal)->addItemChangeListener(d, QsbHorizontalChangeTypes);
1292 QObjectPrivate::connect(horizontal, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal);
1295 d->initHorizontal();
1297 emit horizontalChanged();
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314QQuickScrollBar *QQuickScrollBarAttached::vertical()
const
1316 Q_D(
const QQuickScrollBarAttached);
1320void QQuickScrollBarAttached::setVertical(QQuickScrollBar *vertical)
1322 Q_D(QQuickScrollBarAttached);
1323 if (d->vertical == vertical)
1327 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsbVerticalChangeTypes);
1328 QObjectPrivate::disconnect(d->vertical, &QQuickScrollBar::mirroredChanged, d, &QQuickScrollBarAttachedPrivate::mirrorVertical);
1329 QObjectPrivate::disconnect(d->vertical, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical);
1333 d->cleanupVertical();
1336 d->vertical = vertical;
1339 if (!vertical->parentItem())
1340 vertical->setParentItem(qobject_cast<QQuickItem *>(parent()));
1341 vertical->setOrientation(Qt::Vertical);
1343 QQuickItemPrivate::get(vertical)->addItemChangeListener(d, QsbVerticalChangeTypes);
1344 QObjectPrivate::connect(vertical, &QQuickScrollBar::mirroredChanged, d, &QQuickScrollBarAttachedPrivate::mirrorVertical);
1345 QObjectPrivate::connect(vertical, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical);
1350 emit verticalChanged();
1355#include "moc_qquickscrollbar_p.cpp"
Combined button and popup list for selecting options.