125 lines
4.6 KiB
C++
125 lines
4.6 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();
|
|
}
|