#ifndef SLIDINGSTACKEDWIDGET_H #define SLIDINGSTACKEDWIDGET_H #include #include #include #include #include #include #include #include class QLabel; class SlidingStackedWidget : public QStackedWidget { Q_OBJECT public: enum SlideDirection { LeftToRight, RightToLeft, TopToBottom, BottomToTop, Automatic }; explicit SlidingStackedWidget(QWidget *parent = nullptr); void setSpeed(int speed); void setEasingCurve(QEasingCurve::Type curveType); void slideInIdx(int idx, SlideDirection direction = Automatic); void slideInWgt(QWidget *widget, SlideDirection direction = Automatic); // Instant switch (no slide), safely finishing any in-flight animation. // For targets with their own entrance animation (e.g. the player view). void jumpToIdx(int idx); void jumpToWgt(QWidget *widget); void disposeWidgetWhenSafe(QWidget *widget); Q_SIGNALS: void animationFinished(); private Q_SLOTS: void animationDoneSlot(); private: QLabel *createSnapshotLabel(QWidget *source, const QRect &geometry); void clearSnapshotLabels(); void startSlideAnimation(QWidget *widgetNow, const QPoint &nowStart, const QPoint &nowEnd, QWidget *widgetNext, const QPoint &nextStart, const QPoint &nextEnd); void updateSlideAnimation(); int animationFrameIntervalMs() const; void flushPendingWidgetDisposals(); int m_speed; QEasingCurve::Type m_animationType; QTimer m_slideTimer; QElapsedTimer m_slideClock; QPointer m_animWidgetNow; QPointer m_animWidgetNext; QPoint m_animNowStart; QPoint m_animNowEnd; QPoint m_animNextStart; QPoint m_animNextEnd; bool m_isAnimating; int m_nextIndex; QList> m_pendingWidgetDisposals; QLabel* m_currentSnapshotLabel = nullptr; QLabel* m_nextSnapshotLabel = nullptr; }; #endif