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);
472#if QT_CONFIG(accessibility)
473 if (QAccessible::isActive()) {
474 if (QAccessibleInterface *accessible = QAccessible::queryAccessibleInterface(q)) {
475 QAccessibleValueInterface *valueInterface = accessible->valueInterface();
476 Q_ASSERT(valueInterface);
477 QAccessibleValueChangeEvent event(q, valueInterface->currentValue());
478 QAccessible::updateAccessibility(&event);
485
486
487
488
489
490
491qreal QQuickScrollBar::stepSize()
const
493 Q_D(
const QQuickScrollBar);
497void QQuickScrollBar::setStepSize(qreal step)
499 Q_D(QQuickScrollBar);
500 if (!qt_is_finite(step) || qFuzzyCompare(d->stepSize, step))
504 emit stepSizeChanged();
508
509
510
511
512
513
514
515
516
517
518
519bool QQuickScrollBar::isActive()
const
521 Q_D(
const QQuickScrollBar);
525void QQuickScrollBar::setActive(
bool active)
527 Q_D(QQuickScrollBar);
528 if (d->active == active)
532 emit activeChanged();
536
537
538
539
540bool QQuickScrollBar::isPressed()
const
542 Q_D(
const QQuickScrollBar);
546void QQuickScrollBar::setPressed(
bool pressed)
548 Q_D(QQuickScrollBar);
550 if (QQuickIndicatorButton *button = decreaseVisual())
551 button->setPressed(
false);
552 if (QQuickIndicatorButton *button = increaseVisual())
553 button->setPressed(
false);
555 if (d->pressed == pressed)
558 d->pressed = pressed;
559 setAccessibleProperty(
"pressed", pressed);
561 emit pressedChanged();
565
566
567
568
569
570
571
572
573
574
575
576
577
578Qt::Orientation QQuickScrollBar::orientation()
const
580 Q_D(
const QQuickScrollBar);
581 return d->orientation;
584void QQuickScrollBar::setOrientation(Qt::Orientation orientation)
586 Q_D(QQuickScrollBar);
587 if (d->orientation == orientation)
590 if (orientation == Qt::Horizontal)
591 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
593 d->setSizePolicy(QLayoutPolicy::Fixed, QLayoutPolicy::Preferred);
595 d->orientation = orientation;
596 if (isComponentComplete())
598 emit orientationChanged();
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625QQuickScrollBar::SnapMode QQuickScrollBar::snapMode()
const
627 Q_D(
const QQuickScrollBar);
631void QQuickScrollBar::setSnapMode(SnapMode mode)
633 Q_D(QQuickScrollBar);
634 if (d->snapMode == mode)
638 emit snapModeChanged();
642
643
644
645
646
647
648
649
650
651bool QQuickScrollBar::isInteractive()
const
653 Q_D(
const QQuickScrollBar);
654 return d->interactive;
657void QQuickScrollBar::setInteractive(
bool interactive)
659 Q_D(QQuickScrollBar);
660 d->explicitInteractive =
true;
661 d->setInteractive(interactive);
664void QQuickScrollBar::resetInteractive()
666 Q_D(QQuickScrollBar);
667 d->explicitInteractive =
false;
668 d->setInteractive(
true);
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696QQuickScrollBar::Policy QQuickScrollBar::policy()
const
698 Q_D(
const QQuickScrollBar);
702void QQuickScrollBar::setPolicy(Policy policy)
704 Q_D(QQuickScrollBar);
705 if (d->policy == policy)
709 emit policyChanged();
713
714
715
716
717
718
719
720
721bool QQuickScrollBar::isHorizontal()
const
723 Q_D(
const QQuickScrollBar);
724 return d->orientation == Qt::Horizontal;
728
729
730
731
732
733
734
735
736bool QQuickScrollBar::isVertical()
const
738 Q_D(
const QQuickScrollBar);
739 return d->orientation == Qt::Vertical;
743
744
745
746
747
748
749
750qreal QQuickScrollBar::minimumSize()
const
752 Q_D(
const QQuickScrollBar);
753 return d->minimumSize;
756void QQuickScrollBar::setMinimumSize(qreal minimumSize)
758 Q_D(QQuickScrollBar);
759 if (!qt_is_finite(minimumSize) || qFuzzyCompare(d->minimumSize, minimumSize))
762 auto oldVisualArea = d->visualArea();
763 d->minimumSize = qBound(0.0, minimumSize, 1.0);
764 if (isComponentComplete())
766 emit minimumSizeChanged();
767 d->visualAreaChange(d->visualArea(), oldVisualArea);
771
772
773
774
775
776
777
778
779
780qreal QQuickScrollBar::visualSize()
const
782 Q_D(
const QQuickScrollBar);
783 return d->visualArea().size;
787
788
789
790
791
792
793
794
795
796qreal QQuickScrollBar::visualPosition()
const
798 Q_D(
const QQuickScrollBar);
799 return d->visualArea().position;
802QQuickIndicatorButton *QQuickScrollBar::decreaseVisual()
804 Q_D(QQuickScrollBar);
805 return d->decreaseVisual;
808QQuickIndicatorButton *QQuickScrollBar::increaseVisual()
810 Q_D(QQuickScrollBar);
811 return d->increaseVisual;
815
816
817
818
819
820
821void QQuickScrollBar::increase()
823 Q_D(QQuickScrollBar);
824 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
825 bool wasActive = d->active;
827 setPosition(qMin<qreal>(1.0 - d->size, d->position + step));
828 setActive(wasActive);
832
833
834
835
836
837
838void QQuickScrollBar::decrease()
840 Q_D(QQuickScrollBar);
841 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
842 bool wasActive = d->active;
844 setPosition(qMax<qreal>(0.0, d->position - step));
845 setActive(wasActive);
848void QQuickScrollBar::mousePressEvent(QMouseEvent *event)
850 Q_D(QQuickScrollBar);
851 QQuickControl::mousePressEvent(event);
852 d->handleMove(event->position(), event->timestamp());
855#if QT_CONFIG(quicktemplates2_hover)
856void QQuickScrollBar::hoverChange()
858 Q_D(QQuickScrollBar);
862void QQuickScrollBar::hoverEnterEvent(QHoverEvent *event)
864 Q_D(QQuickScrollBar);
865 QQuickControl::hoverEnterEvent(event);
866 d->updateHover(event->position());
870void QQuickScrollBar::hoverMoveEvent(QHoverEvent *event)
872 Q_D(QQuickScrollBar);
873 QQuickControl::hoverMoveEvent(event);
874 d->updateHover(event->position());
878void QQuickScrollBar::hoverLeaveEvent(QHoverEvent *event)
880 Q_D(QQuickScrollBar);
881 QQuickControl::hoverLeaveEvent(event);
883 d->updateHover(QPoint(),
false);
888void QQuickScrollBar::classBegin()
890 Q_D(QQuickScrollBar);
891 QQuickControl::classBegin();
893 QQmlContext *context = qmlContext(
this);
895 QQmlEngine::setContextForObject(d->decreaseVisual, context);
896 QQmlEngine::setContextForObject(d->increaseVisual, context);
900void QQuickScrollBar::componentComplete()
902 Q_D(QQuickScrollBar);
903 QQuickIndicatorButtonPrivate::get(d->decreaseVisual)->executeIndicator(
true);
904 QQuickIndicatorButtonPrivate::get(d->increaseVisual)->executeIndicator(
true);
906 QQuickControl::componentComplete();
909#if QT_CONFIG(accessibility)
910void QQuickScrollBar::accessibilityActiveChanged(
bool active)
912 QQuickControl::accessibilityActiveChanged(active);
914 Q_D(QQuickScrollBar);
916 setAccessibleProperty(
"pressed", d->pressed);
918 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this)) {
919 connect(accessibleAttached, &QQuickAccessibleAttached::increaseAction,
this, &QQuickScrollBar::increase);
920 connect(accessibleAttached, &QQuickAccessibleAttached::decreaseAction,
this, &QQuickScrollBar::decrease);
923 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this)) {
924 disconnect(accessibleAttached, &QQuickAccessibleAttached::increaseAction,
this, &QQuickScrollBar::increase);
925 disconnect(accessibleAttached, &QQuickAccessibleAttached::decreaseAction,
this, &QQuickScrollBar::decrease);
930QAccessible::Role QQuickScrollBar::accessibleRole()
const
932 return QAccessible::ScrollBar;
942 QQuickItemPrivate::get(flickable)->removeItemChangeListener(
this, QQuickItemPrivate::Geometry);
943 QQuickItemPrivate::get(flickable)->removeItemChangeListener(
this, QQuickItemPrivate::Destroyed);
955 QQuickItemPrivate::get(item)->updateOrAddGeometryChangeListener(
this, QQuickGeometryChange::Size);
956 QQuickItemPrivate::get(item)->updateOrAddItemChangeListener(
this, QQuickItemPrivate::Destroyed);
966 Q_ASSERT(flickable && horizontal);
968 connect(flickable, &QQuickFlickable::movingHorizontallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateHorizontal);
971 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
972 QObject::connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
973 QObject::connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
976 QQuickItem *parent = horizontal->parentItem();
977 if (parent && parent == flickable->parentItem())
978 horizontal->stackAfter(flickable);
982 if (
auto control = qobject_cast<QQuickControl*>(q_func()->parent())) {
983 const auto visibility = horizontal->policy() != QQuickScrollBar::AlwaysOff
984 ? QQuickControlPrivate::UnhideVisibility::Show : QQuickControlPrivate::UnhideVisibility::Hide;
985 QQuickControlPrivate::unhideOldItem(control, horizontal, visibility);
989 horizontal->setSize(area->property(
"widthRatio").toReal());
990 horizontal->setPosition(area->property(
"xPosition").toReal());
995 Q_ASSERT(flickable && vertical);
997 connect(flickable, &QQuickFlickable::movingVerticallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateVertical);
1000 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1001 QObject::connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
1002 QObject::connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
1005 QQuickItem *parent = vertical->parentItem();
1006 if (parent && parent == flickable->parentItem())
1007 vertical->stackAfter(flickable);
1009 if (
auto control = qobject_cast<QQuickControl*>(q_func()->parent())) {
1010 const auto visibility = vertical->policy() != QQuickScrollBar::AlwaysOff
1011 ? QQuickControlPrivate::UnhideVisibility::Show : QQuickControlPrivate::UnhideVisibility::Hide;
1012 QQuickControlPrivate::unhideOldItem(control, vertical, visibility);
1016 vertical->setSize(area->property(
"heightRatio").toReal());
1017 vertical->setPosition(area->property(
"yPosition").toReal());
1022 Q_ASSERT(horizontal);
1024 QQuickControlPrivate::hideOldItem(horizontal);
1029 const QQmlProperty visibleProperty(horizontal, QStringLiteral(
"visible"));
1030 const QQmlProperty parentProperty(horizontal, QStringLiteral(
"parent"));
1031 QQmlPropertyPrivate::removeBinding(visibleProperty);
1032 QQmlPropertyPrivate::removeBinding(parentProperty);
1037 disconnect(flickable, &QQuickFlickable::movingHorizontallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateHorizontal);
1040 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1041 QObject::disconnect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
1042 QObject::disconnect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
1049 QQuickControlPrivate::hideOldItem(vertical);
1050 const QQmlProperty visibleProperty(vertical, QStringLiteral(
"visible"));
1051 const QQmlProperty parentProperty(vertical, QStringLiteral(
"parent"));
1052 QQmlPropertyPrivate::removeBinding(visibleProperty);
1053 QQmlPropertyPrivate::removeBinding(parentProperty);
1058 disconnect(flickable, &QQuickFlickable::movingVerticallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateVertical);
1061 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1062 QObject::disconnect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
1063 QObject::disconnect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
1093 const qreal viewwidth = f->width();
1094 const qreal maxxextent = -f->maxXExtent() + f->minXExtent();
1095 const qreal cx = horizontal->position() * (maxxextent + viewwidth) - f->minXExtent();
1097 if (!qIsNaN(cx) && !qFuzzyCompare(cx,
flickable->contentX()))
1108 const qreal viewheight = f->height();
1109 const qreal maxyextent = -f->maxYExtent() + f->minYExtent();
1110 const qreal cy = vertical->position() * (maxyextent + viewheight) - f->minYExtent();
1112 if (!qIsNaN(cy) && !qFuzzyCompare(cy,
flickable->contentY()))
1123 Q_ASSERT(horizontal && flickable);
1124 if (horizontal->parentItem() != flickable)
1126 horizontal->setWidth(flickable->width());
1128 horizontal->setY(flickable->height() - horizontal->height());
1133 Q_ASSERT(vertical && flickable);
1134 if (vertical->parentItem() != flickable)
1136 vertical->setHeight(flickable->height());
1138 vertical->setX(vertical->isMirrored() ? 0 : flickable->width() - vertical->width());
1145 if (horizontal && horizontal->height() > 0) {
1146#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
1147 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), diff.height() - horizontal->height());
1149 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), item->height() - diff.height() - horizontal->height());
1154 if (vertical && vertical->width() > 0) {
1155#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
1156 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), diff.width() - vertical->width());
1158 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), item->width() - diff.width() - vertical->width());
1167 if (item == vertical && flickable)
1173 if (item == horizontal && flickable)
1181 if (item == horizontal)
1182 horizontal =
nullptr;
1183 if (item == vertical)
1187QQuickScrollBarAttached::QQuickScrollBarAttached(QObject *parent)
1188 : QObject(*(
new QQuickScrollBarAttachedPrivate), parent)
1190 Q_D(QQuickScrollBarAttached);
1191 d->setFlickable(qobject_cast<QQuickFlickable *>(parent));
1193 if (parent && !d->flickable && !qobject_cast<QQuickScrollView *>(parent))
1194 qmlWarning(parent) <<
"ScrollBar attached property must be attached to an object deriving from Flickable or ScrollView";
1197QQuickScrollBarAttached::~QQuickScrollBarAttached()
1199 Q_D(QQuickScrollBarAttached);
1200 if (d->horizontal) {
1201 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsbHorizontalChangeTypes);
1202 d->horizontal =
nullptr;
1205 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsbVerticalChangeTypes);
1206 d->vertical =
nullptr;
1208 d->setFlickable(
nullptr);
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225QQuickScrollBar *QQuickScrollBarAttached::horizontal()
const
1227 Q_D(
const QQuickScrollBarAttached);
1228 return d->horizontal;
1231void QQuickScrollBarAttached::setHorizontal(QQuickScrollBar *horizontal)
1233 Q_D(QQuickScrollBarAttached);
1234 if (d->horizontal == horizontal)
1237 if (d->horizontal) {
1238 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsbHorizontalChangeTypes);
1239 QObjectPrivate::disconnect(d->horizontal, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal);
1243 d->cleanupHorizontal();
1246 d->horizontal = horizontal;
1249 if (!horizontal->parentItem())
1250 horizontal->setParentItem(qobject_cast<QQuickItem *>(parent()));
1251 horizontal->setOrientation(Qt::Horizontal);
1253 QQuickItemPrivate::get(horizontal)->addItemChangeListener(d, QsbHorizontalChangeTypes);
1254 QObjectPrivate::connect(horizontal, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal);
1257 d->initHorizontal();
1259 emit horizontalChanged();
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276QQuickScrollBar *QQuickScrollBarAttached::vertical()
const
1278 Q_D(
const QQuickScrollBarAttached);
1282void QQuickScrollBarAttached::setVertical(QQuickScrollBar *vertical)
1284 Q_D(QQuickScrollBarAttached);
1285 if (d->vertical == vertical)
1289 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsbVerticalChangeTypes);
1290 QObjectPrivate::disconnect(d->vertical, &QQuickScrollBar::mirroredChanged, d, &QQuickScrollBarAttachedPrivate::mirrorVertical);
1291 QObjectPrivate::disconnect(d->vertical, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical);
1295 d->cleanupVertical();
1298 d->vertical = vertical;
1301 if (!vertical->parentItem())
1302 vertical->setParentItem(qobject_cast<QQuickItem *>(parent()));
1303 vertical->setOrientation(Qt::Vertical);
1305 QQuickItemPrivate::get(vertical)->addItemChangeListener(d, QsbVerticalChangeTypes);
1306 QObjectPrivate::connect(vertical, &QQuickScrollBar::mirroredChanged, d, &QQuickScrollBarAttachedPrivate::mirrorVertical);
1307 QObjectPrivate::connect(vertical, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical);
1312 emit verticalChanged();
1317#include "moc_qquickscrollbar_p.cpp"
Combined button and popup list for selecting options.