41#include <QApplication>
44#include <QIntValidator>
46#include <QDoubleSpinBox>
98 d->edit =
new QLineEdit(
this);
99 d->edit->setFrame(
false);
100 d->edit->setAlignment(Qt::AlignCenter);
102 d->edit->installEventFilter(
this);
105 d->edit->setAutoFillBackground(
false);
106 QPalette pal = d->edit->palette();
107 pal.setColor(QPalette::Base, Qt::transparent);
108 d->edit->setPalette(pal);
110 connect(d->edit, SIGNAL(editingFinished()),
113 d->validator =
new QDoubleValidator(d->edit);
114 d->edit->setValidator(d->validator);
119 setFocusPolicy(Qt::StrongFocus);
120 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
123 d->dummySpinBox =
new QSpinBox(
this);
124 d->dummySpinBox->hide();
137 if (d->edit->isVisible())
return;
141 d->edit->selectAll();
143 d->edit->setFocus(Qt::OtherFocusReason);
159 QPainter painter(
this);
167 painter.setClipping(
true);
168 QRect eraseRect(QPoint(rect().x(), rect().y()),
169 QPoint(
editRect(spinOpts).right(), rect().bottom()));
170 painter.setClipRegion(QRegion(rect()).subtracted(eraseRect));
171 style()->drawComplexControl(QStyle::CC_SpinBox, &spinOpts, &painter, d->dummySpinBox);
172 painter.setClipping(
false);
180 style()->drawControl(QStyle::CE_ProgressBar, &progressOpts, &painter, 0);
183 if (hasFocus() && d->edit->hasFocus())
185 QStyleOptionFocusRect focusOpts;
186 focusOpts.initFrom(
this);
187 focusOpts.rect = progressOpts.rect;
188 focusOpts.backgroundColor = palette().color(QPalette::Window);
189 style()->drawPrimitive(QStyle::PE_FrameFocusRect, &focusOpts, &painter,
this);
200 if (e->buttons() & Qt::LeftButton)
204 d->upButtonDown =
true;
208 d->downButtonDown =
true;
211 else if (e->buttons() & Qt::RightButton)
226 if (
upButtonRect(spinOpts).contains(e->pos()) && d->upButtonDown)
230 else if (
downButtonRect(spinOpts).contains(e->pos()) && d->downButtonDown)
234 else if (
editRect(spinOpts).contains(e->pos()) &&
235 !(d->edit->isVisible()) &&
236 !(d->upButtonDown || d->downButtonDown))
242 d->upButtonDown =
false;
243 d->downButtonDown =
false;
251 if( e->modifiers() & Qt::ShiftModifier )
255 d->shiftPercent = pow(
double(d->value - d->minimum)/
double(d->maximum - d->minimum),
256 1/
double(d->exponentRatio));
262 d->shiftMode =
false;
266 if (e->buttons() & Qt::LeftButton && !(d->downButtonDown || d->upButtonDown))
288 d->shiftPercent = pow(
double(d->value - d->minimum)/
double(d->maximum - d->minimum), 1/
double(d->exponentRatio) );
294 case Qt::Key_Control:
297 case Qt::Key_Super_L:
298 case Qt::Key_Super_R:
312 int step = d->fastSliderStep;
313 if( e->modifiers() & Qt::ShiftModifier )
315 step = d->singleStep;
318 if ( e->angleDelta().y() > 0)
335 if (recv ==
static_cast<QObject*
>(d->edit) && e->type() == QEvent::KeyRelease)
337 QKeyEvent*
const keyEvent =
static_cast<QKeyEvent*
>(e);
339 switch (keyEvent->key())
362 QFontMetrics fm(font());
365 int w = qMax(fm.horizontalAdvance(QString::number(d->maximum)), 50);
366 QSize hint(w, d->edit->sizeHint().height() + 3);
373 spinOpts.rect.setSize(hint + extra);
374 extra += hint - style()->subControlRect(QStyle::CC_SpinBox, &spinOpts,
375 QStyle::SC_SpinBoxEditField,
this).size();
377 spinOpts.rect.setSize(hint + extra);
378 extra += hint - style()->subControlRect(QStyle::CC_SpinBox, &spinOpts,
379 QStyle::SC_SpinBoxEditField,
this).size();
382 spinOpts.rect = rect();
384 return style()->sizeFromContents(QStyle::CT_SpinBox, &spinOpts, hint, 0);
396 QStyleOptionSpinBox opts;
399 opts.buttonSymbols = QAbstractSpinBox::UpDownArrows;
400 opts.subControls = QStyle::SC_SpinBoxUp | QStyle::SC_SpinBoxDown;
403 if (d->value == d->minimum)
405 opts.stepEnabled = QAbstractSpinBox::StepUpEnabled;
407 else if (d->value == d->maximum)
409 opts.stepEnabled = QAbstractSpinBox::StepDownEnabled;
413 opts.stepEnabled = QAbstractSpinBox::StepUpEnabled | QAbstractSpinBox::StepDownEnabled;
419 opts.activeSubControls = QStyle::SC_SpinBoxUp;
421 else if (d->downButtonDown)
423 opts.activeSubControls = QStyle::SC_SpinBoxDown;
427 opts.activeSubControls = QFlags<QStyle::SubControl>();
441 QStyleOptionProgressBar progressOpts;
442 progressOpts.initFrom(
this);
443 progressOpts.maximum = d->maximum;
444 progressOpts.minimum = d->minimum;
446 double minDbl = d->minimum;
447 double dValues = (d->maximum - minDbl);
449 progressOpts.progress = dValues * pow((d->value - minDbl) / dValues, 1.0 / d->exponentRatio) + minDbl;
451 progressOpts.textAlignment = Qt::AlignCenter;
452 progressOpts.textVisible = !(d->edit->isVisible());
455 progressOpts.rect =
editRect(spinOpts);
462 return style()->subControlRect(QStyle::CC_SpinBox, &
spinBoxOptions,
463 QStyle::SC_SpinBoxEditField);
473 return style()->subControlRect(QStyle::CC_SpinBox, &
spinBoxOptions,
474 QStyle::SC_SpinBoxUp);
479 return style()->subControlRect(QStyle::CC_SpinBox, &
spinBoxOptions,
480 QStyle::SC_SpinBoxDown);
491 QRect correctedProgRect =
progressRect(progressOpts).adjusted(2, 2, -2, -2);
494 double leftDbl = correctedProgRect.left();
495 double xDbl = x - leftDbl;
498 double rightDbl = correctedProgRect.right();
499 double minDbl = d->minimum;
500 double maxDbl = d->maximum;
501 double dValues = (maxDbl - minDbl);
502 double percent = (xDbl / (rightDbl - leftDbl));
505 if ( modifiers & Qt::ShiftModifier )
507 percent = d->shiftPercent + (percent - d->shiftPercent) * d->slowFactor;
511 double realvalue = ((dValues * pow(percent, d->exponentRatio)) + minDbl);
515 if ( modifiers & Qt::ControlModifier )
517 double fstep = d->fastSliderStep;
519 if( modifiers & Qt::ShiftModifier )
521 fstep *= d->slowFactor;
524 realvalue = floor((realvalue + fstep / 2) / fstep) * fstep;
528 return int(realvalue);
541 d->exponentRatio = dbl;
554 if (!d->edit->hasFocus())
613 return d->fastSliderStep;
619 d->fastSliderStep = step;
637 return QLocale::system().toString(d->value);
643 d->singleStep =
value;
654 d->value = qBound(d->minimum, _value, d->maximum);
676 d->factor = pow(10.0, decimals);
678 d->minimum =
minimum * d->factor;
679 d->maximum =
maximum * d->factor;
687 d->fastSliderStep = int(pow(10.0, decimals));
689 else if(decimals == 1)
706 return d->minimum / d->factor;
718 return d->maximum / d->factor;
730 return d->fastSliderStep;
736 d->fastSliderStep = step * d->factor;
742 return (
double)d->value / d->factor;
755 d->singleStep =
value * d->factor;
761 return QLocale::system().toString((
double)d->value / d->factor,
'f', d->validator->decimals());
767 d->value = qBound(d->minimum, val, d->maximum);
float value(const T *src, size_t ch)
QDoubleValidator * validator
RAbstractSliderSpinBoxPrivate()
void mouseReleaseEvent(QMouseEvent *e) override
void wheelEvent(QWheelEvent *) override
QRect editRect(const QStyleOptionSpinBox &spinBoxOptions) const
virtual void setInternalValue(int value)=0
virtual QString valueString() const =0
QRect progressRect(const QStyleOptionProgressBar &progressBarOptions) const
void keyPressEvent(QKeyEvent *e) override
QSize minimumSizeHint() const override
void setExponentRatio(double dbl)
int valueForX(int x, Qt::KeyboardModifiers modifiers=Qt::NoModifier) const
QRect upButtonRect(const QStyleOptionSpinBox &spinBoxOptions) const
void mouseMoveEvent(QMouseEvent *e) override
QStyleOptionSpinBox spinBoxOptions() const
QRect downButtonRect(const QStyleOptionSpinBox &spinBoxOptions) const
~RAbstractSliderSpinBox() override
void setSuffix(const QString &suffix)
void paintEvent(QPaintEvent *e) override
void mousePressEvent(QMouseEvent *e) override
RAbstractSliderSpinBox(QWidget *const parent, RAbstractSliderSpinBoxPrivate *const q)
bool eventFilter(QObject *recv, QEvent *e) override
void contextMenuEvent(QContextMenuEvent *event) override
QStyleOptionProgressBar progressBarOptions() const
QSize sizeHint() const override
void setMaximum(double maximum)
void setMinimum(double minimum)
void setValue(double value)
void setSingleStep(double value)
double fastSliderStep() const
~RDoubleSliderSpinBox() override
void setFastSliderStep(double step)
void setInternalValue(int val) override
void setRange(double minimum, double maximum, int decimals=0)
QString valueString() const override
void valueChanged(double value)
RDoubleSliderSpinBox(QWidget *const parent=0)
void setSingleStep(int value)
RSliderSpinBox(QWidget *const parent=0)
void setRange(int minimum, int maximum)
~RSliderSpinBox() override
void setFastSliderStep(int step)
int fastSliderStep() const
void setInternalValue(int value) override
void setMaximum(int maximum)
QString valueString() const override
void setMinimum(int minimum)
void setPageStep(int value)
void valueChanged(int value)
Save space slider widget.