2025-01-04 04:12:51 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
|
|
#include <QObject>
|
|
|
|
|
|
#include <QString>
|
|
|
|
|
|
|
|
|
|
|
|
class WorkSpace;
|
|
|
|
|
|
|
|
|
|
|
|
class Timestep : public QObject {
|
2025-11-10 23:16:13 +00:00
|
|
|
|
Q_OBJECT
|
2025-01-04 04:12:51 +00:00
|
|
|
|
public:
|
|
|
|
|
|
enum class PlayStatus : uint8_t {
|
|
|
|
|
|
PS_Started,
|
|
|
|
|
|
PS_Stoped,
|
|
|
|
|
|
PS_Suspended,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
2025-11-10 23:16:13 +00:00
|
|
|
|
explicit Timestep(WorkSpace* parent = nullptr) noexcept;
|
2025-01-04 04:12:51 +00:00
|
|
|
|
~Timestep() override = default;
|
|
|
|
|
|
|
2025-11-10 23:16:13 +00:00
|
|
|
|
void GetRange(double& minTime, double& maxTime, double& step);
|
|
|
|
|
|
void Update(double dt);
|
|
|
|
|
|
double GetCurrent() const {
|
|
|
|
|
|
return current_;
|
|
|
|
|
|
}
|
2025-01-04 04:12:51 +00:00
|
|
|
|
|
|
|
|
|
|
bool IsPause();
|
|
|
|
|
|
bool IsStoped();
|
|
|
|
|
|
void Start();
|
|
|
|
|
|
void Resume();
|
|
|
|
|
|
void Pause();
|
|
|
|
|
|
void Stop();
|
|
|
|
|
|
|
2025-11-10 23:16:13 +00:00
|
|
|
|
void Up();
|
2025-11-10 15:19:13 +00:00
|
|
|
|
void Down();
|
2025-11-10 23:16:13 +00:00
|
|
|
|
// 设置播放速度(倍率),会选取最接近的预设倍率并触发 StepChanged
|
|
|
|
|
|
void SetSpeed(double speed);
|
|
|
|
|
|
|
|
|
|
|
|
// 设置数据驱动的默认最大时间(非手动区间),用于没有文件步长时的播放边界
|
|
|
|
|
|
void SetDataMaxTime(double end);
|
2025-01-04 04:12:51 +00:00
|
|
|
|
|
2025-07-06 15:33:27 +00:00
|
|
|
|
WorkSpace* GetWorkSpace() const {
|
|
|
|
|
|
return workSpace_;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-10 23:16:13 +00:00
|
|
|
|
// 手动时间区间(可选):允许用户指定起止时间,替代或重映射步骤
|
|
|
|
|
|
void SetManualRange(double start, double end);
|
|
|
|
|
|
void ClearManualRange();
|
|
|
|
|
|
bool HasManualRange() const { return hasManualRange_; }
|
|
|
|
|
|
double GetManualStart() const { return manualStart_; }
|
|
|
|
|
|
double GetManualEnd() const { return manualEnd_; }
|
|
|
|
|
|
|
2025-01-04 04:12:51 +00:00
|
|
|
|
Q_SIGNALS:
|
2025-11-10 23:16:13 +00:00
|
|
|
|
void StatusChanged(int);
|
|
|
|
|
|
void StepChanged(double);
|
|
|
|
|
|
void TimeChanged(double);
|
|
|
|
|
|
// 当时间范围或步进倍率更新时通知 UI(例如设置手动区间或清除)
|
|
|
|
|
|
void RangeChanged(double minTime, double maxTime, double step);
|
2025-01-04 04:12:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
2025-11-10 15:19:13 +00:00
|
|
|
|
double current_{ 0.0 };
|
|
|
|
|
|
double maxTime_{ 0.0 };
|
|
|
|
|
|
// 播放速度(倍率),与 UI 显示一致,比如 0.5x、1x、2x
|
|
|
|
|
|
double currentStep_{ 1.0 };
|
|
|
|
|
|
// 有限倍率列表,防止无限放大/缩小导致无法恢复
|
|
|
|
|
|
std::vector<double> speedLevels_{ 0.25, 0.5, 1.0, 2.0, 4.0, 8.0 };
|
|
|
|
|
|
int speedIndex_{ 2 }; // 默认指向 1.0x
|
2025-01-04 04:12:51 +00:00
|
|
|
|
|
2025-11-10 23:16:13 +00:00
|
|
|
|
|
|
|
|
|
|
PlayStatus playStatus_{ PlayStatus::PS_Stoped };
|
|
|
|
|
|
WorkSpace* workSpace_{ nullptr };
|
|
|
|
|
|
|
|
|
|
|
|
bool hasManualRange_{ false };
|
|
|
|
|
|
double manualStart_{ 0.0 };
|
|
|
|
|
|
double manualEnd_{ 0.0 };
|
2025-01-04 04:12:51 +00:00
|
|
|
|
};
|
|
|
|
|
|
|