#include "selfdrive/ui/qt/widgets/toggle.h" Toggle::Toggle(QWidget *parent) : QAbstractButton(parent), _height(80), _height_rect(60), 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) { if(!enabled) { return; } const int left = _radius; const int right = width() - _radius; if(_x_circle != left && _x_circle != right) { //Don't parse touch events, while the animation is running return; } if (e->button() & Qt::LeftButton) { togglePosition(); emit stateChanged(on); } } void Toggle::togglePosition() { on = !on; const int left = _radius; const int right = width() - _radius; _anim->setStartValue(on ? left + immediateOffset : right - immediateOffset); _anim->setEndValue(on ? right : left); _anim->setDuration(animation_duration); _anim->start(); repaint(); } void Toggle::enterEvent(QEvent *e) { QAbstractButton::enterEvent(e); } bool Toggle::getEnabled() { return enabled; } void Toggle::setEnabled(bool value) { enabled = value; if(value) { circleColor.setRgb(0xfafafa); green.setRgb(0x33ab4c); }else{ circleColor.setRgb(0x888888); green.setRgb(0x227722); } }