178QAbstractSliderPrivate::QAbstractSliderPrivate()
179 : minimum(0), maximum(99), pageStep(10), value(0), position(0), pressValue(-1),
180 singleStep(1), singleStepFromItemView(-1), viewMayChangeSingleStep(
true), offset_accumulated(0), tracking(
true),
181 blocktracking(
false), pressed(
false),
182 invertedAppearance(
false), invertedControls(
false),
183 orientation(Qt::Horizontal), repeatAction(QAbstractSlider::SliderNoAction)
184#ifdef QT_KEYPAD_NAVIGATION
185 , isAutoRepeating(
false)
186 , repeatMultiplier(1)
188 firstRepeat.invalidate();
264void QAbstractSlider::setOrientation(Qt::Orientation orientation)
266 Q_D(QAbstractSlider);
267 if (d->orientation == orientation)
270 d->orientation = orientation;
271 if (!testAttribute(Qt::WA_WState_OwnSizePolicy)) {
272 setSizePolicy(sizePolicy().transposed());
273 setAttribute(Qt::WA_WState_OwnSizePolicy,
false);
495void QAbstractSlider::setValue(
int value)
497 Q_D(QAbstractSlider);
498 value = d->bound(value);
499 if (d->value == value && d->position == value)
503 const bool emitValueChanged = (value != d->value);
506 if (d->position != value) {
509 emit sliderMoved(d->position);
511#if QT_CONFIG(accessibility)
512 QAccessibleValueChangeEvent event(
this, d->value);
513 QAccessible::updateAccessibility(&event);
515 sliderChange(SliderValueChange);
517 if (emitValueChanged)
518 emit valueChanged(value);
579void QAbstractSlider::triggerAction(SliderAction action)
581 Q_D(QAbstractSlider);
582 d->blocktracking =
true;
584 case SliderSingleStepAdd:
585 setSliderPosition(d->overflowSafeAdd(d->effectiveSingleStep()));
587 case SliderSingleStepSub:
588 setSliderPosition(d->overflowSafeAdd(-d->effectiveSingleStep()));
590 case SliderPageStepAdd:
591 setSliderPosition(d->overflowSafeAdd(d->pageStep));
593 case SliderPageStepSub:
594 setSliderPosition(d->overflowSafeAdd(-d->pageStep));
596 case SliderToMinimum:
597 setSliderPosition(d->minimum);
599 case SliderToMaximum:
600 setSliderPosition(d->maximum);
606 emit actionTriggered(action);
607 d->blocktracking =
false;
608 setValue(d->position);
639void QAbstractSlider::timerEvent(QTimerEvent *e)
641 Q_D(QAbstractSlider);
642 if (e->timerId() == d->repeatActionTimer.timerId()) {
643 if (d->repeatActionTime) {
644 d->repeatActionTimer.start(d->repeatActionTime,
this);
645 d->repeatActionTime = 0;
647 if (d->repeatAction == SliderPageStepAdd)
648 d->setAdjustedSliderPosition(d->overflowSafeAdd(d->pageStep));
649 else if (d->repeatAction == SliderPageStepSub)
650 d->setAdjustedSliderPosition(d->overflowSafeAdd(-d->pageStep));
652 triggerAction(d->repeatAction);
668bool QAbstractSliderPrivate::scrollByDelta(Qt::Orientation orientation, Qt::KeyboardModifiers modifiers,
int delta)
670 Q_Q(QAbstractSlider);
671 int stepsToScroll = 0;
673 if (orientation == Qt::Horizontal)
675 qreal offset = qreal(delta) / 120;
677 if ((modifiers & Qt::ControlModifier) || (modifiers & Qt::ShiftModifier)) {
679 stepsToScroll = qBound(-pageStep,
int(offset * pageStep), pageStep);
680 offset_accumulated = 0;
685 qreal stepsToScrollF =
686#if QT_CONFIG(wheelevent)
687 QApplication::wheelScrollLines() *
689 offset * effectiveSingleStep();
691 if (offset_accumulated != 0 && (offset / offset_accumulated) < 0)
692 offset_accumulated = 0;
694 offset_accumulated += stepsToScrollF;
697 stepsToScroll = qBound(-pageStep,
int(offset_accumulated), pageStep);
699 offset_accumulated -=
int(offset_accumulated);
700 if (stepsToScroll == 0) {
703 const float effective_offset = invertedControls ? -offset_accumulated : offset_accumulated;
704 if (effective_offset > 0.f && value < maximum)
706 if (effective_offset < 0.f && value > minimum)
708 offset_accumulated = 0;
713 if (invertedControls)
714 stepsToScroll = -stepsToScroll;
716 int prevValue = value;
717 position = bound(overflowSafeAdd(stepsToScroll));
718 q->triggerAction(QAbstractSlider::SliderMove);
720 if (prevValue == value) {
721 offset_accumulated = 0;
748void QAbstractSlider::keyPressEvent(QKeyEvent *ev)
750 Q_D(QAbstractSlider);
751 SliderAction action = SliderNoAction;
752#ifdef QT_KEYPAD_NAVIGATION
753 if (ev->isAutoRepeat()) {
754 if (!d->firstRepeat.isValid())
755 d->firstRepeat.start();
756 else if (1 == d->repeatMultiplier) {
759 const int repeatMSecs = d->firstRepeat.elapsed();
762
763
764 const qreal currentTimeElapse = (qreal(maximum()) / singleStep()) * repeatMSecs;
767
768
769
770
771 const int SliderRepeatElapse = 2500;
773 d->repeatMultiplier = currentTimeElapse / SliderRepeatElapse;
777 else if (d->firstRepeat.isValid()) {
778 d->firstRepeat.invalidate();
779 d->repeatMultiplier = 1;
785#ifdef QT_KEYPAD_NAVIGATION
787 if (QApplicationPrivate::keypadNavigationEnabled())
788 setEditFocus(!hasEditFocus());
793 if (QApplicationPrivate::keypadNavigationEnabled() && hasEditFocus()) {
794 setValue(d->origValue);
802#ifdef QT_KEYPAD_NAVIGATION
806 if (QApplicationPrivate::keypadNavigationEnabled()
807 && (!hasEditFocus() && QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
808 || d->orientation == Qt::Vertical
810 && (QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) || QWidgetPrivate::inTabWidget(
this)))) {
814 if (QApplicationPrivate::keypadNavigationEnabled() && d->orientation == Qt::Vertical)
815 action = d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd;
819 action = d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd;
821 action = !d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd;
824#ifdef QT_KEYPAD_NAVIGATION
826 if (QApplicationPrivate::keypadNavigationEnabled()
827 && (!hasEditFocus() && QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
828 || d->orientation == Qt::Vertical
830 && (QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) || QWidgetPrivate::inTabWidget(
this)))) {
834 if (QApplicationPrivate::keypadNavigationEnabled() && d->orientation == Qt::Vertical)
835 action = d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub;
839 action = d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub;
841 action = !d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub;
844#ifdef QT_KEYPAD_NAVIGATION
847 if (QApplicationPrivate::keypadNavigationEnabled()
848 && (QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
849 || d->orientation == Qt::Horizontal
850 || !hasEditFocus() && QWidgetPrivate::canKeypadNavigate(Qt::Vertical))) {
855 action = d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd;
858#ifdef QT_KEYPAD_NAVIGATION
860 if (QApplicationPrivate::keypadNavigationEnabled()
861 && (QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
862 || d->orientation == Qt::Horizontal
863 || !hasEditFocus() && QWidgetPrivate::canKeypadNavigate(Qt::Vertical))) {
868 action = d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub;
871 action = d->invertedControls ? SliderPageStepSub : SliderPageStepAdd;
873 case Qt::Key_PageDown:
874 action = d->invertedControls ? SliderPageStepAdd : SliderPageStepSub;
877 action = SliderToMinimum;
880 action = SliderToMaximum;
887 triggerAction(action);