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,133 @@
#include "ElaBreadcrumbBar.h"
#include <QHeaderView>
#include <QScroller>
#include <QVBoxLayout>
#include "DeveloperComponents/ElaBreadcrumbBarDelegate.h"
#include "DeveloperComponents/ElaBreadcrumbBarModel.h"
#include "ElaBaseListView.h"
#include "ElaBreadcrumbBarPrivate.h"
Q_PROPERTY_CREATE_Q_CPP(ElaBreadcrumbBar, bool, IsAutoRemove);
ElaBreadcrumbBar::ElaBreadcrumbBar(QWidget* parent)
: QWidget{parent}, d_ptr(new ElaBreadcrumbBarPrivate())
{
Q_D(ElaBreadcrumbBar);
d->q_ptr = this;
d->_pTextPixelSize = 18;
d->_pIsAutoRemove = true;
setFixedHeight(37);
setObjectName("ElaBreadcrumbBar");
setStyleSheet("#ElaBreadcrumbBar{background-color:transparent;}");
setMouseTracking(true);
d->_listView = new ElaBaseListView(this);
d->_listView->setMinimumHeight(0);
d->_listView->setFlow(QListView::LeftToRight);
d->_listView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
d->_listView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
d->_listModel = new ElaBreadcrumbBarModel(this);
d->_listView->setModel(d->_listModel);
d->_listDelegate = new ElaBreadcrumbBarDelegate(this);
d->_listView->setItemDelegate(d->_listDelegate);
connect(d->_listView, &QListView::clicked, this, [=](const QModelIndex& index) {
if (d->_pIsAutoRemove)
{
if (d->_listModel->getBreadcrumbListCount() != 1 && index.row() != d->_listModel->getBreadcrumbListCount() * 2 - 2 && index.data(Qt::DisplayRole).toString() != ">")
{
Q_EMIT breadcrumbClicked(index.data(Qt::DisplayRole).toString(), d->_listModel->getBreadcrumbList());
d->_listModel->removeBreadcrumb(index.row() / 2 + 1);
}
}
else
{
Q_EMIT breadcrumbClicked(index.data(Qt::DisplayRole).toString(), d->_listModel->getBreadcrumbList());
}
});
QFont textFont = this->font();
textFont.setLetterSpacing(QFont::AbsoluteSpacing, 0.5);
textFont.setPixelSize(d->_pTextPixelSize);
d->_listView->setFont(textFont);
QScroller::grabGesture(d->_listView->viewport(), QScroller::LeftMouseButtonGesture);
QScroller* scroller = QScroller::scroller(d->_listView->viewport());
QScrollerProperties properties = scroller->scrollerProperties();
properties.setScrollMetric(QScrollerProperties::MousePressEventDelay, 0);
properties.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOn);
properties.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, 0.35);
properties.setScrollMetric(QScrollerProperties::OvershootScrollTime, 0.5);
properties.setScrollMetric(QScrollerProperties::FrameRate, QScrollerProperties::Fps60);
scroller->setScrollerProperties(properties);
connect(scroller, &QScroller::stateChanged, this, [=](QScroller::State newstate) {
if (newstate == QScroller::Pressed)
{
d->_listDelegate->setPressIndex(d->_listView->indexAt(d->_listView->mapFromGlobal(QCursor::pos())));
d->_listView->viewport()->update();
}
else if (newstate == QScroller::Scrolling || newstate == QScroller::Inactive)
{
d->_listDelegate->setPressIndex(QModelIndex());
}
});
QVBoxLayout* mainLayout = new QVBoxLayout(this);
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->addWidget(d->_listView);
}
ElaBreadcrumbBar::~ElaBreadcrumbBar()
{
}
void ElaBreadcrumbBar::setTextPixelSize(int textPixelSize)
{
Q_D(ElaBreadcrumbBar);
if (textPixelSize > 0)
{
d->_pTextPixelSize = textPixelSize;
QFont textFont = this->font();
textFont.setLetterSpacing(QFont::AbsoluteSpacing, 0.5);
textFont.setPixelSize(d->_pTextPixelSize);
d->_listView->setFont(textFont);
Q_EMIT pTextPixelSizeChanged();
}
}
int ElaBreadcrumbBar::getTextPixelSize() const
{
Q_D(const ElaBreadcrumbBar);
return d->_pTextPixelSize;
}
void ElaBreadcrumbBar::setBreadcrumbList(QStringList breadcrumbList)
{
Q_D(ElaBreadcrumbBar);
d->_listModel->setBreadcrumbList(breadcrumbList);
}
QStringList ElaBreadcrumbBar::appendBreadcrumb(QString breadcrumb)
{
Q_D(ElaBreadcrumbBar);
d->_listModel->appendBreadcrumb(breadcrumb);
return d->_listModel->getBreadcrumbList();
}
QStringList ElaBreadcrumbBar::removeBreadcrumb(QString breadcrumb)
{
Q_D(ElaBreadcrumbBar);
d->_listModel->removeBreadcrumb(breadcrumb);
return d->_listModel->getBreadcrumbList();
}
int ElaBreadcrumbBar::getBreadcrumbListCount() const
{
Q_D(const ElaBreadcrumbBar);
return d->_listModel->getBreadcrumbListCount();
}
QStringList ElaBreadcrumbBar::getBreadcrumbList() const
{
Q_D(const ElaBreadcrumbBar);
return d->_listModel->getBreadcrumbList();
}