mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-03-24 19:04:51 -05:00
Simple switch toogle button widget based on https://github.com/KDAB/kdabtv/blob/master/Styling-Qt-Widgets/toggleswitch.h
103 lines
2.2 KiB
C++
103 lines
2.2 KiB
C++
#include "switch-button.hpp"
|
|
|
|
#include <QMouseEvent>
|
|
#include <QPainter>
|
|
#include <QPalette>
|
|
|
|
namespace advss {
|
|
|
|
static const int s_height = 20;
|
|
static const int s_innerMargin = 4;
|
|
static const int s_handleSize = s_height - s_innerMargin * 2;
|
|
static const int s_width = s_handleSize * 2 + s_innerMargin * 2;
|
|
|
|
SwitchButton::SwitchButton(QWidget *parent) : QWidget{parent}
|
|
{
|
|
setSizePolicy({QSizePolicy::Fixed, QSizePolicy::Fixed});
|
|
setFocusPolicy(Qt::TabFocus);
|
|
setAttribute(Qt::WA_Hover);
|
|
}
|
|
|
|
void SwitchButton::setChecked(bool checked)
|
|
{
|
|
if (_checked == checked) {
|
|
return;
|
|
}
|
|
_checked = checked;
|
|
emit toggled(checked);
|
|
update();
|
|
}
|
|
|
|
bool SwitchButton::isChecked() const
|
|
{
|
|
return _checked;
|
|
}
|
|
|
|
void SwitchButton::toggle()
|
|
{
|
|
setChecked(!_checked);
|
|
}
|
|
|
|
QSize SwitchButton::sizeHint() const
|
|
{
|
|
return QSize(s_width, s_height);
|
|
}
|
|
|
|
void SwitchButton::paintEvent(QPaintEvent *)
|
|
{
|
|
QPainter painter(this);
|
|
painter.setRenderHint(QPainter::Antialiasing);
|
|
QPalette pal = palette();
|
|
|
|
if (!isEnabled()) {
|
|
painter.setPen(pal.color(QPalette::Midlight));
|
|
painter.setOpacity(0.5);
|
|
} else if (_mouseDown) {
|
|
painter.setPen(pal.color(QPalette::Light));
|
|
} else if (underMouse() || hasFocus()) {
|
|
painter.setPen(QPen(pal.brush(QPalette::Highlight), 1));
|
|
} else {
|
|
painter.setPen(pal.color(QPalette::Midlight));
|
|
}
|
|
|
|
if (_checked) {
|
|
painter.setBrush(pal.color(QPalette::Button));
|
|
}
|
|
const qreal radius = height() / 2;
|
|
painter.drawRoundedRect(QRectF(rect()).adjusted(0.5, 0.5, -0.5, -0.5),
|
|
radius, radius);
|
|
|
|
// Now draw the handle
|
|
QRect valueRect = rect().adjusted(s_innerMargin, s_innerMargin,
|
|
-s_innerMargin, -s_innerMargin);
|
|
valueRect.setWidth(valueRect.height());
|
|
|
|
if (_checked) {
|
|
valueRect.moveLeft(width() / 2);
|
|
}
|
|
painter.setBrush(pal.color(QPalette::Base));
|
|
painter.drawEllipse(valueRect);
|
|
}
|
|
|
|
void SwitchButton::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
if (event->button() == Qt::LeftButton) {
|
|
_mouseDown = true;
|
|
} else {
|
|
event->ignore();
|
|
}
|
|
}
|
|
|
|
void SwitchButton::mouseReleaseEvent(QMouseEvent *event)
|
|
{
|
|
if (event->button() == Qt::LeftButton && _mouseDown) {
|
|
_mouseDown = false;
|
|
toggle();
|
|
emit checked(_checked);
|
|
} else {
|
|
event->ignore();
|
|
}
|
|
}
|
|
|
|
} // namespace advss
|