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

147 lines
5.0 KiB
C++

#include "ElaScrollPage.h"
#include <QHBoxLayout>
#include <QPainter>
#include <QResizeEvent>
#include <QScrollArea>
#include <QScrollBar>
#include <QScroller>
#include <QStackedWidget>
#include <QVBoxLayout>
#include "ElaBreadcrumbBar.h"
#include "ElaNavigationRouter.h"
#include "ElaScrollArea.h"
#include "ElaScrollBar.h"
#include "private/ElaScrollPagePrivate.h"
ElaScrollPage::ElaScrollPage(QWidget* parent)
: QWidget(parent), d_ptr(new ElaScrollPagePrivate())
{
Q_D(ElaScrollPage);
setProperty("ElaBaseClassName", "ElaScrollPage");
d->q_ptr = this;
d->_pCustomWidget = nullptr;
d->_breadcrumbBar = new ElaBreadcrumbBar(this);
d->_breadcrumbBar->setTextPixelSize(28);
connect(d->_breadcrumbBar, &ElaBreadcrumbBar::breadcrumbClicked, this, [=](QString breadcrumb, QStringList lastBreadcrumbList) {
if (d->_centralWidgetMap.contains(breadcrumb))
{
int widgetIndex = d->_centralWidgetMap.value(breadcrumb);
d->_switchCentralStackIndex(widgetIndex, d->_navigationTargetIndex);
d->_navigationTargetIndex = widgetIndex;
QVariantMap routeData = QVariantMap();
routeData.insert("ElaScrollPageCheckSumKey", "BreadcrumbClicked");
routeData.insert("LastBreadcrumbList", lastBreadcrumbList);
ElaNavigationRouter::getInstance()->navigationRoute(d, "onNavigationRouteBack", routeData);
}
});
d->_pageTitleLayout = new QHBoxLayout();
d->_pageTitleLayout->setContentsMargins(0, 0, 0, 0);
d->_pageTitleLayout->addWidget(d->_breadcrumbBar);
d->_centralStackedWidget = new QStackedWidget(this);
d->_centralStackedWidget->setContentsMargins(0, 0, 0, 0);
d->_mainLayout = new QVBoxLayout(this);
d->_mainLayout->setContentsMargins(0, 0, 0, 0);
d->_mainLayout->addLayout(d->_pageTitleLayout);
d->_mainLayout->addWidget(d->_centralStackedWidget);
setContentsMargins(20, 20, 0, 0);
}
ElaScrollPage::~ElaScrollPage()
{
}
void ElaScrollPage::addCentralWidget(QWidget* centralWidget, bool isWidgetResizeable, bool isVerticalGrabGesture, qreal mousePressEventDelay)
{
Q_D(ElaScrollPage);
if (!centralWidget)
{
return;
}
if (centralWidget->windowTitle().isEmpty())
{
centralWidget->setWindowTitle(QString("Page_%1").arg(d->_centralStackedWidget->count()));
}
if (d->_centralStackedWidget->count() == 0)
{
d->_breadcrumbBar->appendBreadcrumb(centralWidget->windowTitle());
}
ElaScrollArea* scrollArea = new ElaScrollArea(this);
scrollArea->setMouseTracking(true);
scrollArea->setIsAnimation(Qt::Vertical, true);
scrollArea->setWidgetResizable(isWidgetResizeable);
scrollArea->setIsGrabGesture(isVerticalGrabGesture, mousePressEventDelay);
scrollArea->setIsOverShoot(Qt::Vertical, true);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ElaScrollBar* floatVScrollBar = new ElaScrollBar(scrollArea->verticalScrollBar(), scrollArea);
floatVScrollBar->setIsAnimation(true);
scrollArea->setWidget(centralWidget);
centralWidget->setObjectName("ElaScrollPage_CentralPage");
centralWidget->setStyleSheet("#ElaScrollPage_CentralPage{background-color:transparent;}");
d->_centralWidgetMap.insert(centralWidget->windowTitle(), d->_centralStackedWidget->count());
d->_centralStackedWidget->addWidget(scrollArea);
}
void ElaScrollPage::setCustomWidget(QWidget* widget)
{
Q_D(ElaScrollPage);
if (!widget || widget == this)
{
return;
}
if (d->_pCustomWidget)
{
d->_mainLayout->removeWidget(d->_pCustomWidget);
}
d->_mainLayout->insertWidget(1, widget);
d->_pCustomWidget = widget;
Q_EMIT pCustomWidgetChanged();
}
QWidget* ElaScrollPage::getCustomWidget() const
{
Q_D(const ElaScrollPage);
return d->_pCustomWidget;
}
void ElaScrollPage::navigation(int widgetIndex, bool isLogRoute)
{
Q_D(ElaScrollPage);
if (widgetIndex >= d->_centralStackedWidget->count() || d->_navigationTargetIndex == widgetIndex)
{
return;
}
d->_switchCentralStackIndex(widgetIndex, d->_navigationTargetIndex);
d->_navigationTargetIndex = widgetIndex;
if (isLogRoute)
{
QVariantMap routeData = QVariantMap();
routeData.insert("ElaScrollPageCheckSumKey", "Navigation");
QStringList breadcrumbList = d->_breadcrumbBar->getBreadcrumbList();
routeData.insert("ElaPageTitle", breadcrumbList.last());
ElaNavigationRouter::getInstance()->navigationRoute(d, "onNavigationRouteBack", routeData);
}
d->_breadcrumbBar->appendBreadcrumb(d->_centralWidgetMap.key(widgetIndex));
}
void ElaScrollPage::setPageTitleSpacing(int spacing)
{
Q_D(ElaScrollPage);
d->_pageTitleLayout->takeAt(0);
d->_pageTitleLayout->addSpacing(spacing);
d->_pageTitleLayout->addWidget(d->_breadcrumbBar);
}
int ElaScrollPage::getPageTitleSpacing() const
{
return d_ptr->_pageTitleSpacing;
}
void ElaScrollPage::setTitleVisible(bool isVisible)
{
Q_D(ElaScrollPage);
d->_breadcrumbBar->setVisible(isVisible);
}