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

76 lines
2.8 KiB
C++

#include "ElaScrollPagePrivate.h"
#include <QHBoxLayout>
#include <QPropertyAnimation>
#include <QStackedWidget>
#include <QTimer>
#include "ElaBreadcrumbBar.h"
#include "ElaScrollPage.h"
ElaScrollPagePrivate::ElaScrollPagePrivate(QObject* parent)
: QObject{parent}
{
}
ElaScrollPagePrivate::~ElaScrollPagePrivate()
{
}
void ElaScrollPagePrivate::onNavigationRouteBack(QVariantMap routeData)
{
// 面包屑
Q_Q(ElaScrollPage);
QString pageCheckSumKey = routeData.value("ElaScrollPageCheckSumKey").toString();
if (pageCheckSumKey == "Navigation")
{
QString pageTitle = routeData.value("ElaPageTitle").toString();
q->navigation(_centralWidgetMap.value(pageTitle), false);
}
else if (pageCheckSumKey == "BreadcrumbClicked")
{
QStringList lastBreadcrumbList = routeData.value("LastBreadcrumbList").toStringList();
int widgetIndex = _centralWidgetMap.value(lastBreadcrumbList.last());
_switchCentralStackIndex(widgetIndex, _navigationTargetIndex);
_navigationTargetIndex = widgetIndex;
_breadcrumbBar->setBreadcrumbList(lastBreadcrumbList);
}
}
void ElaScrollPagePrivate::_switchCentralStackIndex(int targetIndex, int lastIndex)
{
QWidget* currentWidget = _centralStackedWidget->widget(lastIndex);
QWidget* targetWidget = _centralStackedWidget->widget(targetIndex);
targetWidget->resize(currentWidget->size());
targetWidget->setVisible(true);
QPropertyAnimation* currentWidgetAnimation = new QPropertyAnimation(currentWidget, "pos");
currentWidgetAnimation->setEasingCurve(QEasingCurve::InExpo);
currentWidgetAnimation->setDuration(300);
QPropertyAnimation* targetWidgetAnimation = new QPropertyAnimation(targetWidget, "pos");
connect(targetWidgetAnimation, &QPropertyAnimation::finished, this, [=]() {
_centralStackedWidget->setCurrentIndex(targetIndex);
});
targetWidgetAnimation->setEasingCurve(QEasingCurve::InExpo);
targetWidgetAnimation->setDuration(300);
if (targetIndex > lastIndex)
{
//左滑
currentWidgetAnimation->setStartValue(currentWidget->pos());
currentWidgetAnimation->setEndValue(QPoint(-_centralStackedWidget->width(), 0));
targetWidgetAnimation->setStartValue(QPoint(_centralStackedWidget->width(), 0));
targetWidgetAnimation->setEndValue(QPoint(0, 0));
}
else
{
//右滑
currentWidgetAnimation->setStartValue(currentWidget->pos());
currentWidgetAnimation->setEndValue(QPoint(_centralStackedWidget->width(), 0));
targetWidgetAnimation->setStartValue(QPoint(-_centralStackedWidget->width(), 0));
targetWidgetAnimation->setEndValue(QPoint(0, 0));
}
currentWidgetAnimation->start(QAbstractAnimation::DeleteWhenStopped);
targetWidgetAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}