131 qreal visualPos = position;
132 if (minimumSize > size)
133 visualPos = position / (1.0 - size) * (1.0 - minimumSize);
135 qreal maximumSize = qMax<qreal>(0.0, 1.0 - visualPos);
136 qreal visualSize = qMax<qreal>(minimumSize,
137 qMin<qreal>(qMax(size, minimumSize) + qMin<qreal>(0, visualPos),
140 visualPos = qMax<qreal>(0,qMin<qreal>(visualPos,qMax<qreal>(0, 1.0 - visualSize)));
142 return VisualArea(visualPos, visualSize);
147 Q_Q(QQuickScrollIndicator);
148 if (!qFuzzyCompare(newVisualArea.size, oldVisualArea.size))
149 emit q->visualSizeChanged();
150 if (!qFuzzyCompare(newVisualArea.position, oldVisualArea.position))
151 emit q->visualPositionChanged();
156 Q_Q(QQuickScrollIndicator);
162 const VisualArea visual = visualArea();
164 if (orientation == Qt::Horizontal) {
165 contentItem->setPosition(QPointF(q->leftPadding() + visual.position * q->availableWidth(), q->topPadding()));
166 contentItem->setSize(QSizeF(q->availableWidth() * visual.size, q->availableHeight()));
168 contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding() + visual.position * q->availableHeight()));
169 contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight() * visual.size));
173QQuickScrollIndicator::QQuickScrollIndicator(QQuickItem *parent)
174 : QQuickControl(*(
new QQuickScrollIndicatorPrivate), parent)
176 Q_D(QQuickScrollIndicator);
177 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
203void QQuickScrollIndicator::setSize(qreal size)
205 Q_D(QQuickScrollIndicator);
206 if (qFuzzyCompare(d->size, size))
209 auto oldVisualArea = d->visualArea();
211 if (d->size + d->position > 1.0) {
212 setPosition(1.0 - d->size);
213 oldVisualArea = d->visualArea();
215 if (isComponentComplete())
218 d->visualAreaChange(d->visualArea(), oldVisualArea);
237void QQuickScrollIndicator::setPosition(qreal position)
239 Q_D(QQuickScrollIndicator);
240 if (qFuzzyCompare(d->position, position))
243 auto oldVisualArea = d->visualArea();
244 d->position = position;
245 if (isComponentComplete())
247 emit positionChanged();
248 d->visualAreaChange(d->visualArea(), oldVisualArea);
299void QQuickScrollIndicator::setOrientation(Qt::Orientation orientation)
301 Q_D(QQuickScrollIndicator);
302 if (d->orientation == orientation)
305 if (orientation == Qt::Horizontal)
306 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
308 d->setSizePolicy(QLayoutPolicy::Fixed, QLayoutPolicy::Preferred);
310 d->orientation = orientation;
311 if (isComponentComplete())
313 emit orientationChanged();
360void QQuickScrollIndicator::setMinimumSize(qreal minimumSize)
362 Q_D(QQuickScrollIndicator);
363 if (qFuzzyCompare(d->minimumSize, minimumSize))
366 auto oldVisualArea = d->visualArea();
367 d->minimumSize = minimumSize;
368 if (isComponentComplete())
370 emit minimumSizeChanged();
371 d->visualAreaChange(d->visualArea(), oldVisualArea);
458 if (horizontal && horizontal->height() > 0) {
459#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
460 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), diff.height() - horizontal->height());
462 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), item->height() - diff.height() - horizontal->height());
466 if (vertical && vertical->width() > 0) {
467#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
468 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), diff.width() - vertical->width());
470 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), item->width() - diff.width() - vertical->width());
496QQuickScrollIndicatorAttached::QQuickScrollIndicatorAttached(QObject *parent)
497 : QObject(*(
new QQuickScrollIndicatorAttachedPrivate), parent)
499 Q_D(QQuickScrollIndicatorAttached);
500 d->flickable = qobject_cast<QQuickFlickable *>(parent);
502 QQuickItemPrivate::get(d->flickable)->updateOrAddGeometryChangeListener(d, QQuickGeometryChange::Size);
504 qmlWarning(parent) <<
"ScrollIndicator attached property must be attached to an object deriving from Flickable";
507QQuickScrollIndicatorAttached::~QQuickScrollIndicatorAttached()
509 Q_D(QQuickScrollIndicatorAttached);
512 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsiHorizontalChangeTypes);
514 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsiVerticalChangeTypes);
518 QQuickItemPrivate::get(d->flickable)->removeItemChangeListener(d, QQuickItemPrivate::Geometry);
542void QQuickScrollIndicatorAttached::setHorizontal(QQuickScrollIndicator *horizontal)
544 Q_D(QQuickScrollIndicatorAttached);
545 if (d->horizontal == horizontal)
548 if (d->horizontal && d->flickable) {
549 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsiHorizontalChangeTypes);
550 QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateHorizontal);
553 QObject *area = d->flickable->property(
"visibleArea").value<QObject *>();
554 disconnect(area, SIGNAL(widthRatioChanged(qreal)), d->horizontal, SLOT(setSize(qreal)));
555 disconnect(area, SIGNAL(xPositionChanged(qreal)), d->horizontal, SLOT(setPosition(qreal)));
558 d->horizontal = horizontal;
560 if (horizontal && d->flickable) {
561 if (!horizontal->parentItem())
562 horizontal->setParentItem(d->flickable);
563 horizontal->setOrientation(Qt::Horizontal);
565 QQuickItemPrivate::get(horizontal)->addItemChangeListener(d, QsiHorizontalChangeTypes);
566 QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateHorizontal);
569 QObject *area = d->flickable->property(
"visibleArea").value<QObject *>();
570 connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
571 connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
573 d->layoutHorizontal();
574 horizontal->setSize(area->property(
"widthRatio").toReal());
575 horizontal->setPosition(area->property(
"xPosition").toReal());
577 emit horizontalChanged();
600void QQuickScrollIndicatorAttached::setVertical(QQuickScrollIndicator *vertical)
602 Q_D(QQuickScrollIndicatorAttached);
603 if (d->vertical == vertical)
606 if (d->vertical && d->flickable) {
607 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsiVerticalChangeTypes);
608 QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateVertical);
611 QObject *area = d->flickable->property(
"visibleArea").value<QObject *>();
612 disconnect(area, SIGNAL(heightRatioChanged(qreal)), d->vertical, SLOT(setSize(qreal)));
613 disconnect(area, SIGNAL(yPositionChanged(qreal)), d->vertical, SLOT(setPosition(qreal)));
616 d->vertical = vertical;
618 if (vertical && d->flickable) {
619 if (!vertical->parentItem())
620 vertical->setParentItem(d->flickable);
621 vertical->setOrientation(Qt::Vertical);
623 QQuickItemPrivate::get(vertical)->addItemChangeListener(d, QsiVerticalChangeTypes);
624 QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateVertical);
627 QObject *area = d->flickable->property(
"visibleArea").value<QObject *>();
628 connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
629 connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
632 vertical->setSize(area->property(
"heightRatio").toReal());
633 vertical->setPosition(area->property(
"yPosition").toReal());
635 emit verticalChanged();