102 lines
2.9 KiB
C++
102 lines
2.9 KiB
C++
#include "slidertrack.h"
|
|
#include <QEvent>
|
|
#include <QPainter>
|
|
#include "lib/style.h"
|
|
#include "slider.h"
|
|
|
|
SliderTrack::SliderTrack(Slider *slider)
|
|
: QWidget(slider->parentWidget()),
|
|
slider(slider),
|
|
_width(2)
|
|
{
|
|
slider->installEventFilter(this);
|
|
setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
|
|
|
connect(slider, SIGNAL(sliderMoved(int)), this, SLOT(update()));
|
|
}
|
|
|
|
SliderTrack::~SliderTrack()
|
|
{
|
|
}
|
|
|
|
bool SliderTrack::eventFilter(QObject *obj, QEvent *event)
|
|
{
|
|
QEvent::Type type = event->type();
|
|
|
|
if (QEvent::ParentChange == type) {
|
|
setParent(slider->parentWidget());
|
|
} else if (QEvent::Resize == type || QEvent::Move == type) {
|
|
if (parentWidget()) {
|
|
setGeometry(parentWidget()->rect());
|
|
}
|
|
}
|
|
return QWidget::eventFilter(obj, event);
|
|
}
|
|
|
|
void SliderTrack::paintEvent(QPaintEvent *event)
|
|
{
|
|
QPainter painter(this);
|
|
Style &style = Style::instance();
|
|
|
|
QBrush fg;
|
|
fg.setStyle(Qt::SolidPattern);
|
|
fg.setColor(slider->isEnabled() ? style.themeColor("primary1")
|
|
: style.themeColor("disabled"));
|
|
QBrush bg;
|
|
bg.setStyle(Qt::SolidPattern);
|
|
bg.setColor(slider->isEnabled() ? _fillColor
|
|
: style.themeColor("disabled"));
|
|
|
|
painter.setRenderHint(QPainter::Antialiasing);
|
|
|
|
qreal offset = slider->thumbOffset();
|
|
|
|
if (Qt::Horizontal == slider->orientation()) {
|
|
painter.translate(slider->x() + SLIDER_MARGIN,
|
|
slider->y() + slider->height()/2
|
|
- static_cast<qreal>(_width)/2);
|
|
} else {
|
|
painter.translate(slider->x() + slider->width()/2
|
|
- static_cast<qreal>(_width)/2,
|
|
slider->y() + SLIDER_MARGIN);
|
|
}
|
|
|
|
QRectF geometry = Qt::Horizontal == slider->orientation()
|
|
? QRectF(0, 0, slider->width() - SLIDER_MARGIN*2, _width)
|
|
: QRectF(0, 0, _width, slider->height() - SLIDER_MARGIN*2);
|
|
|
|
QRectF bgRect;
|
|
QRectF fgRect;
|
|
|
|
if (Qt::Horizontal == slider->orientation()) {
|
|
fgRect = QRectF(0, 0, offset, _width);
|
|
bgRect = QRectF(offset, 0, slider->width(), _width).intersected(geometry);
|
|
} else {
|
|
fgRect = QRectF(0, 0, _width, offset);
|
|
bgRect = QRectF(0, offset, _width, slider->height()).intersected(geometry);
|
|
}
|
|
|
|
if (!slider->isEnabled()) {
|
|
fgRect = fgRect.width() < 9 ? QRectF() : fgRect.adjusted(0, 0, -6, 0);
|
|
bgRect = bgRect.width() < 9 ? QRectF() : bgRect.adjusted(6, 0, 0, 0);
|
|
}
|
|
|
|
if (slider->invertedAppearance()) {
|
|
qSwap(bgRect, fgRect);
|
|
}
|
|
|
|
painter.fillRect(bgRect, bg);
|
|
painter.fillRect(fgRect, fg);
|
|
|
|
#ifdef DEBUG_LAYOUT
|
|
if (slider->hovered()) {
|
|
painter.save();
|
|
painter.setPen(Qt::red);
|
|
painter.drawRect(geometry);
|
|
painter.restore();
|
|
}
|
|
#endif
|
|
|
|
QWidget::paintEvent(event);
|
|
}
|