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,196 @@
#include "ElaPromotionView.h"
#include <QPainter>
#include <QTimer>
#include <QWheelEvent>
#include "ElaPromotionCard.h"
#include "ElaPromotionViewPrivate.h"
#include "ElaTheme.h"
ElaPromotionView::ElaPromotionView(QWidget* parent)
: QWidget{parent}, d_ptr(new ElaPromotionViewPrivate())
{
Q_D(ElaPromotionView);
d->q_ptr = this;
d->_pCurrentIndex = 0;
d->_pCardExpandWidth = 600;
d->_pCardCollapseWidth = 300;
d->_pIsAutoScroll = false;
d->_pAutoScrollInterval = 5000;
setFixedHeight(300);
setObjectName("ElaPromotionView");
setStyleSheet("#ElaPromotionView{background-color:transparent;}");
d->_autoScrollTimer = new QTimer(this);
connect(d->_autoScrollTimer, &QTimer::timeout, this, [=]() {
if (isVisible() && d->_promotionCardList.count() > 2)
{
d->onPromotionCardClicked(d->_promotionCardList[d->_getAdjacentIndex(Qt::LeftToRight, d->_pCurrentIndex)]);
}
});
d->_themeMode = eTheme->getThemeMode();
connect(eTheme, &ElaTheme::themeModeChanged, this, [=](ElaThemeType::ThemeMode themeMode) { d->_themeMode = themeMode; });
}
ElaPromotionView::~ElaPromotionView()
{
}
void ElaPromotionView::setCardExpandWidth(int width)
{
Q_D(ElaPromotionView);
if (width <= 0)
{
return;
}
d->_pCardExpandWidth = width;
d->_updatePromotionCardGeometry();
}
int ElaPromotionView::getCardExpandWidth() const
{
Q_D(const ElaPromotionView);
return d->_pCardExpandWidth;
}
void ElaPromotionView::setCardCollapseWidth(int width)
{
Q_D(ElaPromotionView);
if (width <= 0)
{
return;
}
d->_pCardCollapseWidth = width;
d->_updatePromotionCardGeometry();
}
int ElaPromotionView::getCardCollapseWidth() const
{
Q_D(const ElaPromotionView);
return d->_pCardCollapseWidth;
}
void ElaPromotionView::setCurrentIndex(int index)
{
Q_D(ElaPromotionView);
if (index < 0 || index >= d->_promotionCardList.count())
{
return;
}
d->onPromotionCardClicked(d->_promotionCardList[index]);
}
int ElaPromotionView::getCurrentIndex() const
{
Q_D(const ElaPromotionView);
return d->_pCurrentIndex;
}
void ElaPromotionView::setIsAutoScroll(bool isAutoScroll)
{
Q_D(ElaPromotionView);
if (isAutoScroll)
{
d->_autoScrollTimer->start(d->_pAutoScrollInterval);
}
else
{
d->_autoScrollTimer->stop();
}
d->_pIsAutoScroll = isAutoScroll;
Q_EMIT pIsAutoScrollChanged();
}
bool ElaPromotionView::getIsAutoScroll() const
{
Q_D(const ElaPromotionView);
return d->_pIsAutoScroll;
}
void ElaPromotionView::setAutoScrollInterval(int autoScrollInterval)
{
Q_D(ElaPromotionView);
if (autoScrollInterval < 400)
{
return;
}
d->_pAutoScrollInterval = autoScrollInterval;
Q_EMIT pAutoScrollIntervalChanged();
}
int ElaPromotionView::getAutoScrollInterval() const
{
Q_D(const ElaPromotionView);
return d->_pAutoScrollInterval;
}
void ElaPromotionView::appendPromotionCard(ElaPromotionCard* card)
{
Q_D(ElaPromotionView);
if (!card || d->_promotionCardList.contains(card))
{
return;
}
card->setMinimumSize(0, 0);
card->setMaximumSize(10000, 10000);
card->setParent(this);
d->_promotionCardList.append(card);
connect(card, &ElaPromotionCard::promotionCardClicked, this, [=]() {
d->onPromotionCardClicked(card);
});
d->_updatePromotionCardGeometry();
}
void ElaPromotionView::wheelEvent(QWheelEvent* event)
{
Q_D(ElaPromotionView);
if (d->_isAllowSwitch)
{
if (event->angleDelta().y() > 0)
{
//右滑
d->_isAllowSwitch = false;
QTimer::singleShot(400, this, [=] {
d->_isAllowSwitch = true;
});
d->onPromotionCardClicked(d->_promotionCardList[d->_getAdjacentIndex(Qt::RightToLeft, d->_pCurrentIndex)]);
}
else
{
//左滑
d->_isAllowSwitch = false;
QTimer::singleShot(400, this, [=] {
d->_isAllowSwitch = true;
});
d->onPromotionCardClicked(d->_promotionCardList[d->_getAdjacentIndex(Qt::LeftToRight, d->_pCurrentIndex)]);
}
}
event->accept();
}
void ElaPromotionView::paintEvent(QPaintEvent* event)
{
Q_D(ElaPromotionView);
QPainter painter(this);
painter.save();
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
painter.setPen(Qt::NoPen);
painter.setBrush(ElaThemeColor(d->_themeMode, BasicIndicator));
//页标指示器绘制
int promotionCardCount = d->_promotionCardList.count();
bool isCountOdd = promotionCardCount % 2;
QPoint startPoint = isCountOdd ? QPoint(width() / 2 - promotionCardCount / 2 * d->_indicatorSpacing, height() - d->_bottomMargin / 2) : QPoint(width() / 2 - promotionCardCount / 2 * d->_indicatorSpacing - d->_indicatorSpacing / 2, height() - d->_bottomMargin / 2);
for (int i = 0; i < promotionCardCount; i++)
{
if (i == d->_pCurrentIndex)
{
painter.drawEllipse(QPointF(startPoint.x() + i * d->_indicatorSpacing, startPoint.y()), 3.5, 3.5);
}
else
{
painter.drawEllipse(QPointF(startPoint.x() + i * d->_indicatorSpacing, startPoint.y()), 2.5, 2.5);
}
}
painter.restore();
}