129 qreal visualPos = position;
130 if (minimumSize > size)
131 visualPos = position / (1.0 - size) * (1.0 - minimumSize);
133 qreal maximumSize = qMax<qreal>(0.0, 1.0 - visualPos);
134 qreal visualSize = qMax<qreal>(minimumSize,
135 qMin<qreal>(qMax(size, minimumSize) + qMin<qreal>(0, visualPos),
138 visualPos = qMax<qreal>(0,qMin<qreal>(visualPos,qMax<qreal>(0, 1.0 - visualSize)));
140 return VisualArea(visualPos, visualSize);
145 Q_Q(QQuickScrollIndicator);
146 if (!qFuzzyCompare(newVisualArea.size, oldVisualArea.size))
147 emit q->visualSizeChanged();
148 if (!qFuzzyCompare(newVisualArea.position, oldVisualArea.position))
149 emit q->visualPositionChanged();
154 Q_Q(QQuickScrollIndicator);
160 const VisualArea visual = visualArea();
162 if (orientation == Qt::Horizontal) {
163 contentItem->setPosition(QPointF(q->leftPadding() + visual.position * q->availableWidth(), q->topPadding()));
164 contentItem->setSize(QSizeF(q->availableWidth() * visual.size, q->availableHeight()));
166 contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding() + visual.position * q->availableHeight()));
167 contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight() * visual.size));
171QQuickScrollIndicator::QQuickScrollIndicator(QQuickItem *parent)
172 : QQuickControl(*(
new QQuickScrollIndicatorPrivate), parent)
174 Q_D(QQuickScrollIndicator);
175 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
201void QQuickScrollIndicator::setSize(qreal size)
203 Q_D(QQuickScrollIndicator);
204 if (qFuzzyCompare(d->size, size))
207 auto oldVisualArea = d->visualArea();
209 if (d->size + d->position > 1.0) {
210 setPosition(1.0 - d->size);
211 oldVisualArea = d->visualArea();
213 if (isComponentComplete())
216 d->visualAreaChange(d->visualArea(), oldVisualArea);
235void QQuickScrollIndicator::setPosition(qreal position)
237 Q_D(QQuickScrollIndicator);
238 if (qFuzzyCompare(d->position, position))
241 auto oldVisualArea = d->visualArea();
242 d->position = position;
243 if (isComponentComplete())
245 emit positionChanged();
246 d->visualAreaChange(d->visualArea(), oldVisualArea);
297void QQuickScrollIndicator::setOrientation(Qt::Orientation orientation)
299 Q_D(QQuickScrollIndicator);
300 if (d->orientation == orientation)
303 if (orientation == Qt::Horizontal)
304 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
306 d->setSizePolicy(QLayoutPolicy::Fixed, QLayoutPolicy::Preferred);
308 d->orientation = orientation;
309 if (isComponentComplete())
311 emit orientationChanged();
358void QQuickScrollIndicator::setMinimumSize(qreal minimumSize)
360 Q_D(QQuickScrollIndicator);
361 if (qFuzzyCompare(d->minimumSize, minimumSize))
364 auto oldVisualArea = d->visualArea();
365 d->minimumSize = minimumSize;
366 if (isComponentComplete())
368 emit minimumSizeChanged();
369 d->visualAreaChange(d->visualArea(), oldVisualArea);
456 if (horizontal && horizontal->height() > 0) {
457#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
458 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), diff.height() - horizontal->height());
460 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), item->height() - diff.height() - horizontal->height());
464 if (vertical && vertical->width() > 0) {
465#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
466 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), diff.width() - vertical->width());
468 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), item->width() - diff.width() - vertical->width());
494QQuickScrollIndicatorAttached::QQuickScrollIndicatorAttached(QObject *parent)
495 : QObject(*(
new QQuickScrollIndicatorAttachedPrivate), parent)
497 Q_D(QQuickScrollIndicatorAttached);
498 d->flickable = qobject_cast<QQuickFlickable *>(parent);
500 QQuickItemPrivate::get(d->flickable)->updateOrAddGeometryChangeListener(d, QQuickGeometryChange::Size);
502 qmlWarning(parent) <<
"ScrollIndicator attached property must be attached to an object deriving from Flickable";
505QQuickScrollIndicatorAttached::~QQuickScrollIndicatorAttached()
507 Q_D(QQuickScrollIndicatorAttached);
510 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsiHorizontalChangeTypes);
512 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsiVerticalChangeTypes);
516 QQuickItemPrivate::get(d->flickable)->removeItemChangeListener(d, QQuickItemPrivate::Geometry);
540void QQuickScrollIndicatorAttached::setHorizontal(QQuickScrollIndicator *horizontal)
542 Q_D(QQuickScrollIndicatorAttached);
543 if (d->horizontal == horizontal)
546 if (d->horizontal && d->flickable) {
547 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsiHorizontalChangeTypes);
548 QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateHorizontal);
551 QObject *area = d->flickable->property(
"visibleArea").value<QObject *>();
552 disconnect(area, SIGNAL(widthRatioChanged(qreal)), d->horizontal, SLOT(setSize(qreal)));
553 disconnect(area, SIGNAL(xPositionChanged(qreal)), d->horizontal, SLOT(setPosition(qreal)));
556 d->horizontal = horizontal;
558 if (horizontal && d->flickable) {
559 if (!horizontal->parentItem())
560 horizontal->setParentItem(d->flickable);
561 horizontal->setOrientation(Qt::Horizontal);
563 QQuickItemPrivate::get(horizontal)->addItemChangeListener(d, QsiHorizontalChangeTypes);
564 QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateHorizontal);
567 QObject *area = d->flickable->property(
"visibleArea").value<QObject *>();
568 connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
569 connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
571 d->layoutHorizontal();
572 horizontal->setSize(area->property(
"widthRatio").toReal());
573 horizontal->setPosition(area->property(
"xPosition").toReal());
575 emit horizontalChanged();
598void QQuickScrollIndicatorAttached::setVertical(QQuickScrollIndicator *vertical)
600 Q_D(QQuickScrollIndicatorAttached);
601 if (d->vertical == vertical)
604 if (d->vertical && d->flickable) {
605 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsiVerticalChangeTypes);
606 QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateVertical);
609 QObject *area = d->flickable->property(
"visibleArea").value<QObject *>();
610 disconnect(area, SIGNAL(heightRatioChanged(qreal)), d->vertical, SLOT(setSize(qreal)));
611 disconnect(area, SIGNAL(yPositionChanged(qreal)), d->vertical, SLOT(setPosition(qreal)));
614 d->vertical = vertical;
616 if (vertical && d->flickable) {
617 if (!vertical->parentItem())
618 vertical->setParentItem(d->flickable);
619 vertical->setOrientation(Qt::Vertical);
621 QQuickItemPrivate::get(vertical)->addItemChangeListener(d, QsiVerticalChangeTypes);
622 QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateVertical);
625 QObject *area = d->flickable->property(
"visibleArea").value<QObject *>();
626 connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
627 connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
630 vertical->setSize(area->property(
"heightRatio").toReal());
631 vertical->setPosition(area->property(
"yPosition").toReal());
633 emit verticalChanged();