23 #include <QMouseEvent>
25 #include <QStyleOptionSlider>
26 #include <QApplication>
27 #include <QStylePainter>
113 q->connect(q, SIGNAL(rangeChanged(
int,
int)), q, SLOT(onRangeChanged(
int,
int)));
123 q->initStyleOption( &option );
125 QRect gr = q->style()->subControlRect( QStyle::CC_Slider,
127 QStyle::SC_SliderGroove,
129 QRect sr = q->style()->subControlRect( QStyle::CC_Slider,
131 QStyle::SC_SliderHandle,
133 int sliderMin, sliderMax, sliderLength;
134 if (option.orientation == Qt::Horizontal)
136 sliderLength = sr.
width();
138 sliderMax = gr.
right() - sliderLength + 1;
142 sliderLength = sr.
height();
144 sliderMax = gr.
bottom() - sliderLength + 1;
150 sliderMax - sliderMin,
159 q->initStyleOption( &option );
161 QRect gr = q->style()->subControlRect( QStyle::CC_Slider,
163 QStyle::SC_SliderGroove,
165 QRect sr = q->style()->subControlRect( QStyle::CC_Slider,
167 QStyle::SC_SliderHandle,
169 int sliderMin, sliderMax, sliderLength;
170 if (option.orientation == Qt::Horizontal)
172 sliderLength = sr.
width();
174 sliderMax = gr.
right() - sliderLength + 1;
178 sliderLength = sr.
height();
180 sliderMax = gr.
bottom() - sliderLength + 1;
186 sliderMax - sliderMin,
187 option.upsideDown ) + sliderMin;
196 q->initMinimumSliderStyleOption( &option );
198 option.subControls = QStyle::SC_SliderHandle;
203 option.activeSubControls = QStyle::SC_SliderHandle;
204 option.state |= QStyle::State_Sunken;
216 q->initMaximumSliderStyleOption( &option );
218 option.subControls = QStyle::SC_SliderHandle;
223 option.activeSubControls = QStyle::SC_SliderHandle;
224 option.state |= QStyle::State_Sunken;
276 return d->m_MinimumValue;
283 this->
setValues( min, qMax(d->m_MaximumValue,min) );
290 return d->m_MaximumValue;
297 this->
setValues( qMin(d->m_MinimumValue, max), max );
304 const int t_minimumValue =
306 const int t_maximumValue =
308 bool emitMinValChanged = (t_minimumValue != d->m_MinimumValue);
309 bool emitMaxValChanged = (t_maximumValue != d->m_MaximumValue);
311 d->m_MinimumValue = t_minimumValue;
312 d->m_MaximumValue = t_maximumValue;
314 bool emitMinPosChanged =
315 (t_minimumValue != d->m_MinimumPosition);
316 bool emitMaxPosChanged =
317 (t_maximumValue != d->m_MaximumPosition);
318 d->m_MinimumPosition = t_minimumValue;
319 d->m_MaximumPosition = t_maximumValue;
323 if (emitMinPosChanged || emitMaxPosChanged)
327 if (emitMinPosChanged)
331 if (emitMaxPosChanged)
336 if (emitMinValChanged || emitMaxValChanged)
341 if (emitMinValChanged)
345 if (emitMaxValChanged)
349 if (emitMinPosChanged || emitMaxPosChanged ||
350 emitMinValChanged || emitMaxValChanged)
360 return d->m_MinimumPosition;
367 return d->m_MaximumPosition;
388 const int minPosition =
390 const int maxPosition =
393 bool emitMinPosChanged = (minPosition != d->m_MinimumPosition);
394 bool emitMaxPosChanged = (maxPosition != d->m_MaximumPosition);
396 if (!emitMinPosChanged && !emitMaxPosChanged)
401 d->m_MinimumPosition = minPosition;
402 d->m_MaximumPosition = maxPosition;
410 if (emitMinPosChanged)
414 if (emitMaxPosChanged)
418 if (emitMinPosChanged || emitMaxPosChanged)
426 this->
setValues(d->m_MinimumPosition, d->m_MaximumPosition);
434 d->m_SymmetricMoves = symmetry;
441 return d->m_SymmetricMoves;
450 this->
setValues(d->m_MinimumValue, d->m_MaximumValue);
462 option.subControls = QStyle::SC_SliderGroove;
463 option.sliderPosition = this->
minimum();
466 option.sliderPosition = d->m_MinimumPosition;
469 QStyle::SC_SliderHandle,
471 option.sliderPosition = d->m_MaximumPosition;
475 QStyle::SC_SliderHandle,
480 QStyle::SC_SliderGroove,
483 if (option.orientation == Qt::Horizontal)
501 QStyle::SC_SliderGroove,
503 groove.
adjust(0, 0, -1, 0);
509 if (option.orientation == Qt::Horizontal)
536 d->drawMaximumSlider( &painter );
537 d->drawMinimumSlider( &painter );
541 d->drawMinimumSlider( &painter );
542 d->drawMaximumSlider( &painter );
556 int t_pos = this->
orientation() == Qt::Horizontal ?
557 mouseEvent->
pos().
x() : mouseEvent->
pos().
y();
564 option.sliderPosition = d->m_MinimumPosition;
565 option.sliderValue = d->m_MinimumValue;
567 QStyle::SubControl control;
574 QStyle::SC_SliderHandle,
576 if (control == QStyle::SC_SliderHandle)
578 d->m_SubclassPosition = d->m_MinimumPosition;
581 d->m_SubclassClickOffset = t_pos - (this->
orientation() == Qt::Horizontal ?
600 option.sliderPosition = d->m_MaximumPosition;
601 option.sliderValue = d->m_MaximumValue;
609 QStyle::SC_SliderHandle,
611 if (control == QStyle::SC_SliderHandle)
613 d->m_SubclassPosition = d->m_MaximumPosition;
616 d->m_SubclassClickOffset = t_pos - (this->
orientation() == Qt::Horizontal ?
640 QStyle::SC_SliderGroove,
642 int minCenter = (this->
orientation() == Qt::Horizontal ?
644 int maxCenter = (this->
orientation() == Qt::Horizontal ?
646 if (control == QStyle::SC_SliderGroove &&
647 t_pos > minCenter && t_pos < maxCenter)
650 d->m_SubclassPosition = (d->m_MinimumPosition + d->m_MaximumPosition) / 2.;
651 d->m_SubclassClickOffset = t_pos - d->pixelPosFromRangeValue(d->m_SubclassPosition);
652 d->m_SubclassWidth = (d->m_MaximumPosition - d->m_MinimumPosition) / 2;
653 qMax(d->m_SubclassPosition - d->m_MinimumPosition, d->m_MaximumPosition - d->m_SubclassPosition);
659 d->m_SelectedHandles =
675 if (!d->m_SelectedHandles)
680 int t_pos = this->
orientation() == Qt::Horizontal ?
681 mouseEvent->
pos().
x() : mouseEvent->
pos().
y();
686 const int m =
style()->
pixelMetric( QStyle::PM_MaximumDragDistance, &option,
this );
688 int newPosition = d->pixelPosToRangeValue(t_pos - d->m_SubclassClickOffset);
695 newPosition = d->m_SubclassPosition;
702 double newMinPos = qMin(newPosition,d->m_MaximumPosition);
704 (d->m_SymmetricMoves ? d->m_MinimumPosition - newMinPos : 0));
709 double newMaxPos = qMax(d->m_MinimumPosition, newPosition);
711 (d->m_SymmetricMoves ? newMaxPos - d->m_MaximumPosition: 0),
719 newPosition + d->m_SubclassWidth );
732 d->m_SelectedHandles = 0;
virtual void mouseReleaseEvent(QMouseEvent *ev)
virtual void initMaximumSliderStyleOption(QStyleOptionSlider *option) const
void minimumValueChanged(int min)
void setMaximumPosition(int max)
void drawMinimumSlider(QStylePainter *painter) const
Draw the bottom and top sliders.
int minimumPosition() const
ctkRangeSliderPrivate::Handles m_SelectedHandles
QColor darker(int factor) const
void drawMaximumSlider(QStylePainter *painter) const
void onRangeChanged(int minimum, int maximum)
void maximumValueChanged(int max)
void setColorAt(qreal position, const QColor &color)
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const =0
int m_SubclassClickOffset
int m_SubclassWidth
Original width between the 2 bounds before any moves.
const QColor & color(ColorGroup group, ColorRole role) const
virtual void mouseMoveEvent(QMouseEvent *ev)
virtual QRect subControlRect(ComplexControl control, const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const =0
void initStyleOption(QStyleOptionSlider *option) const
QStyle::SubControl m_MinimumSliderSelected
Controls selected ?
int maximumPosition() const
Q_DECLARE_FLAGS(Handles, Handle)
int pixelPosFromRangeValue(int val) const
void maximumPositionChanged(int max)
void drawRect(const QRectF &rectangle)
int pixelPosToRangeValue(int pos) const
Copied verbatim from QSliderPrivate class (see QSlider.cpp)
void setPositions(int min, int max)
void positionsChanged(int min, int max)
Qt::Orientation orientation() const
void setPen(const QColor &color)
ctkRangeSlider(Qt::Orientation o, QWidget *par=0)
void setMinimumValue(int min)
ctkRangeSlider *const q_ptr
ctkRangeSliderPrivate(ctkRangeSlider &object)
virtual ~ctkRangeSlider()
virtual void paintEvent(QPaintEvent *ev)
void setBrush(const QBrush &brush)
int m_MaximumValue
End points of the range on the Model.
bool contains(const QPoint &point, bool proper) const
void minimumPositionChanged(int min)
virtual void mousePressEvent(QMouseEvent *ev)
QRect intersected(const QRect &rectangle) const
bool symmetricMoves() const
QRect adjusted(int dx1, int dy1, int dx2, int dy2) const
void setMinimumPosition(int min)
QColor lighter(int factor) const
bool isMinimumSliderDown() const
QStyle::SubControl m_MaximumSliderSelected
int sliderValueFromPosition(int min, int max, int position, int span, bool upsideDown)
int m_MaximumPosition
End points of the range on the GUI. This is synced with the model.
virtual void initMinimumSliderStyleOption(QStyleOptionSlider *option) const
void setSymmetricMoves(bool symmetry)
virtual void mouseReleaseEvent(QMouseEvent *ev)
void triggerAction(SliderAction action)
void adjust(int dx1, int dy1, int dx2, int dy2)
int sliderPositionFromValue(int min, int max, int logicalValue, int span, bool upsideDown)
void drawComplexControl(QStyle::ComplexControl cc, const QStyleOptionComplex &option)
bool isMaximumSliderDown() const
void valuesChanged(int min, int max)
Utility signal that is fired when minimum or maximum values have changed.
virtual SubControl hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option, const QPoint &position, const QWidget *widget) const =0
const QPoint & pos() const
void setMaximumValue(int max)
QRect united(const QRect &rectangle) const
bool isSliderDown() const
Q_DECLARE_PUBLIC(ctkRangeSlider)
void setValues(int min, int max)