feat: add play mode pause resume and step controls

This commit is contained in:
2026-04-02 19:56:07 +08:00
parent fb15d60be9
commit 1f29dfd611
11 changed files with 270 additions and 3 deletions

View File

@@ -284,6 +284,65 @@ TEST_F(EditorActionRoutingTest, MainMenuRouterRequestsExitResetAndAboutPopup) {
m_context.GetEventBus().Unsubscribe<DockLayoutResetRequestedEvent>(resetSubscription);
}
TEST_F(EditorActionRoutingTest, MainMenuRouterRequestsPlayPauseResumeAndStepEvents) {
int playStartRequestCount = 0;
int playStopRequestCount = 0;
int playPauseRequestCount = 0;
int playResumeRequestCount = 0;
int playStepRequestCount = 0;
const uint64_t playStartSubscription = m_context.GetEventBus().Subscribe<PlayModeStartRequestedEvent>(
[&](const PlayModeStartRequestedEvent&) {
++playStartRequestCount;
});
const uint64_t playStopSubscription = m_context.GetEventBus().Subscribe<PlayModeStopRequestedEvent>(
[&](const PlayModeStopRequestedEvent&) {
++playStopRequestCount;
});
const uint64_t playPauseSubscription = m_context.GetEventBus().Subscribe<PlayModePauseRequestedEvent>(
[&](const PlayModePauseRequestedEvent&) {
++playPauseRequestCount;
});
const uint64_t playResumeSubscription = m_context.GetEventBus().Subscribe<PlayModeResumeRequestedEvent>(
[&](const PlayModeResumeRequestedEvent&) {
++playResumeRequestCount;
});
const uint64_t playStepSubscription = m_context.GetEventBus().Subscribe<PlayModeStepRequestedEvent>(
[&](const PlayModeStepRequestedEvent&) {
++playStepRequestCount;
});
Actions::RequestTogglePlayMode(m_context);
EXPECT_EQ(playStartRequestCount, 1);
EXPECT_EQ(playStopRequestCount, 0);
m_context.SetRuntimeMode(EditorRuntimeMode::Play);
Actions::RequestTogglePauseMode(m_context);
EXPECT_EQ(playPauseRequestCount, 1);
EXPECT_EQ(playResumeRequestCount, 0);
Actions::RequestStepPlayMode(m_context);
EXPECT_EQ(playStepRequestCount, 0);
m_context.SetRuntimeMode(EditorRuntimeMode::Paused);
Actions::RequestTogglePauseMode(m_context);
EXPECT_EQ(playResumeRequestCount, 1);
Actions::RequestStepPlayMode(m_context);
EXPECT_EQ(playStepRequestCount, 1);
Actions::RequestTogglePlayMode(m_context);
EXPECT_EQ(playStopRequestCount, 1);
m_context.SetRuntimeMode(EditorRuntimeMode::Edit);
Actions::RequestStepPlayMode(m_context);
EXPECT_EQ(playStepRequestCount, 1);
m_context.GetEventBus().Unsubscribe<PlayModeStartRequestedEvent>(playStartSubscription);
m_context.GetEventBus().Unsubscribe<PlayModeStopRequestedEvent>(playStopSubscription);
m_context.GetEventBus().Unsubscribe<PlayModePauseRequestedEvent>(playPauseSubscription);
m_context.GetEventBus().Unsubscribe<PlayModeResumeRequestedEvent>(playResumeSubscription);
m_context.GetEventBus().Unsubscribe<PlayModeStepRequestedEvent>(playStepSubscription);
}
TEST_F(EditorActionRoutingTest, PlayModeAllowsRuntimeSceneUndoRedoButKeepsSceneDocumentCommandsBlocked) {
const fs::path savedScenePath = m_projectRoot / "Assets" / "Scenes" / "PlayModeRuntimeEditing.xc";
ASSERT_TRUE(m_context.GetSceneManager().SaveSceneAs(savedScenePath.string()));