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()),
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)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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)
rgba palette[MAX_PALETTE]
Save space slider widget.