#pragma once #include #include #include class WorkSpace; class Timestep : public QObject { Q_OBJECT public: enum class PlayStatus : uint8_t { PS_Started, PS_Stoped, PS_Suspended, }; public: explicit Timestep(const std::vector& steps, const QString& path, WorkSpace* parent = nullptr) noexcept; ~Timestep() override = default; static Timestep* Load(const QString& path, WorkSpace* workSpace = nullptr); const std::vector& GetSteps() const { return steps_; } const QString& GetPath() const { return path_; } void GetRange(double& minTime, double& maxTime, double& step); void Update(double dt); double GetCurrent() const { return current_; } bool IsPause(); bool IsStoped(); void Start(); void Resume(); void Pause(); void Stop(); void Up(); void Down(); WorkSpace* GetWorkSpace() const { return workSpace_; } Q_SIGNALS: void StatusChanged(int); void StepChanged(double); void TimeChanged(double); private: std::vector steps_; QString path_; double current_{ 0.0 }; double maxTime_{ 0.0 }; // 播放速度(倍率),与 UI 显示一致,比如 0.5x、1x、2x double currentStep_{ 1.0 }; // 有限倍率列表,防止无限放大/缩小导致无法恢复 std::vector speedLevels_{ 0.25, 0.5, 1.0, 2.0, 4.0, 8.0 }; int speedIndex_{ 2 }; // 默认指向 1.0x PlayStatus playStatus_{ PlayStatus::PS_Stoped }; WorkSpace* workSpace_{ nullptr }; };