feat: 添加ElaWidgetTool库

This commit is contained in:
sleepwithoutbz
2025-09-19 22:40:52 +08:00
parent 5f93e8caf6
commit 4eef5c7fd5
407 changed files with 36325 additions and 7 deletions

View File

@@ -0,0 +1,181 @@
#include "ElaToggleSwitch.h"
#include <QEvent>
#include <QMouseEvent>
#include <QPainter>
#include <QPainterPath>
#include "ElaTheme.h"
#include "private/ElaToggleSwitchPrivate.h"
ElaToggleSwitch::ElaToggleSwitch(QWidget* parent)
: QWidget{parent}, d_ptr(new ElaToggleSwitchPrivate())
{
Q_D(ElaToggleSwitch);
d->q_ptr = this;
setObjectName("ElaToggleSwitch");
setMouseTracking(true);
setFixedSize(44, 22);
d->_circleCenterX = -1;
d->_isToggled = false;
d->_themeMode = eTheme->getThemeMode();
setProperty("circleCenterX", 0.01);
setProperty("circleRadius", 0.01);
connect(eTheme, &ElaTheme::themeModeChanged, this, [=](ElaThemeType::ThemeMode themeMode) {
d->_themeMode = themeMode;
});
}
ElaToggleSwitch::~ElaToggleSwitch()
{
}
void ElaToggleSwitch::setIsToggled(bool isToggled)
{
Q_D(ElaToggleSwitch);
if (d->_isToggled == isToggled)
{
return;
}
if (d->_isToggled)
{
d->_startPosAnimation(width() - height() / 2 - d->_margin * 2, height() / 2, isToggled);
}
else
{
d->_startPosAnimation(height() / 2, width() - height() / 2 - d->_margin * 2, isToggled);
}
}
bool ElaToggleSwitch::getIsToggled() const
{
return d_ptr->_isToggled;
}
bool ElaToggleSwitch::event(QEvent* event)
{
Q_D(ElaToggleSwitch);
switch (event->type())
{
case QEvent::Enter:
{
if (isEnabled())
{
d->_startRadiusAnimation(height() * 0.3, height() * 0.35);
}
break;
}
case QEvent::Leave:
{
if (isEnabled())
{
d->_startRadiusAnimation(height() * 0.35, height() * 0.3);
}
break;
}
case QEvent::MouseMove:
{
update();
break;
}
default:
{
break;
}
}
return QWidget::event(event);
}
void ElaToggleSwitch::mousePressEvent(QMouseEvent* event)
{
Q_D(ElaToggleSwitch);
d->_adjustCircleCenterX();
d->_isLeftButtonPress = true;
d->_lastMouseX = event->pos().x();
d->_startRadiusAnimation(d->_circleRadius, height() * 0.25);
QWidget::mousePressEvent(event);
}
void ElaToggleSwitch::mouseReleaseEvent(QMouseEvent* event)
{
Q_D(ElaToggleSwitch);
d->_isLeftButtonPress = false;
QWidget::mouseReleaseEvent(event);
if (d->_isMousePressMove)
{
d->_isMousePressMove = false;
if (d->_circleCenterX > width() / 2)
{
d->_startPosAnimation(d->_circleCenterX, width() - height() / 2 - d->_margin * 2, true);
}
else
{
d->_startPosAnimation(d->_circleCenterX, height() / 2, false);
}
}
else
{
if (d->_isToggled)
{
d->_startPosAnimation(d->_circleCenterX, height() / 2, false);
}
else
{
d->_startPosAnimation(d->_circleCenterX, width() - height() / 2 - d->_margin * 2, true);
}
}
d->_startRadiusAnimation(height() * 0.25, height() * 0.35);
}
void ElaToggleSwitch::mouseMoveEvent(QMouseEvent* event)
{
Q_D(ElaToggleSwitch);
if (d->_isLeftButtonPress)
{
d->_isMousePressMove = true;
int moveX = event->pos().x() - d->_lastMouseX;
d->_lastMouseX = event->pos().x();
d->_circleCenterX += moveX;
d->_adjustCircleCenterX();
}
QWidget::mouseMoveEvent(event);
}
void ElaToggleSwitch::paintEvent(QPaintEvent* event)
{
Q_D(ElaToggleSwitch);
QPainter painter(this);
painter.save();
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
// 背景绘制
painter.setPen(d->_isToggled ? QPen(ElaThemeColor(d->_themeMode, BasicBorder), 1.5) : QPen(ElaThemeColor(d->_themeMode, BasicBorderDeep), 1.5));
painter.setBrush(isEnabled() ? d->_isToggled ? ElaThemeColor(d->_themeMode, PrimaryNormal) : (underMouse() ? ElaThemeColor(d->_themeMode, BasicHover) : ElaThemeColor(d->_themeMode, BasicBase)) : ElaThemeColor(d->_themeMode, BasicDisable));
QPainterPath path;
path.moveTo(width() - height() - d->_margin, height() - d->_margin);
path.arcTo(QRectF(QPointF(width() - height() - d->_margin, d->_margin), QSize(height() - d->_margin * 2, height() - d->_margin * 2)), -90, 180);
path.lineTo(height() / 2 + d->_margin, d->_margin);
path.arcTo(QRectF(QPointF(d->_margin, d->_margin), QSize(height() - d->_margin * 2, height() - d->_margin * 2)), 90, 180);
path.lineTo(width() - height() - d->_margin, height() - d->_margin);
path.closeSubpath();
painter.drawPath(path);
// 圆心绘制
painter.setPen(Qt::NoPen);
painter.setBrush(isEnabled() ? d->_isToggled ? ElaThemeColor(d->_themeMode, BasicTextInvert) : ElaThemeColor(d->_themeMode, ToggleSwitchNoToggledCenter) : ElaThemeColor(d->_themeMode, BasicTextDisable));
if (d->_circleRadius == 0)
{
d->_circleRadius = this->isEnabled() ? (underMouse() ? height() * 0.35 : height() * 0.3) : height() * 0.3;
}
if (d->_isLeftButtonPress)
{
painter.drawEllipse(QPointF(d->_circleCenterX, height() / 2), d->_circleRadius, d->_circleRadius);
}
else
{
if (d->_circleCenterX == -1)
{
d->_circleCenterX = d->_isToggled ? width() - height() / 2 - d->_margin * 2 : height() / 2;
}
painter.drawEllipse(QPointF(d->_circleCenterX, height() / 2), d->_circleRadius, d->_circleRadius);
}
painter.restore();
}