179QAbstractSliderPrivate::QAbstractSliderPrivate()
180 : minimum(0), maximum(99), pageStep(10), value(0), position(0), pressValue(-1),
181 singleStep(1), singleStepFromItemView(-1), viewMayChangeSingleStep(
true), offset_accumulated(0), tracking(
true),
182 blocktracking(
false), pressed(
false),
183 invertedAppearance(
false), invertedControls(
false),
184 orientation(Qt::Horizontal), repeatAction(QAbstractSlider::SliderNoAction)
185#ifdef QT_KEYPAD_NAVIGATION
186 , isAutoRepeating(
false)
187 , repeatMultiplier(1)
189 firstRepeat.invalidate();
265void QAbstractSlider::setOrientation(Qt::Orientation orientation)
267 Q_D(QAbstractSlider);
268 if (d->orientation == orientation)
271 d->orientation = orientation;
272 if (!testAttribute(Qt::WA_WState_OwnSizePolicy)) {
273 setSizePolicy(sizePolicy().transposed());
274 setAttribute(Qt::WA_WState_OwnSizePolicy,
false);
276 sliderChange(SliderOrientationChange);
496void QAbstractSlider::setValue(
int value)
498 Q_D(QAbstractSlider);
499 value = d->bound(value);
500 if (d->value == value && d->position == value)
504 const bool emitValueChanged = (value != d->value);
507 if (d->position != value) {
510 emit sliderMoved(d->position);
512#if QT_CONFIG(accessibility)
513 QAccessibleValueChangeEvent event(
this, d->value);
514 QAccessible::updateAccessibility(&event);
516 sliderChange(SliderValueChange);
518 if (emitValueChanged)
519 emit valueChanged(value);
580void QAbstractSlider::triggerAction(SliderAction action)
582 Q_D(QAbstractSlider);
583 d->blocktracking =
true;
585 case SliderSingleStepAdd:
586 setSliderPosition(d->overflowSafeAdd(d->effectiveSingleStep()));
588 case SliderSingleStepSub:
589 setSliderPosition(d->overflowSafeAdd(-d->effectiveSingleStep()));
591 case SliderPageStepAdd:
592 setSliderPosition(d->overflowSafeAdd(d->pageStep));
594 case SliderPageStepSub:
595 setSliderPosition(d->overflowSafeAdd(-d->pageStep));
597 case SliderToMinimum:
598 setSliderPosition(d->minimum);
600 case SliderToMaximum:
601 setSliderPosition(d->maximum);
607 emit actionTriggered(action);
608 d->blocktracking =
false;
609 setValue(d->position);
640void QAbstractSlider::timerEvent(QTimerEvent *e)
642 Q_D(QAbstractSlider);
643 if (e->timerId() == d->repeatActionTimer.timerId()) {
644 if (d->repeatActionTime) {
645 d->repeatActionTimer.start(d->repeatActionTime,
this);
646 d->repeatActionTime = 0;
648 if (d->repeatAction == SliderPageStepAdd)
649 d->setAdjustedSliderPosition(d->overflowSafeAdd(d->pageStep));
650 else if (d->repeatAction == SliderPageStepSub)
651 d->setAdjustedSliderPosition(d->overflowSafeAdd(-d->pageStep));
653 triggerAction(d->repeatAction);
669bool QAbstractSliderPrivate::scrollByDelta(Qt::Orientation orientation, Qt::KeyboardModifiers modifiers,
int delta)
671 Q_Q(QAbstractSlider);
672 int stepsToScroll = 0;
674 if (orientation == Qt::Horizontal)
676 qreal offset = qreal(delta) / 120;
678 if ((modifiers & Qt::ControlModifier) || (modifiers & Qt::ShiftModifier)) {
680 stepsToScroll = qBound(-pageStep,
int(offset * pageStep), pageStep);
681 offset_accumulated = 0;
686 qreal stepsToScrollF =
687#if QT_CONFIG(wheelevent)
688 QApplication::wheelScrollLines() *
690 offset * effectiveSingleStep();
692 if (offset_accumulated != 0 && (offset / offset_accumulated) < 0)
693 offset_accumulated = 0;
695 offset_accumulated += stepsToScrollF;
698 stepsToScroll = qBound(-pageStep,
int(offset_accumulated), pageStep);
700 offset_accumulated -=
int(offset_accumulated);
701 if (stepsToScroll == 0) {
704 const float effective_offset = invertedControls ? -offset_accumulated : offset_accumulated;
705 if (effective_offset > 0.f && value < maximum)
707 if (effective_offset < 0.f && value > minimum)
709 offset_accumulated = 0;
714 if (invertedControls)
715 stepsToScroll = -stepsToScroll;
717 int prevValue = value;
718 position = bound(overflowSafeAdd(stepsToScroll));
719 q->triggerAction(QAbstractSlider::SliderMove);
721 if (prevValue == value) {
722 offset_accumulated = 0;
749void QAbstractSlider::keyPressEvent(QKeyEvent *ev)
751 Q_D(QAbstractSlider);
752 SliderAction action = SliderNoAction;
753#ifdef QT_KEYPAD_NAVIGATION
754 if (ev->isAutoRepeat()) {
755 if (!d->firstRepeat.isValid())
756 d->firstRepeat.start();
757 else if (1 == d->repeatMultiplier) {
760 const int repeatMSecs = d->firstRepeat.elapsed();
763
764
765 const qreal currentTimeElapse = (qreal(maximum()) / singleStep()) * repeatMSecs;
768
769
770
771
772 const int SliderRepeatElapse = 2500;
774 d->repeatMultiplier = currentTimeElapse / SliderRepeatElapse;
778 else if (d->firstRepeat.isValid()) {
779 d->firstRepeat.invalidate();
780 d->repeatMultiplier = 1;
786#ifdef QT_KEYPAD_NAVIGATION
788 if (QApplicationPrivate::keypadNavigationEnabled())
789 setEditFocus(!hasEditFocus());
794 if (QApplicationPrivate::keypadNavigationEnabled() && hasEditFocus()) {
795 setValue(d->origValue);
803#ifdef QT_KEYPAD_NAVIGATION
807 if (QApplicationPrivate::keypadNavigationEnabled()
808 && (!hasEditFocus() && QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
809 || d->orientation == Qt::Vertical
811 && (QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) || QWidgetPrivate::inTabWidget(
this)))) {
815 if (QApplicationPrivate::keypadNavigationEnabled() && d->orientation == Qt::Vertical)
816 action = d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd;
820 action = d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd;
822 action = !d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd;
825#ifdef QT_KEYPAD_NAVIGATION
827 if (QApplicationPrivate::keypadNavigationEnabled()
828 && (!hasEditFocus() && QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
829 || d->orientation == Qt::Vertical
831 && (QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) || QWidgetPrivate::inTabWidget(
this)))) {
835 if (QApplicationPrivate::keypadNavigationEnabled() && d->orientation == Qt::Vertical)
836 action = d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub;
840 action = d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub;
842 action = !d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub;
845#ifdef QT_KEYPAD_NAVIGATION
848 if (QApplicationPrivate::keypadNavigationEnabled()
849 && (QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
850 || d->orientation == Qt::Horizontal
851 || !hasEditFocus() && QWidgetPrivate::canKeypadNavigate(Qt::Vertical))) {
856 action = d->invertedControls ? SliderSingleStepSub : SliderSingleStepAdd;
859#ifdef QT_KEYPAD_NAVIGATION
861 if (QApplicationPrivate::keypadNavigationEnabled()
862 && (QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
863 || d->orientation == Qt::Horizontal
864 || !hasEditFocus() && QWidgetPrivate::canKeypadNavigate(Qt::Vertical))) {
869 action = d->invertedControls ? SliderSingleStepAdd : SliderSingleStepSub;
872 action = d->invertedControls ? SliderPageStepSub : SliderPageStepAdd;
874 case Qt::Key_PageDown:
875 action = d->invertedControls ? SliderPageStepAdd : SliderPageStepSub;
878 action = SliderToMinimum;
881 action = SliderToMaximum;
888 triggerAction(action);