Files
cbh/ElaWidgetTools/private/ElaScrollPagePrivate.cpp
2025-09-20 01:41:33 +08:00

61 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);
}