Added smile

This commit is contained in:
2026-01-10 16:37:59 +01:00
parent dc3669f513
commit cb553cf928
3 changed files with 161 additions and 0 deletions

View File

@@ -53,6 +53,7 @@ SOURCES += \
bcdrivertinycan.cpp \ bcdrivertinycan.cpp \
bcsliderstyle.cpp \ bcsliderstyle.cpp \
bcthemeswitchbutton.cpp \ bcthemeswitchbutton.cpp \
bctoggleswitch.cpp \
bctransmitter.cpp \ bctransmitter.cpp \
bcvalue.cpp \ bcvalue.cpp \
bcvaluemodel.cpp \ bcvaluemodel.cpp \
@@ -72,6 +73,7 @@ HEADERS += \
bcmainwindow.h \ bcmainwindow.h \
bcsliderstyle.h \ bcsliderstyle.h \
bcthemeswitchbutton.h \ bcthemeswitchbutton.h \
bctoggleswitch.h \
bctransmitter.h \ bctransmitter.h \
bcvalue.h \ bcvalue.h \
bcvaluemodel.h \ bcvaluemodel.h \

122
bctoggleswitch.cpp Normal file
View File

@@ -0,0 +1,122 @@
#include <QPainter>
#include <QPropertyAnimation>
#include <QEasingCurve>
#include <QEnterEvent>
#include <QEvent>
#include <bctoggleswitch.h>
BCToggleSwitch::BCToggleSwitch(QWidget *parent)
: QAbstractButton(parent)
, m_position(0.0f)
{
setCheckable(true);
setCursor(Qt::PointingHandCursor);
setFixedSize(44, 22); // Standardgröße
// Animation initialisieren
m_animation = new QPropertyAnimation(this, "position", this);
m_animation->setDuration(200);
m_animation->setEasingCurve(QEasingCurve::OutQuad);
// Signal verknüpfen
connect(this, &QAbstractButton::toggled, this, [this](bool checked){
m_animation->stop();
m_animation->setStartValue(m_position);
m_animation->setEndValue(checked ? 1.0f : 0.0f);
m_animation->start();
});
}
float BCToggleSwitch::position() const
{
return m_position;
}
void BCToggleSwitch::setPosition(float pos) {
m_position = pos;
update(); // Trigger Repaint
}
QSize BCToggleSwitch::sizeHint() const
{
return QSize(44, 22);
}
void BCToggleSwitch::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
// --- Farben ---
// Tipp: In einem echten Projekt diese Farben als const statics
// oder aus der QPalette laden.
QColor offBorderColor = QColor("#8D8D8D");
QColor offKnobColor = QColor("#5D5D5D");
QColor onColor = QColor("#0078D4"); // Fluent Blue
QColor white = Qt::white;
QRectF rect = this->rect();
qreal radius = rect.height() / 2.0;
// 1. Hintergrund (Track) zeichnen
p.setPen(Qt::NoPen);
if (isChecked() || m_position > 0.5f)
{
// AN-Zustand: Hintergrund gefüllt
p.setBrush(onColor);
p.drawRoundedRect(rect, radius, radius);
}
else
{
// AUS-Zustand: Nur Rahmen
p.setBrush(Qt::NoBrush);
// Hover-Status prüfen
if (underMouse())
p.setPen(QPen(offBorderColor.darker(120), 1.5));
else
p.setPen(QPen(offBorderColor, 1.5));
// Rechteck etwas verkleinern, damit der Rahmen nicht abgeschnitten wird
p.drawRoundedRect(rect.adjusted(1, 1, -1, -1), radius - 1, radius - 1);
}
// 2. Knopf (Thumb) zeichnen
qreal padding = 3.0;
qreal knobDiameter = rect.height() - (2 * padding);
// Interpolation der Position
qreal startX = padding;
qreal endX = rect.width() - knobDiameter - padding;
qreal currentX = startX + (m_position * (endX - startX));
QRectF knobRect(currentX, padding, knobDiameter, knobDiameter);
if (isChecked() || m_position > 0.5f) {
p.setBrush(white);
} else {
if (underMouse()) p.setBrush(offKnobColor.darker(110));
else p.setBrush(offKnobColor);
}
p.setPen(Qt::NoPen);
p.drawEllipse(knobRect);
}
void BCToggleSwitch::enterEvent(QEnterEvent *event)
{
update(); // Für Hover-Effekt neu zeichnen
QAbstractButton::enterEvent(event);
}
void BCToggleSwitch::leaveEvent(QEvent *event)
{
update(); // Hover entfernen
QAbstractButton::leaveEvent(event);
}

37
bctoggleswitch.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef BCTOGGLESWITCH_H
#define BCTOGGLESWITCH_H
#include <QAbstractButton>
// Vorwärtsdeklaration spart Include-Zeit
class QPropertyAnimation;
class BCToggleSwitch : public QAbstractButton
{
Q_OBJECT
// Property für die Animation (0.0 bis 1.0)
Q_PROPERTY(float position READ position WRITE setPosition)
public:
explicit BCToggleSwitch(QWidget *parent = nullptr);
// Getter & Setter für die Animations-Property
float position() const;
void setPosition(float pos);
QSize sizeHint() const override;
protected:
void paintEvent(QPaintEvent *event) override;
void enterEvent(QEnterEvent *event) override;
void leaveEvent(QEvent *event) override;
float m_position; // 0.0 = Aus, 1.0 = An
QPropertyAnimation *m_animation;
};
#endif // BCTOGGLESWITCH_H