Qt ui: improve toggle buttons (#2639)
* works, but is still a bit ugly
* works
* looks much better now
* fix compile error
* reduce diff
* write to params
* cleanup
old-commit-hash: 61884d2c50
commatwo_master
parent
19855c90f1
commit
3bfc92bafc
4 changed files with 124 additions and 14 deletions
@ -0,0 +1,66 @@ |
||||
#include "toggle.hpp" |
||||
|
||||
#include <QAbstractButton> |
||||
#include <QPropertyAnimation> |
||||
#include <QWidget> |
||||
#include <QDebug> |
||||
#include "common/params.h" |
||||
|
||||
Toggle::Toggle(QWidget *parent) : QAbstractButton(parent), |
||||
_height(60), |
||||
_height_rect(45), |
||||
_on(false), |
||||
_anim(new QPropertyAnimation(this, "offset_circle", this)) |
||||
{ |
||||
_radius = _height / 2; |
||||
_x_circle = _radius; |
||||
_y_circle = _radius; |
||||
_y_rect = (_height - _height_rect)/2; |
||||
} |
||||
|
||||
|
||||
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(QColor("#33ab4c")); |
||||
p.drawRoundedRect(QRect(0, _y_rect, _x_circle + _radius, _height_rect), _height_rect/2, _height_rect/2); |
||||
// Draw toggle background right
|
||||
p.setBrush(QColor("#0a1a26")); |
||||
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(QColor("#fafafa")); |
||||
p.drawEllipse(QRectF(_x_circle - _radius, _y_circle - _radius, 2 * _radius, 2 * _radius)); |
||||
} |
||||
|
||||
void Toggle::mouseReleaseEvent(QMouseEvent *e) { |
||||
if (e->button() & Qt::LeftButton) { |
||||
togglePosition(); |
||||
emit stateChanged(_on); |
||||
} |
||||
|
||||
} |
||||
|
||||
void Toggle::togglePosition(){ |
||||
_on = !_on; |
||||
if (_on) { |
||||
_anim->setStartValue(_radius); |
||||
_anim->setEndValue(width() - _radius); |
||||
_anim->setDuration(120); |
||||
_anim->start(); |
||||
} else { |
||||
_anim->setStartValue(width() - _radius); |
||||
_anim->setEndValue(_radius); |
||||
_anim->setDuration(120); |
||||
_anim->start(); |
||||
} |
||||
} |
||||
|
||||
void Toggle::enterEvent(QEvent *e) { |
||||
setCursor(Qt::PointingHandCursor); |
||||
QAbstractButton::enterEvent(e); |
||||
} |
@ -0,0 +1,34 @@ |
||||
#pragma once |
||||
#include <QtWidgets> |
||||
|
||||
class Toggle : public QAbstractButton { |
||||
Q_OBJECT |
||||
Q_PROPERTY(int offset_circle READ offset_circle WRITE set_offset_circle) |
||||
|
||||
public: |
||||
Toggle(QWidget* parent = nullptr); |
||||
void togglePosition();//Toggles the toggle
|
||||
|
||||
int offset_circle() const { |
||||
return _x_circle; |
||||
} |
||||
void set_offset_circle(int o) { |
||||
_x_circle = o; |
||||
update(); |
||||
} |
||||
|
||||
protected: |
||||
void paintEvent(QPaintEvent*) override; |
||||
void mouseReleaseEvent(QMouseEvent*) override; |
||||
void enterEvent(QEvent*) override; |
||||
|
||||
private: |
||||
bool _on; |
||||
int _x_circle, _y_circle; |
||||
int _height, _radius; |
||||
int _height_rect, _y_rect; |
||||
QPropertyAnimation *_anim = nullptr; |
||||
|
||||
signals: |
||||
void stateChanged(int new_state); |
||||
}; |
Loading…
Reference in new issue