#ifndef ANIMATEDSTACKEDWIDGET_H
#define ANIMATEDSTACKEDWIDGET_H

#include <QStackedWidget>
#include <QPropertyAnimation>
#include <QParallelAnimationGroup>

/**
 * @class AnimatedStackedWidget
 * @brief AnimatedStackedWidget 是一个继承自 QStackedWidget 的类，用于在切换页面时添加动画效果。
 * 
 * AnimatedStackedWidget 提供了多种动画方向，包括从左到右、从右到左、从上到下、从下到上、淡入淡出、缩放和旋转。
 * 用户可以通过设置动画持续时间、动画类型，并调用 slideToIndex、slideToNext 和 slideToPrevious 方法来切换页面并应用动画效果。
 * 
 * @note 该类依赖于 Qt 框架中的动画和动画组类，因此需要在 Qt 环境中使用。
 * 
 * @example
 * AnimatedStackedWidget *stackedWidget = new AnimatedStackedWidget(parent);
 * stackedWidget->setAnimationDuration(500); // 设置动画持续时间为 500 毫秒
 * stackedWidget->setAnimationType(AnimatedStackedWidget::FadeIn); // 设置动画类型为淡入
 * stackedWidget->slideToIndex(1); // 切换到索引为 1 的页面
 * 
 * @param parent 父 QWidget 对象，默认为 nullptr
 */
class AnimatedStackedWidget : public QStackedWidget
{
    Q_OBJECT
public:
    // 动画方向
    enum AnimationDirection {
        LeftToRight,
        RightToLeft,
        TopToBottom,
        BottomToTop,
        FadeIn,      // 淡入淡出
        ZoomIn,      // 缩放
        Rotate       // 旋转
    };

    /**
     * @brief 构造函数，创建一个 AnimatedStackedWidget 对象。
     * 
     * @param parent 父 QWidget 对象，默认为 nullptr
     */
    explicit AnimatedStackedWidget(QWidget *parent = nullptr);

    /**
     * @brief 析构函数，销毁 AnimatedStackedWidget 对象。
     */
    ~AnimatedStackedWidget();

    /**
     * @brief 设置动画持续时间。
     * 
     * @param msecs 动画持续时间，以毫秒为单位
     */
    void setAnimationDuration(int msecs);

    /**
     * @brief 设置动画类型。
     * 
     * @param type 动画类型，枚举值之一
     */
    void setAnimationType(AnimationDirection type);

    /**
     * @brief 切换到指定索引的页面。
     * 
     * @param index 页面索引
     */
    void slideToIndex(int index);

    /**
     * @brief 切换到下一个页面。
     */
    void slideToNext();

    /**
     * @brief 切换到上一个页面。
     */
    void slideToPrevious();

    /**
     * @brief 设置当前显示的页面。
     * 
     * @param widget 要显示的 QWidget 对象
     */
    void setCurrentWidget(QWidget *widget) ;

protected:
    /**
     * @brief 重写 paintEvent 方法，用于绘制动画效果。
     * 
     * @param event QPaintEvent 对象
     */
    virtual void paintEvent(QPaintEvent *event) override;

private:
    /**
     * @brief 初始化动画相关变量。
     */
    void initAnimation();

    /**
     * @brief 开始动画。
     * 
     * @param nextIndex 下一个页面的索引
     */
    void startAnimation(int nextIndex);

private:
    int m_currentIndex;
    int m_nextIndex;
    bool m_isAnimating;
    int m_duration;
    AnimationDirection m_animationType;
    QPropertyAnimation* m_currentValueAnimation;
    QPropertyAnimation* m_nextValueAnimation;
    QParallelAnimationGroup* m_animationGroup;
    QVariant m_currentValue;
    QVariant m_nextValue;
};

#endif // ANIMATEDSTACKEDWIDGET_H
