123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- #include "qtmaterialtoggle_internal.h"
- #include <QPainter>
- #include <QEvent>
- #include <QtWidgets/QGraphicsDropShadowEffect>
- #include "qtmaterialtoggle.h"
- #include "lib/qtmaterialripple.h"
- /*!
- * \class QtMaterialToggleRippleOverlay
- * \internal
- */
- QtMaterialToggleRippleOverlay::QtMaterialToggleRippleOverlay(
- QtMaterialToggleThumb *thumb,
- QtMaterialToggleTrack *track,
- QtMaterialToggle *parent)
- : QtMaterialRippleOverlay(parent->parentWidget()),
- m_toggle(parent),
- m_thumb(thumb),
- m_track(track)
- {
- connect(parent, SIGNAL(toggled(bool)), this, SLOT(addToggleRipple()));
- thumb->installEventFilter(this);
- }
- QtMaterialToggleRippleOverlay::~QtMaterialToggleRippleOverlay()
- {
- }
- void QtMaterialToggleRippleOverlay::addToggleRipple()
- {
- if (!m_toggle->isEnabled()) {
- return;
- }
- int t, w;
- if (Qt::Horizontal == m_toggle->orientation()) {
- t = m_toggle->height()/2;
- w = m_thumb->height()/2+10;
- } else {
- t = m_toggle->width()/2;
- w = m_thumb->width()/2+10;
- }
- QtMaterialRipple *ripple = new QtMaterialRipple(QPoint(10+t, 20+t));
- ripple->setColor(m_track->trackColor());
- ripple->setRadiusEndValue(w);
- ripple->setOpacityStartValue(0.8);
- addRipple(ripple);
- }
- bool QtMaterialToggleRippleOverlay::eventFilter(QObject *obj, QEvent *event)
- {
- if (QEvent::Paint == event->type()) {
- setGeometry(overlayGeometry());
- QList<QtMaterialRipple *>::const_iterator i;
- QList<QtMaterialRipple *> items = ripples();
- QColor color = m_track->trackColor();
- for (i = items.begin(); i != items.end(); ++i) {
- (*i)->setColor(color);
- }
- }
- return QtMaterialRippleOverlay::eventFilter(obj, event);
- }
- QRect QtMaterialToggleRippleOverlay::overlayGeometry() const
- {
- const qreal offset = m_thumb->offset();
- if (Qt::Horizontal == m_toggle->orientation()) {
- return m_toggle->geometry().adjusted(-10+offset, -20, 10+offset, 20);
- } else {
- return m_toggle->geometry().adjusted(-10, -20+offset, 10, 20+offset);
- }
- }
- /*!
- * \class QtMaterialToggleThumb
- * \internal
- */
- QtMaterialToggleThumb::QtMaterialToggleThumb(QtMaterialToggle *parent)
- : QWidget(parent),
- m_toggle(parent),
- m_shift(0),
- m_offset(0)
- {
- Q_ASSERT(parent);
- QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
- effect->setBlurRadius(6);
- effect->setColor(QColor(0, 0, 0, 80));
- effect->setOffset(QPointF(0, 1));
- setGraphicsEffect(effect);
- parent->installEventFilter(this);
- }
- QtMaterialToggleThumb::~QtMaterialToggleThumb()
- {
- }
- void QtMaterialToggleThumb::setShift(qreal shift)
- {
- if (m_shift == shift) {
- return;
- }
- m_shift = shift;
- updateOffset();
- }
- bool QtMaterialToggleThumb::eventFilter(QObject *obj, QEvent *event)
- {
- const QEvent::Type type = event->type();
- if (QEvent::Resize == type || QEvent::Move == type)
- {
- setGeometry(m_toggle->rect().adjusted(8, 8, -8, -8));
- updateOffset();
- }
- return QWidget::eventFilter(obj, event);
- }
- void QtMaterialToggleThumb::paintEvent(QPaintEvent *event)
- {
- Q_UNUSED(event)
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
- QBrush brush;
- brush.setStyle(Qt::SolidPattern);
- brush.setColor(m_toggle->isEnabled() ? m_thumbColor : Qt::white);
- painter.setBrush(brush);
- painter.setPen(Qt::NoPen);
- int s;
- QRectF r;
- if (Qt::Horizontal == m_toggle->orientation()) {
- s = height()-10;
- r = QRectF(5+m_offset, 5, s, s);
- } else {
- s = width()-10;
- r = QRectF(5, 5+m_offset, s, s);
- }
- painter.drawEllipse(r);
- if (!m_toggle->isEnabled()) {
- brush.setColor(m_toggle->disabledColor());
- painter.setBrush(brush);
- painter.drawEllipse(r);
- }
- }
- void QtMaterialToggleThumb::updateOffset()
- {
- const QSize s(Qt::Horizontal == m_toggle->orientation()
- ? size() : size().transposed());
- m_offset = m_shift*static_cast<qreal>(s.width()-s.height());
- update();
- }
- /*!
- * \class QtMaterialToggleTrack
- * \internal
- */
- QtMaterialToggleTrack::QtMaterialToggleTrack(QtMaterialToggle *parent)
- : QWidget(parent),
- m_toggle(parent)
- {
- Q_ASSERT(parent);
- parent->installEventFilter(this);
- }
- QtMaterialToggleTrack::~QtMaterialToggleTrack()
- {
- }
- void QtMaterialToggleTrack::setTrackColor(const QColor &color)
- {
- m_trackColor = color;
- update();
- }
- bool QtMaterialToggleTrack::eventFilter(QObject *obj, QEvent *event)
- {
- const QEvent::Type type = event->type();
- if (QEvent::Resize == type || QEvent::Move == type) {
- setGeometry(m_toggle->rect());
- }
- return QWidget::eventFilter(obj, event);
- }
- void QtMaterialToggleTrack::paintEvent(QPaintEvent *event)
- {
- Q_UNUSED(event)
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
- QBrush brush;
- if (m_toggle->isEnabled()) {
- brush.setColor(m_trackColor);
- painter.setOpacity(0.8);
- } else {
- brush.setColor(m_toggle->disabledColor());
- painter.setOpacity(0.6);
- }
- brush.setStyle(Qt::SolidPattern);
- painter.setBrush(brush);
- painter.setPen(Qt::NoPen);
- if (Qt::Horizontal == m_toggle->orientation()) {
- const int h = height()/2;
- const QRect r(0, h/2, width(), h);
- painter.drawRoundedRect(r.adjusted(14, 4, -14, -4), h/2-4, h/2-4);
- } else {
- const int w = width()/2;
- const QRect r(w/2, 0, w, height());
- painter.drawRoundedRect(r.adjusted(4, 14, -4, -14), w/2-4, w/2-4);
- }
- }
|