fix time up or down

This commit is contained in:
brige 2025-11-10 23:19:13 +08:00
parent d3999a80d2
commit 28575bc8c5
2 changed files with 40 additions and 15 deletions

View File

@ -1,5 +1,7 @@
#include "workspace/Timestep.h" #include "workspace/Timestep.h"
#include <algorithm>
#include <QFile> #include <QFile>
#include <QTextStream> #include <QTextStream>
@ -14,6 +16,10 @@ Timestep::Timestep(const std::vector<double>& steps, const QString& path, WorkSp
, path_(path) , path_(path)
, workSpace_(parent) { , workSpace_(parent) {
maxTime_ = *steps_.rbegin(); maxTime_ = *steps_.rbegin();
// 初始化为 1.0x,如果列表中没有 1.0,则取最接近中间的默认索引
auto it = std::find(speedLevels_.begin(), speedLevels_.end(), 1.0);
speedIndex_ = it != speedLevels_.end() ? int(std::distance(speedLevels_.begin(), it)) : speedIndex_;
currentStep_ = speedLevels_[speedIndex_];
} }
Timestep* Timestep::Load(const QString& path, WorkSpace* workSpace) { Timestep* Timestep::Load(const QString& path, WorkSpace* workSpace) {
@ -91,6 +97,11 @@ void Timestep::Start() {
return; return;
} }
workSpace_->Begin(); workSpace_->Begin();
// 重置速度为 1x 并通知 UI
auto it = std::find(speedLevels_.begin(), speedLevels_.end(), 1.0);
speedIndex_ = it != speedLevels_.end() ? int(std::distance(speedLevels_.begin(), it)) : speedIndex_;
currentStep_ = speedLevels_[speedIndex_];
emit StepChanged(currentStep_);
emit StatusChanged((int)playStatus_); emit StatusChanged((int)playStatus_);
} }
@ -123,17 +134,28 @@ void Timestep::Stop() {
return; return;
} }
workSpace_->End(); workSpace_->End();
// 停止时也恢复为 1x避免停后再次播放仍是异常倍率
auto it = std::find(speedLevels_.begin(), speedLevels_.end(), 1.0);
speedIndex_ = it != speedLevels_.end() ? int(std::distance(speedLevels_.begin(), it)) : speedIndex_;
currentStep_ = speedLevels_[speedIndex_];
emit StepChanged(currentStep_);
emit StatusChanged((int)playStatus_); emit StatusChanged((int)playStatus_);
} }
void Timestep::Up() { void Timestep::Up() {
currentSpeed *= 2; // 提升到下一个倍率(封顶)
currentStep_ *= currentSpeed; if (speedIndex_ < int(speedLevels_.size()) - 1) {
emit StepChanged(currentSpeed); ++speedIndex_;
}
currentStep_ = speedLevels_[speedIndex_];
emit StepChanged(currentStep_);
} }
void Timestep::Down() { void Timestep::Down() {
currentSpeed *= 0.5; // 降到上一个倍率(保底)
currentStep_ *= currentSpeed; if (speedIndex_ > 0) {
emit StepChanged(currentSpeed); --speedIndex_;
}
currentStep_ = speedLevels_[speedIndex_];
emit StepChanged(currentStep_);
} }

View File

@ -43,7 +43,7 @@ public:
void Stop(); void Stop();
void Up(); void Up();
void Down(); void Down();
WorkSpace* GetWorkSpace() const { WorkSpace* GetWorkSpace() const {
return workSpace_; return workSpace_;
@ -56,15 +56,18 @@ Q_SIGNALS:
private: private:
std::vector<double> steps_; std::vector<double> steps_;
QString path_; QString path_;
double current_{ 0.0 }; double current_{ 0.0 };
double maxTime_{ 0.0 }; double maxTime_{ 0.0 };
double currentStep_{ 1.0 }; // 播放速度(倍率),与 UI 显示一致,比如 0.5x、1x、2x
double currentSpeed = { 1.0 }; 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
PlayStatus playStatus_{ PlayStatus::PS_Stoped }; PlayStatus playStatus_{ PlayStatus::PS_Stoped };
WorkSpace* workSpace_{ nullptr }; WorkSpace* workSpace_{ nullptr };
}; };