Files
cbh/ElaWidgetTools/DeveloperComponents/ElaDrawerHeader.cpp
2025-09-19 22:40:52 +08:00

149 lines
4.7 KiB
C++

#include "ElaDrawerHeader.h"
#include "ElaTheme.h"
#include <QEvent>
#include <QMouseEvent>
#include <QPainter>
#include <QPropertyAnimation>
ElaDrawerHeader::ElaDrawerHeader(QWidget* parent)
: QWidget(parent)
{
_pBorderRadius = 6;
_pIsExpand = false;
_pExpandIconRotate = 0;
setFixedHeight(75);
setMouseTracking(true);
setObjectName("ElaDrawerHeader");
setStyleSheet("#ElaDrawerHeader{background-color:transparent;}");
_mainLayout = new QVBoxLayout(this);
_mainLayout->setContentsMargins(0, 0, 0, 0);
setContentsMargins(0, 0, 30, 0);
_themeMode = eTheme->getThemeMode();
connect(eTheme, &ElaTheme::themeModeChanged, this, [=](ElaThemeType::ThemeMode themeMode) {
_themeMode = themeMode;
});
}
ElaDrawerHeader::~ElaDrawerHeader()
{
}
void ElaDrawerHeader::setHeaderWidget(QWidget* widget)
{
if (!widget)
{
return;
}
if (_headerWidget)
{
_mainLayout->removeWidget(_headerWidget);
_headerWidget->deleteLater();
}
_mainLayout->addWidget(widget);
_headerWidget = widget;
}
void ElaDrawerHeader::doExpandOrCollpaseAnimation()
{
QPropertyAnimation* rotateAnimation = new QPropertyAnimation(this, "pExpandIconRotate");
connect(rotateAnimation, &QPropertyAnimation::valueChanged, this, [=](const QVariant& value) {
update();
});
rotateAnimation->setDuration(300);
rotateAnimation->setEasingCurve(QEasingCurve::InOutSine);
rotateAnimation->setStartValue(_pExpandIconRotate);
rotateAnimation->setEndValue(_pIsExpand ? -180 : 0);
rotateAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}
bool ElaDrawerHeader::event(QEvent* event)
{
switch (event->type())
{
case QEvent::Enter:
case QEvent::Leave:
{
update();
break;
}
default:
{
break;
}
}
return QWidget::event(event);
}
void ElaDrawerHeader::mousePressEvent(QMouseEvent* event)
{
QWidget* posWidget = childAt(event->pos());
if (!posWidget || (posWidget && posWidget->objectName().isEmpty()))
{
_isPressed = true;
update();
}
QWidget::mousePressEvent(event);
}
void ElaDrawerHeader::mouseReleaseEvent(QMouseEvent* event)
{
QWidget* posWidget = childAt(event->pos());
if (!posWidget || (posWidget && posWidget->objectName().isEmpty()))
{
_isPressed = false;
_pIsExpand = !_pIsExpand;
//指示器动画
doExpandOrCollpaseAnimation();
Q_EMIT drawerHeaderClicked(_pIsExpand);
}
QWidget::mouseReleaseEvent(event);
}
void ElaDrawerHeader::mouseMoveEvent(QMouseEvent* event)
{
update();
QWidget::mouseMoveEvent(event);
}
void ElaDrawerHeader::paintEvent(QPaintEvent* event)
{
bool isUnderMouse = underMouse();
QPainter painter(this);
painter.save();
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(ElaThemeColor(_themeMode, BasicBorder));
painter.setBrush(_isPressed ? ElaThemeColor(_themeMode, BasicSelectedAlpha) : isUnderMouse ? ElaThemeColor(_themeMode, BasicPressAlpha)
: ElaThemeColor(_themeMode, BasicBaseAlpha));
QRect foregroundRect(1, 1, width() - 2, _pIsExpand ? height() + _pBorderRadius : height() - 2);
painter.drawRoundedRect(foregroundRect, _pBorderRadius, _pBorderRadius);
// 底边线绘制
if (isUnderMouse)
{
painter.setPen(ElaThemeColor(_themeMode, BasicBorderDeep));
}
if (_pIsExpand)
{
painter.drawLine(0, height() - 1, width(), height() - 1);
}
else
{
painter.drawLine(_pBorderRadius, height() - 1, width() - _pBorderRadius, height() - 1);
painter.drawArc(QRectF(1, height() - 1 - 2 * _pBorderRadius, 2 * _pBorderRadius, 2 * _pBorderRadius), 240 * 16, 30 * 16);
painter.drawArc(QRectF(width() - 2 * _pBorderRadius, height() - 1 - 2 * _pBorderRadius, 2 * _pBorderRadius, 2 * _pBorderRadius), -90 * 16, 30 * 16);
}
// 展开图标绘制
QFont iconFont = QFont("ElaAwesome");
iconFont.setPixelSize(17);
painter.setFont(iconFont);
painter.setPen(isEnabled() ? ElaThemeColor(_themeMode, BasicText) : ElaThemeColor(_themeMode, BasicTextDisable));
QRectF expandIconRect(width() - 25, 0, 20, height());
painter.translate(expandIconRect.x() + (qreal)expandIconRect.width() / 2 - 2, expandIconRect.y() + (qreal)expandIconRect.height() / 2);
painter.rotate(_pExpandIconRotate);
painter.translate(-expandIconRect.x() - (qreal)expandIconRect.width() / 2 + 2, -expandIconRect.y() - (qreal)expandIconRect.height() / 2);
painter.drawText(expandIconRect, Qt::AlignVCenter, QChar((unsigned short)ElaIconType::AngleDown));
painter.restore();
}