126 lines
5.0 KiB
C++
126 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);
|
|
}
|