#include <qxtspanslider_p.h>


Public Types | |
| enum | SpanHandle { NoHandle, LowerHandle, UpperHandle } |
Public Slots | |
| void | updateRange (int min, int max) |
| void | movePressedHandle () |
Public Member Functions | |
| QxtSpanSliderPrivate () | |
| void | initStyleOption (QStyleOptionSlider *option, SpanHandle handle=UpperHandle) const |
| int | pick (const QPoint &pt) const |
| int | pixelPosToRangeValue (int pos) const |
| void | handleMousePress (const QPoint &pos, QStyle::SubControl &control, int value, SpanHandle handle) |
| void | drawHandle (QStylePainter *painter, SpanHandle handle) const |
| void | setupPainter (QPainter *painter, Qt::Orientation orientation, qreal x1, qreal y1, qreal x2, qreal y2) const |
| void | drawSpan (QStylePainter *painter, const QRect &rect) const |
| void | triggerAction (QAbstractSlider::SliderAction action, bool main) |
| void | swapControls () |
Public Attributes | |
| int | lower |
| int | upper |
| int | lowerPos |
| int | upperPos |
| int | offset |
| int | position |
| SpanHandle | lastPressed |
| SpanHandle | mainControl |
| QStyle::SubControl | lowerPressed |
| QStyle::SubControl | upperPressed |
| QxtSpanSlider::HandleMovementMode | movement |
| bool | firstMovement |
| bool | blockTracking |
Friends | |
| class | QxtSpanSlider |
Definition at line 36 of file qxtspanslider_p.h.
Definition at line 43 of file qxtspanslider_p.h.
{
NoHandle,
LowerHandle,
UpperHandle
};
| QxtSpanSliderPrivate::QxtSpanSliderPrivate | ( | ) |
Definition at line 33 of file qxtspanslider.cpp.
:
lower(0),
upper(0),
lowerPos(0),
upperPos(0),
offset(0),
position(0),
lastPressed(NoHandle),
mainControl(LowerHandle),
lowerPressed(QStyle::SC_None),
upperPressed(QStyle::SC_None),
movement(QxtSpanSlider::FreeMovement),
firstMovement(false),
blockTracking(false)
{
}
| void QxtSpanSliderPrivate::drawHandle | ( | QStylePainter * | painter, |
| SpanHandle | handle | ||
| ) | const |
Definition at line 164 of file qxtspanslider.cpp.
References initStyleOption(), LowerHandle, lowerPressed, and upperPressed.
{
QStyleOptionSlider opt;
initStyleOption(&opt, handle);
opt.subControls = QStyle::SC_SliderHandle;
QStyle::SubControl pressed = (handle == LowerHandle ? lowerPressed : upperPressed);
if (pressed == QStyle::SC_SliderHandle)
{
opt.activeSubControls = pressed;
opt.state |= QStyle::State_Sunken;
}
painter->drawComplexControl(QStyle::CC_Slider, opt);
}
| void QxtSpanSliderPrivate::drawSpan | ( | QStylePainter * | painter, |
| const QRect & | rect | ||
| ) | const |
Definition at line 136 of file qxtspanslider.cpp.
References initStyleOption(), QxtPrivate< QxtSpanSlider >::qxt_p(), and setupPainter().
{
QStyleOptionSlider opt;
initStyleOption(&opt);
const QSlider* p = &qxt_p();
// area
QRect groove = p->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, p);
if (opt.orientation == Qt::Horizontal)
groove.adjust(0, 0, -1, 0);
else
groove.adjust(0, 0, 0, -1);
// pen & brush
painter->setPen(QPen(p->palette().color(QPalette::Dark).light(110), 0));
if (opt.orientation == Qt::Horizontal)
setupPainter(painter, opt.orientation, groove.center().x(), groove.top(), groove.center().x(), groove.bottom());
else
setupPainter(painter, opt.orientation, groove.left(), groove.center().y(), groove.right(), groove.center().y());
// draw groove
#if QT_VERSION >= 0x040200
painter->drawRect(rect.intersected(groove));
#else // QT_VERSION < 0x040200
painter->drawRect(rect.intersect(groove));
#endif // QT_VERSION
}
| void QxtSpanSliderPrivate::handleMousePress | ( | const QPoint & | pos, |
| QStyle::SubControl & | control, | ||
| int | value, | ||
| SpanHandle | handle | ||
| ) |
Definition at line 103 of file qxtspanslider.cpp.
References initStyleOption(), lastPressed, offset, pick(), position, and QxtPrivate< QxtSpanSlider >::qxt_p().
{
QStyleOptionSlider opt;
initStyleOption(&opt, handle);
QSlider* p = &qxt_p();
const QStyle::SubControl oldControl = control;
control = p->style()->hitTestComplexControl(QStyle::CC_Slider, &opt, pos, p);
const QRect sr = p->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, p);
if (control == QStyle::SC_SliderHandle)
{
position = value;
offset = pick(pos - sr.topLeft());
lastPressed = handle;
p->setSliderDown(true);
}
if (control != oldControl)
p->update(sr);
}
| void QxtSpanSliderPrivate::initStyleOption | ( | QStyleOptionSlider * | option, |
| SpanHandle | handle = UpperHandle |
||
| ) | const |
Definition at line 51 of file qxtspanslider.cpp.
References lower, LowerHandle, lowerPos, QxtPrivate< QxtSpanSlider >::qxt_p(), upper, and upperPos.
Referenced by drawHandle(), drawSpan(), handleMousePress(), and pixelPosToRangeValue().
{
if (!option)
return;
const QSlider* p = &qxt_p();
option->initFrom(p);
option->subControls = QStyle::SC_None;
option->activeSubControls = QStyle::SC_None;
option->orientation = p->orientation();
option->maximum = p->maximum();
option->minimum = p->minimum();
option->tickPosition = p->tickPosition();
option->tickInterval = p->tickInterval();
option->upsideDown = (p->orientation() == Qt::Horizontal) ?
(p->invertedAppearance() != (option->direction == Qt::RightToLeft)) : (!p->invertedAppearance());
option->direction = Qt::LeftToRight; // we use the upsideDown option instead
option->sliderPosition = (handle == LowerHandle ? lowerPos : upperPos);
option->sliderValue = (handle == LowerHandle ? lower : upper);
option->singleStep = p->singleStep();
option->pageStep = p->pageStep();
if (p->orientation() == Qt::Horizontal)
option->state |= QStyle::State_Horizontal;
}
| void QxtSpanSliderPrivate::movePressedHandle | ( | ) | [slot] |
Definition at line 286 of file qxtspanslider.cpp.
References lastPressed, lower, LowerHandle, lowerPos, main(), mainControl, triggerAction(), upper, UpperHandle, and upperPos.
{
switch (lastPressed)
{
case QxtSpanSliderPrivate::LowerHandle:
if (lowerPos != lower)
{
bool main = (mainControl == QxtSpanSliderPrivate::LowerHandle);
triggerAction(QAbstractSlider::SliderMove, main);
}
break;
case QxtSpanSliderPrivate::UpperHandle:
if (upperPos != upper)
{
bool main = (mainControl == QxtSpanSliderPrivate::UpperHandle);
triggerAction(QAbstractSlider::SliderMove, main);
}
break;
default:
break;
}
}
| int QxtSpanSliderPrivate::pick | ( | const QPoint & | pt ) | const [inline] |
Definition at line 52 of file qxtspanslider_p.h.
Referenced by handleMousePress().
{
return qxt_p().orientation() == Qt::Horizontal ? pt.x() : pt.y();
}
| int QxtSpanSliderPrivate::pixelPosToRangeValue | ( | int | pos ) | const |
Definition at line 76 of file qxtspanslider.cpp.
References initStyleOption(), and QxtPrivate< QxtSpanSlider >::qxt_p().
{
QStyleOptionSlider opt;
initStyleOption(&opt);
int sliderMin = 0;
int sliderMax = 0;
int sliderLength = 0;
const QSlider* p = &qxt_p();
const QRect gr = p->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, p);
const QRect sr = p->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, p);
if (p->orientation() == Qt::Horizontal)
{
sliderLength = sr.width();
sliderMin = gr.x();
sliderMax = gr.right() - sliderLength + 1;
}
else
{
sliderLength = sr.height();
sliderMin = gr.y();
sliderMax = gr.bottom() - sliderLength + 1;
}
return QStyle::sliderValueFromPosition(p->minimum(), p->maximum(), pos - sliderMin,
sliderMax - sliderMin, opt.upsideDown);
}
| void QxtSpanSliderPrivate::setupPainter | ( | QPainter * | painter, |
| Qt::Orientation | orientation, | ||
| qreal | x1, | ||
| qreal | y1, | ||
| qreal | x2, | ||
| qreal | y2 | ||
| ) | const |
Definition at line 122 of file qxtspanslider.cpp.
References QxtPrivate< QxtSpanSlider >::qxt_p().
Referenced by drawSpan().
{
QColor highlight = qxt_p().palette().color(QPalette::Highlight);
QLinearGradient gradient(x1, y1, x2, y2);
gradient.setColorAt(0, highlight.dark(120));
gradient.setColorAt(1, highlight.light(108));
painter->setBrush(gradient);
if (orientation == Qt::Horizontal)
painter->setPen(QPen(highlight.dark(130), 0));
else
painter->setPen(QPen(highlight.dark(150), 0));
}
| void QxtSpanSliderPrivate::swapControls | ( | ) |
Definition at line 270 of file qxtspanslider.cpp.
References lastPressed, lower, LowerHandle, lowerPressed, mainControl, upper, UpperHandle, and upperPressed.
Referenced by triggerAction().
{
qSwap(lower, upper);
qSwap(lowerPressed, upperPressed);
lastPressed = (lastPressed == LowerHandle ? UpperHandle : LowerHandle);
mainControl = (mainControl == LowerHandle ? UpperHandle : LowerHandle);
}
| void QxtSpanSliderPrivate::triggerAction | ( | QAbstractSlider::SliderAction | action, |
| bool | main | ||
| ) |
Definition at line 178 of file qxtspanslider.cpp.
References blockTracking, QxtSpanSlider::FreeMovement, lower, LowerHandle, lowerPos, mainControl, QuadProgPP::max(), min, movement, QxtSpanSlider::NoCrossing, QxtSpanSlider::NoOverlapping, QxtPrivate< QxtSpanSlider >::qxt_p(), QxtSpanSlider::setLowerPosition(), QxtSpanSlider::setLowerValue(), QxtSpanSlider::setUpperPosition(), QxtSpanSlider::setUpperValue(), swapControls(), upper, UpperHandle, and upperPos.
Referenced by movePressedHandle().
{
int value = 0;
bool no = false;
bool up = false;
const int min = qxt_p().minimum();
const int max = qxt_p().maximum();
const SpanHandle altControl = (mainControl == LowerHandle ? UpperHandle : LowerHandle);
blockTracking = true;
switch (action)
{
case QAbstractSlider::SliderSingleStepAdd:
if ((main && mainControl == UpperHandle) || (!main && altControl == UpperHandle))
{
value = qBound(min, upper + qxt_p().singleStep(), max);
up = true;
break;
}
value = qBound(min, lower + qxt_p().singleStep(), max);
break;
case QAbstractSlider::SliderSingleStepSub:
if ((main && mainControl == UpperHandle) || (!main && altControl == UpperHandle))
{
value = qBound(min, upper - qxt_p().singleStep(), max);
up = true;
break;
}
value = qBound(min, lower - qxt_p().singleStep(), max);
break;
case QAbstractSlider::SliderToMinimum:
value = min;
if ((main && mainControl == UpperHandle) || (!main && altControl == UpperHandle))
up = true;
break;
case QAbstractSlider::SliderToMaximum:
value = max;
if ((main && mainControl == UpperHandle) || (!main && altControl == UpperHandle))
up = true;
break;
case QAbstractSlider::SliderMove:
if ((main && mainControl == UpperHandle) || (!main && altControl == UpperHandle))
up = true;
case QAbstractSlider::SliderNoAction:
no = true;
break;
default:
qWarning("QxtSpanSliderPrivate::triggerAction: Unknown action");
break;
}
if (!no && !up)
{
if (movement == QxtSpanSlider::NoCrossing)
value = qMin(value, upper);
else if (movement == QxtSpanSlider::NoOverlapping)
value = qMin(value, upper - 1);
if (movement == QxtSpanSlider::FreeMovement && value > upper)
{
swapControls();
qxt_p().setUpperPosition(value);
}
else
{
qxt_p().setLowerPosition(value);
}
}
else if (!no)
{
if (movement == QxtSpanSlider::NoCrossing)
value = qMax(value, lower);
else if (movement == QxtSpanSlider::NoOverlapping)
value = qMax(value, lower + 1);
if (movement == QxtSpanSlider::FreeMovement && value < lower)
{
swapControls();
qxt_p().setLowerPosition(value);
}
else
{
qxt_p().setUpperPosition(value);
}
}
blockTracking = false;
qxt_p().setLowerValue(lowerPos);
qxt_p().setUpperValue(upperPos);
}
| void QxtSpanSliderPrivate::updateRange | ( | int | min, |
| int | max | ||
| ) | [slot] |
Definition at line 278 of file qxtspanslider.cpp.
References lower, QxtPrivate< QxtSpanSlider >::qxt_p(), QxtSpanSlider::setSpan(), and upper.
friend class QxtSpanSlider [friend] |
Definition at line 41 of file qxtspanslider_p.h.
Definition at line 76 of file qxtspanslider_p.h.
Referenced by triggerAction().
Definition at line 75 of file qxtspanslider_p.h.
Definition at line 70 of file qxtspanslider_p.h.
Referenced by handleMousePress(), movePressedHandle(), and swapControls().
Definition at line 64 of file qxtspanslider_p.h.
Referenced by initStyleOption(), movePressedHandle(), swapControls(), triggerAction(), and updateRange().
Definition at line 66 of file qxtspanslider_p.h.
Referenced by initStyleOption(), movePressedHandle(), and triggerAction().
| QStyle::SubControl QxtSpanSliderPrivate::lowerPressed |
Definition at line 72 of file qxtspanslider_p.h.
Referenced by drawHandle(), and swapControls().
Definition at line 71 of file qxtspanslider_p.h.
Referenced by movePressedHandle(), swapControls(), and triggerAction().
Definition at line 74 of file qxtspanslider_p.h.
Referenced by triggerAction().
Definition at line 68 of file qxtspanslider_p.h.
Referenced by handleMousePress().
Definition at line 69 of file qxtspanslider_p.h.
Referenced by handleMousePress().
Definition at line 65 of file qxtspanslider_p.h.
Referenced by initStyleOption(), movePressedHandle(), swapControls(), triggerAction(), and updateRange().
Definition at line 67 of file qxtspanslider_p.h.
Referenced by initStyleOption(), movePressedHandle(), and triggerAction().
| QStyle::SubControl QxtSpanSliderPrivate::upperPressed |
Definition at line 73 of file qxtspanslider_p.h.
Referenced by drawHandle(), and swapControls().
1.7.2