23 #include <QHBoxLayout>
39 int toInt(
double _value)
const;
93 q->setSizePolicy(
QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed,
94 QSizePolicy::Slider));
103 q->connect(this->
Slider, SIGNAL(minimumValueChanged(
int)),
104 q, SLOT(onMinValueChanged(
int)));
105 q->connect(this->
Slider, SIGNAL(maximumValueChanged(
int)),
106 q, SLOT(onMaxValueChanged(
int)));
107 q->connect(this->
Slider, SIGNAL(valuesChanged(
int,
int)),
108 q, SLOT(onValuesChanged(
int,
int)));
110 q->connect(this->
Slider, SIGNAL(minimumPositionChanged(
int)),
111 q, SLOT(onMinPosChanged(
int)));
112 q->connect(this->
Slider, SIGNAL(maximumPositionChanged(
int)),
113 q, SLOT(onMaxPosChanged(
int)));
114 q->connect(this->
Slider, SIGNAL(positionsChanged(
int,
int)),
115 q, SLOT(onPositionsChanged(
int,
int)));
117 q->connect(this->
Slider, SIGNAL(sliderPressed()),
118 q, SIGNAL(sliderPressed()));
119 q->connect(this->
Slider, SIGNAL(sliderReleased()),
120 q, SIGNAL(sliderReleased()));
121 q->connect(this->
Slider, SIGNAL(rangeChanged(
int,
int)),
122 q, SLOT(onRangeChanged(
int,
int)));
129 int intValue = qRound(tmp);
187 if (d->Minimum >= d->MinValue)
189 d->updateMinOffset(d->Minimum);
191 if (d->Minimum >= d->MaxValue)
193 d->updateMaxOffset(d->Minimum);
195 d->SettingRange =
true;
196 d->Slider->setMinimum(d->toInt(min));
197 d->SettingRange =
false;
213 if (d->Maximum <= d->MinValue)
215 d->updateMinOffset(d->Maximum);
217 if (d->Maximum <= d->MaxValue)
219 d->updateMaxOffset(d->Maximum);
221 d->SettingRange =
true;
222 d->Slider->setMaximum(d->toInt(max));
223 d->SettingRange =
false;
240 if (d->Minimum >= d->MinValue)
242 d->updateMinOffset(d->Minimum);
244 if (d->Minimum >= d->MaxValue)
246 d->updateMaxOffset(d->Minimum);
248 if (d->Maximum <= d->MinValue)
250 d->updateMinOffset(d->Maximum);
252 if (d->Maximum <= d->MaxValue)
254 d->updateMaxOffset(d->Maximum);
256 d->SettingRange =
true;
257 d->Slider->setRange(d->toInt(min), d->toInt(max));
258 d->SettingRange =
false;
266 return d->minFromInt(d->Slider->minimumPosition());
273 d->Slider->setMinimumPosition(d->toInt(minPos));
280 return d->maxFromInt(d->Slider->maximumPosition());
287 d->Slider->setMaximumPosition(d->toInt(maxPos));
294 d->Slider->setPositions(d->toInt(minPos), d->toInt(maxPos));
308 newMinValue = qBound(d->Minimum, newMinValue, d->Maximum);
309 d->updateMinOffset(newMinValue);
310 if (newMinValue >= d->MaxValue)
312 d->updateMaxOffset(newMinValue);
314 int newIntValue = d->toInt(newMinValue);
315 if (newIntValue != d->Slider->minimumValue())
319 d->Slider->setMinimumValue(newIntValue);
323 double oldValue = d->MinValue;
324 d->MinValue = newMinValue;
327 if (qAbs(newMinValue - oldValue) > (d->SingleStep * 0.000000001))
346 newMaxValue = qBound(d->Minimum, newMaxValue, d->Maximum);
347 d->updateMaxOffset(newMaxValue);
348 if (newMaxValue <= d->MinValue)
350 d->updateMinOffset(newMaxValue);
352 int newIntValue = d->toInt(newMaxValue);
353 if (newIntValue != d->Slider->maximumValue())
357 d->Slider->setMaximumValue(newIntValue);
361 double oldValue = d->MaxValue;
362 d->MaxValue = newMaxValue;
365 if (qAbs(newMaxValue - oldValue) > (d->SingleStep * 0.000000001))
380 double newMinValue = qBound(d->Minimum, qMin(newMinVal, newMaxVal), d->Maximum);
381 double newMaxValue = qBound(d->Minimum, qMax(newMinVal, newMaxVal), d->Maximum);
382 d->updateMinOffset(newMinValue);
383 d->updateMaxOffset(newMaxValue);
384 int newMinIntValue = d->toInt(newMinValue);
385 int newMaxIntValue = d->toInt(newMaxValue);
386 if (newMinIntValue != d->Slider->minimumValue() ||
387 newMaxIntValue != d->Slider->maximumValue())
391 d->Slider->setValues(newMinIntValue, newMaxIntValue);
395 double oldMinValue = d->MinValue;
396 double oldMaxValue = d->MaxValue;
397 d->MinValue = newMinValue;
398 d->MaxValue = newMaxValue;
401 bool minChanged = qAbs(newMinValue - oldMinValue) > (d->SingleStep * 0.000000001);
402 bool maxChanged = qAbs(newMaxValue - oldMaxValue) > (d->SingleStep * 0.000000001);
403 if (minChanged || maxChanged)
422 return d->SingleStep;
429 d->SingleStep = newStep;
433 d->updateMinOffset(d->MinValue);
434 d->updateMaxOffset(d->MaxValue);
436 double _minvalue = d->MinValue;
437 double _maxvalue = d->MaxValue;
453 return d->minFromInt(d->Slider->tickInterval());
460 d->Slider->setTickInterval(d->toInt(newTickInterval));
467 return d->Slider->hasTracking();
474 d->Slider->setTracking(enable);
481 d->Slider->triggerAction(action);
488 d->Slider->setOrientation(newOrientation);
495 return d->Slider->orientation();
502 return d->Slider->symmetricMoves();
509 d->Slider->setSymmetricMoves(symmetry);
516 double doubleNewValue = d->minFromInt(newValue);
517 if (d->MinValue == doubleNewValue)
521 d->MinValue = doubleNewValue;
530 double doubleNewValue = d->maxFromInt(newValue);
531 if (d->MaxValue == doubleNewValue)
535 d->MaxValue = doubleNewValue;
544 double doubleNewMinValue = d->minFromInt(newMinValue);
545 double doubleNewMaxValue = d->maxFromInt(newMaxValue);
547 bool emitMinValueChanged = (d->MinValue != doubleNewMinValue);
548 bool emitMaxValueChanged = (d->MaxValue != doubleNewMaxValue);
550 if (!emitMinValueChanged && !emitMaxValueChanged)
554 d->MinValue = doubleNewMinValue;
555 d->MaxValue = doubleNewMaxValue;
557 if (emitMinValueChanged)
561 if (emitMaxValueChanged)
592 if (!d->SettingRange)
594 this->
setRange(d->minFromInt(min), d->maxFromInt(max));
612 t_slider->
setValues(d->Slider->minimumValue(), d->Slider->maximumValue());
618 d->Slider = t_slider;
Q_DECLARE_PUBLIC(ctkDoubleRangeSlider)
void setContentsMargins(int left, int top, int right, int bottom)
ctkDoubleRangeSlider(Qt::Orientation o, QWidget *par=0)
void setTracking(bool enable)
ctkDoubleRangeSliderPrivate(ctkDoubleRangeSlider &object)
void onMaxValueChanged(int value)
double minimumPosition() const
void setOrientation(Qt::Orientation orientation)
void valuesChanged(double minVal, double maxVal)
Utility signal that is fired when minimum or maximum values have changed.
void setSymmetricMoves(bool symmetry)
double tickInterval() const
void setMaximumValue(double maxVal)
void setPositions(double minPos, double maxPos)
void setSlider(ctkRangeSlider *slider)
Subclasses can change the internal slider.
ctkDoubleRangeSlider *const q_ptr
void onValuesChanged(int min, int max)
void updateMaxOffset(double value)
void maximumValueChanged(double maxVal)
void onMinPosChanged(int value)
double minimumValue() const
void setMaximum(double max)
void setOrientation(Qt::Orientation)
void onRangeChanged(int min, int max)
void onPositionsChanged(int min, int max)
void maximumPositionChanged(double maxPos)
int toInt(double _value) const
double maxFromInt(int _value) const
double maximumValue() const
void rangeChanged(double min, double max)
void setRange(double min, double max)
void onMaxPosChanged(int value)
void onMinValueChanged(int value)
void setMinimumPosition(double minPos)
void setMinimumValue(double minVal)
bool blockSignals(bool block)
void setValues(double minVal, double maxVal)
Utility function that set the minimum value and maximum value at once.
virtual ~ctkDoubleRangeSlider()
Destructor.
void positionsChanged(double minPos, double maxPos)
void minimumPositionChanged(double minPos)
double singleStep() const
double maximumPosition() const
void minimumValueChanged(double minVal)
void updateMinOffset(double value)
void setTracking(bool enable)
void setTickInterval(int ti)
double minFromInt(int _value) const
bool symmetricMoves() const
void setMaximumPosition(double maxPos)
void triggerAction(QAbstractSlider::SliderAction action)
void setTickInterval(double ti)
ctkRangeSlider * slider() const
Qt::Orientation orientation() const
void setMinimum(double min)
void setSingleStep(double ss)
void setValues(int min, int max)