feat: 添加ElaWidgetTool库
This commit is contained in:
148
ElaWidgetTools/DeveloperComponents/ElaDrawerHeader.cpp
Normal file
148
ElaWidgetTools/DeveloperComponents/ElaDrawerHeader.cpp
Normal file
@@ -0,0 +1,148 @@
|
||||
#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();
|
||||
}
|
||||
Reference in New Issue
Block a user