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;