Files
MosisService/designer/src/testing/action_player.h
omigamedev a583ef64a1 fix action player wait actions to properly delay playback finish
Wait actions now extend the minimum finish time based on their
timestamp + duration, ensuring timers and other async operations
have time to complete before playback ends and screenshot is taken.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 10:35:44 +01:00

69 lines
2.0 KiB
C++

// D:\Dev\Mosis\MosisService\designer\src\testing\action_player.h
#pragma once
#include "action_types.h"
#include <RmlUi/Core.h>
#include <functional>
#include <chrono>
namespace mosis::testing {
class ActionPlayer {
public:
using ScreenshotCallback = std::function<void(const std::string& filename)>;
using NavigateCallback = std::function<void(const std::string& screen)>;
ActionPlayer(Rml::Context* context);
~ActionPlayer() = default;
// Load and play
bool LoadSequence(const ActionSequence& sequence);
bool LoadFromFile(const std::string& path);
// Playback control
void Start();
void Stop();
void Pause();
void Resume();
bool IsPlaying() const { return m_playing && !m_paused; }
bool IsPaused() const { return m_paused; }
bool IsFinished() const { return m_finished; }
// Call this every frame to advance playback
void Update();
// Callbacks
void SetScreenshotCallback(ScreenshotCallback cb) { m_screenshot_cb = std::move(cb); }
void SetNavigateCallback(NavigateCallback cb) { m_navigate_cb = std::move(cb); }
// Get progress
size_t GetCurrentActionIndex() const { return m_current_index; }
size_t GetTotalActions() const { return m_sequence.actions.size(); }
float GetProgress() const;
private:
void ExecuteAction(const Action& action);
void SimulateTap(int x, int y);
void SimulateSwipe(int x1, int y1, int x2, int y2, int duration_ms);
void SimulateLongPress(int x, int y, int duration_ms);
void SimulateButton(const std::string& button);
Rml::Context* m_context;
ActionSequence m_sequence;
bool m_playing = false;
bool m_paused = false;
bool m_finished = false;
size_t m_current_index = 0;
std::chrono::steady_clock::time_point m_start_time;
std::chrono::steady_clock::time_point m_pause_time;
int64_t m_paused_duration_ms = 0;
int64_t m_min_finish_time_ms = 0; // Extended by wait actions
ScreenshotCallback m_screenshot_cb;
NavigateCallback m_navigate_cb;
};
} // namespace mosis::testing