mirror of https://github.com/Nheko-Reborn/nheko
parent
14f7fe282f
commit
afe381e9b1
@ -1,222 +0,0 @@ |
|||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#include <QColor> |
|
||||||
#include <QCoreApplication> |
|
||||||
#include <QEvent> |
|
||||||
#include <QPainter> |
|
||||||
|
|
||||||
#include "ToggleButton.h" |
|
||||||
|
|
||||||
void |
|
||||||
Toggle::paintEvent(QPaintEvent *event) |
|
||||||
{ |
|
||||||
Q_UNUSED(event); |
|
||||||
} |
|
||||||
|
|
||||||
Toggle::Toggle(QWidget *parent) |
|
||||||
: QAbstractButton{parent} |
|
||||||
{ |
|
||||||
init(); |
|
||||||
|
|
||||||
connect(this, &QAbstractButton::toggled, this, &Toggle::setState); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
Toggle::setState(bool isEnabled) |
|
||||||
{ |
|
||||||
setChecked(isEnabled); |
|
||||||
thumb_->setShift(isEnabled ? Position::Left : Position::Right); |
|
||||||
setupProperties(); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
Toggle::init() |
|
||||||
{ |
|
||||||
track_ = new ToggleTrack(this); |
|
||||||
thumb_ = new ToggleThumb(this); |
|
||||||
|
|
||||||
setCursor(QCursor(Qt::PointingHandCursor)); |
|
||||||
setCheckable(true); |
|
||||||
setChecked(false); |
|
||||||
|
|
||||||
setState(false); |
|
||||||
setupProperties(); |
|
||||||
|
|
||||||
QCoreApplication::processEvents(); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
Toggle::setupProperties() |
|
||||||
{ |
|
||||||
if (isEnabled()) { |
|
||||||
Position position = thumb_->shift(); |
|
||||||
|
|
||||||
thumb_->setThumbColor(trackColor()); |
|
||||||
|
|
||||||
if (position == Position::Left) |
|
||||||
track_->setTrackColor(activeColor()); |
|
||||||
else if (position == Position::Right) |
|
||||||
track_->setTrackColor(inactiveColor()); |
|
||||||
} |
|
||||||
|
|
||||||
update(); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
Toggle::setDisabledColor(const QColor &color) |
|
||||||
{ |
|
||||||
disabledColor_ = color; |
|
||||||
setupProperties(); |
|
||||||
emit disabledColorChanged(); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
Toggle::setActiveColor(const QColor &color) |
|
||||||
{ |
|
||||||
activeColor_ = color; |
|
||||||
setupProperties(); |
|
||||||
emit activeColorChanged(); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
Toggle::setInactiveColor(const QColor &color) |
|
||||||
{ |
|
||||||
inactiveColor_ = color; |
|
||||||
setupProperties(); |
|
||||||
emit inactiveColorChanged(); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
Toggle::setTrackColor(const QColor &color) |
|
||||||
{ |
|
||||||
trackColor_ = color; |
|
||||||
setupProperties(); |
|
||||||
emit trackColorChanged(); |
|
||||||
} |
|
||||||
|
|
||||||
ToggleThumb::ToggleThumb(Toggle *parent) |
|
||||||
: QWidget{parent} |
|
||||||
, toggle_{parent} |
|
||||||
, position_{Position::Right} |
|
||||||
, offset_{0} |
|
||||||
{ |
|
||||||
parent->installEventFilter(this); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
ToggleThumb::setShift(Position position) |
|
||||||
{ |
|
||||||
if (position_ != position) { |
|
||||||
position_ = position; |
|
||||||
updateOffset(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
bool |
|
||||||
ToggleThumb::eventFilter(QObject *obj, QEvent *event) |
|
||||||
{ |
|
||||||
const QEvent::Type type = event->type(); |
|
||||||
|
|
||||||
if (QEvent::Resize == type || QEvent::Move == type) { |
|
||||||
setGeometry(toggle_->rect().adjusted(8, 8, -8, -8)); |
|
||||||
updateOffset(); |
|
||||||
} |
|
||||||
|
|
||||||
return QWidget::eventFilter(obj, event); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
ToggleThumb::paintEvent(QPaintEvent *event) |
|
||||||
{ |
|
||||||
Q_UNUSED(event) |
|
||||||
|
|
||||||
QPainter painter(this); |
|
||||||
painter.setRenderHint(QPainter::Antialiasing); |
|
||||||
|
|
||||||
QBrush brush; |
|
||||||
brush.setStyle(Qt::SolidPattern); |
|
||||||
brush.setColor(toggle_->isEnabled() ? thumbColor_ : Qt::white); |
|
||||||
|
|
||||||
painter.setBrush(brush); |
|
||||||
painter.setPen(Qt::NoPen); |
|
||||||
|
|
||||||
int s; |
|
||||||
QRectF r; |
|
||||||
|
|
||||||
s = height() - 10; |
|
||||||
r = QRectF(5 + offset_, 5, s, s); |
|
||||||
|
|
||||||
painter.drawEllipse(r); |
|
||||||
|
|
||||||
if (!toggle_->isEnabled()) { |
|
||||||
brush.setColor(toggle_->disabledColor()); |
|
||||||
painter.setBrush(brush); |
|
||||||
painter.drawEllipse(r); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
ToggleThumb::updateOffset() |
|
||||||
{ |
|
||||||
const QSize s(size()); |
|
||||||
offset_ = position_ == Position::Left ? static_cast<qreal>(s.width() - s.height()) : 0; |
|
||||||
update(); |
|
||||||
} |
|
||||||
|
|
||||||
ToggleTrack::ToggleTrack(Toggle *parent) |
|
||||||
: QWidget{parent} |
|
||||||
, toggle_{parent} |
|
||||||
{ |
|
||||||
Q_ASSERT(parent); |
|
||||||
|
|
||||||
parent->installEventFilter(this); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
ToggleTrack::setTrackColor(const QColor &color) |
|
||||||
{ |
|
||||||
trackColor_ = color; |
|
||||||
emit trackColorChanged(); |
|
||||||
update(); |
|
||||||
} |
|
||||||
|
|
||||||
bool |
|
||||||
ToggleTrack::eventFilter(QObject *obj, QEvent *event) |
|
||||||
{ |
|
||||||
const QEvent::Type type = event->type(); |
|
||||||
|
|
||||||
if (QEvent::Resize == type || QEvent::Move == type) { |
|
||||||
setGeometry(toggle_->rect()); |
|
||||||
} |
|
||||||
|
|
||||||
return QWidget::eventFilter(obj, event); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
ToggleTrack::paintEvent(QPaintEvent *event) |
|
||||||
{ |
|
||||||
Q_UNUSED(event) |
|
||||||
|
|
||||||
QPainter painter(this); |
|
||||||
painter.setRenderHint(QPainter::Antialiasing); |
|
||||||
|
|
||||||
QBrush brush; |
|
||||||
if (toggle_->isEnabled()) { |
|
||||||
brush.setColor(trackColor_); |
|
||||||
painter.setOpacity(0.8); |
|
||||||
} else { |
|
||||||
brush.setColor(toggle_->disabledColor()); |
|
||||||
painter.setOpacity(0.6); |
|
||||||
} |
|
||||||
|
|
||||||
brush.setStyle(Qt::SolidPattern); |
|
||||||
painter.setBrush(brush); |
|
||||||
painter.setPen(Qt::NoPen); |
|
||||||
|
|
||||||
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); |
|
||||||
} |
|
@ -1,133 +0,0 @@ |
|||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <QAbstractButton> |
|
||||||
#include <QColor> |
|
||||||
|
|
||||||
class ToggleTrack; |
|
||||||
class ToggleThumb; |
|
||||||
|
|
||||||
enum class Position |
|
||||||
{ |
|
||||||
Left, |
|
||||||
Right |
|
||||||
}; |
|
||||||
|
|
||||||
class Toggle : public QAbstractButton |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
|
|
||||||
Q_PROPERTY(QColor activeColor WRITE setActiveColor READ activeColor NOTIFY activeColorChanged) |
|
||||||
Q_PROPERTY( |
|
||||||
QColor disabledColor WRITE setDisabledColor READ disabledColor NOTIFY disabledColorChanged) |
|
||||||
Q_PROPERTY( |
|
||||||
QColor inactiveColor WRITE setInactiveColor READ inactiveColor NOTIFY inactiveColorChanged) |
|
||||||
Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor NOTIFY trackColorChanged) |
|
||||||
|
|
||||||
public: |
|
||||||
Toggle(QWidget *parent = nullptr); |
|
||||||
|
|
||||||
void setState(bool isEnabled); |
|
||||||
|
|
||||||
void setActiveColor(const QColor &color); |
|
||||||
void setDisabledColor(const QColor &color); |
|
||||||
void setInactiveColor(const QColor &color); |
|
||||||
void setTrackColor(const QColor &color); |
|
||||||
|
|
||||||
QColor activeColor() const { return activeColor_; }; |
|
||||||
QColor disabledColor() const { return disabledColor_; }; |
|
||||||
QColor inactiveColor() const { return inactiveColor_; }; |
|
||||||
QColor trackColor() const |
|
||||||
{ |
|
||||||
return trackColor_.isValid() ? trackColor_ : QColor(0xee, 0xee, 0xee); |
|
||||||
}; |
|
||||||
|
|
||||||
QSize sizeHint() const override { return QSize(64, 48); }; |
|
||||||
|
|
||||||
protected: |
|
||||||
void paintEvent(QPaintEvent *event) override; |
|
||||||
|
|
||||||
signals: |
|
||||||
void activeColorChanged(); |
|
||||||
void disabledColorChanged(); |
|
||||||
void inactiveColorChanged(); |
|
||||||
void trackColorChanged(); |
|
||||||
|
|
||||||
private: |
|
||||||
void init(); |
|
||||||
void setupProperties(); |
|
||||||
|
|
||||||
ToggleTrack *track_; |
|
||||||
ToggleThumb *thumb_; |
|
||||||
|
|
||||||
QColor disabledColor_; |
|
||||||
QColor activeColor_; |
|
||||||
QColor inactiveColor_; |
|
||||||
QColor trackColor_; |
|
||||||
}; |
|
||||||
|
|
||||||
class ToggleThumb : public QWidget |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
|
|
||||||
Q_PROPERTY(QColor thumbColor WRITE setThumbColor READ thumbColor NOTIFY thumbColorChanged) |
|
||||||
|
|
||||||
public: |
|
||||||
ToggleThumb(Toggle *parent); |
|
||||||
|
|
||||||
Position shift() const { return position_; }; |
|
||||||
qreal offset() const { return offset_; }; |
|
||||||
QColor thumbColor() const { return thumbColor_; }; |
|
||||||
|
|
||||||
void setShift(Position position); |
|
||||||
void setThumbColor(const QColor &color) |
|
||||||
{ |
|
||||||
thumbColor_ = color; |
|
||||||
emit thumbColorChanged(); |
|
||||||
update(); |
|
||||||
}; |
|
||||||
|
|
||||||
protected: |
|
||||||
bool eventFilter(QObject *obj, QEvent *event) override; |
|
||||||
void paintEvent(QPaintEvent *event) override; |
|
||||||
|
|
||||||
signals: |
|
||||||
void thumbColorChanged(); |
|
||||||
|
|
||||||
private: |
|
||||||
void updateOffset(); |
|
||||||
|
|
||||||
Toggle *const toggle_; |
|
||||||
QColor thumbColor_; |
|
||||||
|
|
||||||
Position position_; |
|
||||||
qreal offset_; |
|
||||||
}; |
|
||||||
|
|
||||||
class ToggleTrack : public QWidget |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
|
|
||||||
Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor NOTIFY trackColor) |
|
||||||
|
|
||||||
public: |
|
||||||
ToggleTrack(Toggle *parent); |
|
||||||
|
|
||||||
void setTrackColor(const QColor &color); |
|
||||||
QColor trackColor() const { return trackColor_; }; |
|
||||||
|
|
||||||
protected: |
|
||||||
bool eventFilter(QObject *obj, QEvent *event) override; |
|
||||||
void paintEvent(QPaintEvent *event) override; |
|
||||||
|
|
||||||
signals: |
|
||||||
void trackColorChanged(); |
|
||||||
|
|
||||||
private: |
|
||||||
Toggle *const toggle_; |
|
||||||
QColor trackColor_; |
|
||||||
}; |
|
Loading…
Reference in new issue