qt-material-widgets/components/slidertrack.cpp

81 lines
2.3 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);
}
SliderTrack::~SliderTrack()
{
}
bool SliderTrack::eventFilter(QObject *obj, QEvent *event)
{
if (QEvent::ParentChange == event->type()) {
setParent(slider->parentWidget());
}
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->hovered() ? QColor(0, 0, 0, 150) // @TODO: set theme color
: style.themeColor("accent3"));
qreal offset = slider->thumbOffset() + SLIDER_MARGIN;
QSizeF box(slider->isEnabled() ? offset : offset - 7,
qMax(slider->width(), slider->height()));
if (Qt::Vertical == slider->orientation())
box.transpose();
QRectF rect = Qt::Vertical == slider->orientation()
? QRectF(0, slider->isEnabled() ? offset : offset + 7,
box.width(), box.width())
: QRectF(slider->isEnabled() ? offset : offset + 7, 0,
box.height(), box.height());
qreal hw = static_cast<qreal>(_width)/2;
QRectF geometry = Qt::Horizontal == slider->orientation()
? QRectF(SLIDER_MARGIN, slider->rect().height()/2 - hw,
slider->width() - SLIDER_MARGIN*2, hw*2)
: QRectF(slider->width()/2 - hw, SLIDER_MARGIN, hw*2,
slider->height() - SLIDER_MARGIN*2);
bool inverted = slider->invertedAppearance();
painter.fillRect(QRectF(QPointF(0, 0), box).intersected(geometry),
inverted ? bg : fg);
painter.fillRect(rect.intersected(geometry), inverted ? fg : bg);
#ifdef DEBUG_LAYOUT
if (hoverTrack) {
painter.save();
painter.setPen(Qt::red);
painter.drawRect(geometry);
painter.restore();
}
#endif
QWidget::paintEvent(event);
}