Files
dragonpilot/selfdrive/ui/qt/widgets/toggle.cc

84 lines
2.2 KiB
C++
Raw Normal View History

2021-06-09 03:09:30 +08:00
#include "selfdrive/ui/qt/widgets/toggle.h"
#include <QPainter>
Toggle::Toggle(QWidget *parent) : QAbstractButton(parent),
_height(80),
_height_rect(60),
2021-01-27 12:07:17 +01:00
on(false),
_anim(new QPropertyAnimation(this, "offset_circle", this))
{
_radius = _height / 2;
_x_circle = _radius;
_y_circle = _radius;
_y_rect = (_height - _height_rect)/2;
circleColor = QColor(0xffffff); // placeholder
green = QColor(0xffffff); // placeholder
setEnabled(true);
}
void Toggle::paintEvent(QPaintEvent *e) {
this->setFixedHeight(_height);
QPainter p(this);
p.setPen(Qt::NoPen);
p.setRenderHint(QPainter::Antialiasing, true);
// Draw toggle background left
p.setBrush(green);
p.drawRoundedRect(QRect(0, _y_rect, _x_circle + _radius, _height_rect), _height_rect/2, _height_rect/2);
// Draw toggle background right
p.setBrush(QColor(0x393939));
p.drawRoundedRect(QRect(_x_circle - _radius, _y_rect, width() - (_x_circle - _radius), _height_rect), _height_rect/2, _height_rect/2);
// Draw toggle circle
p.setBrush(circleColor);
p.drawEllipse(QRectF(_x_circle - _radius, _y_circle - _radius, 2 * _radius, 2 * _radius));
}
void Toggle::mouseReleaseEvent(QMouseEvent *e) {
2021-07-29 22:37:06 -07:00
if (!enabled) {
return;
}
2021-01-27 12:07:17 +01:00
const int left = _radius;
const int right = width() - _radius;
2021-07-29 22:37:06 -07:00
if ((_x_circle != left && _x_circle != right) || !this->rect().contains(e->localPos().toPoint())) {
// If mouse release isn't in rect or animation is running, don't parse touch events
2021-01-27 12:07:17 +01:00
return;
}
if (e->button() & Qt::LeftButton) {
togglePosition();
2021-01-27 12:07:17 +01:00
emit stateChanged(on);
}
}
2020-11-27 09:33:52 -08:00
void Toggle::togglePosition() {
2021-01-27 12:07:17 +01:00
on = !on;
2020-11-27 09:33:52 -08:00
const int left = _radius;
const int right = width() - _radius;
2021-01-27 12:07:17 +01:00
_anim->setStartValue(on ? left + immediateOffset : right - immediateOffset);
_anim->setEndValue(on ? right : left);
_anim->setDuration(animation_duration);
2020-11-27 09:33:52 -08:00
_anim->start();
2021-01-27 12:07:17 +01:00
repaint();
}
void Toggle::enterEvent(QEvent *e) {
QAbstractButton::enterEvent(e);
}
bool Toggle::getEnabled() {
return enabled;
}
void Toggle::setEnabled(bool value) {
enabled = value;
2021-07-30 16:21:42 -07:00
if (value) {
circleColor.setRgb(0xfafafa);
green.setRgb(0x33ab4c);
2021-07-30 16:21:42 -07:00
} else {
circleColor.setRgb(0x888888);
green.setRgb(0x227722);
}
2021-07-29 22:37:06 -07:00
}