feat: add runtime play tick and play-mode scene editing semantics

This commit is contained in:
2026-04-02 19:37:35 +08:00
parent e30f5d5ffa
commit fb15d60be9
28 changed files with 2016 additions and 45 deletions

View File

@@ -16,48 +16,60 @@ namespace XCEngine {
namespace Editor {
namespace Actions {
inline ActionBinding MakeNewProjectAction() {
return MakeAction("New Project...");
inline ActionBinding MakeNewProjectAction(bool enabled = true) {
return MakeAction("New Project...", nullptr, false, enabled);
}
inline ActionBinding MakeOpenProjectAction() {
return MakeAction("Open Project...");
inline ActionBinding MakeOpenProjectAction(bool enabled = true) {
return MakeAction("Open Project...", nullptr, false, enabled);
}
inline ActionBinding MakeSaveProjectAction() {
return MakeAction("Save Project");
inline ActionBinding MakeSaveProjectAction(bool enabled = true) {
return MakeAction("Save Project", nullptr, false, enabled);
}
inline ActionBinding MakeNewSceneAction() {
return MakeAction("New Scene", "Ctrl+N", false, true, true, Shortcut(ImGuiKey_N, true));
inline ActionBinding MakeNewSceneAction(bool enabled = true) {
return MakeAction("New Scene", "Ctrl+N", false, enabled, true, Shortcut(ImGuiKey_N, true));
}
inline ActionBinding MakeOpenSceneAction() {
return MakeAction("Open Scene", "Ctrl+O", false, true, true, Shortcut(ImGuiKey_O, true));
inline ActionBinding MakeOpenSceneAction(bool enabled = true) {
return MakeAction("Open Scene", "Ctrl+O", false, enabled, true, Shortcut(ImGuiKey_O, true));
}
inline ActionBinding MakeSaveSceneAction() {
return MakeAction("Save Scene", "Ctrl+S", false, true, true, Shortcut(ImGuiKey_S, true));
inline ActionBinding MakeSaveSceneAction(bool enabled = true) {
return MakeAction("Save Scene", "Ctrl+S", false, enabled, true, Shortcut(ImGuiKey_S, true));
}
inline ActionBinding MakeSaveSceneAsAction() {
return MakeAction("Save Scene As...", "Ctrl+Shift+S", false, true, true, Shortcut(ImGuiKey_S, true, true));
inline ActionBinding MakeSaveSceneAsAction(bool enabled = true) {
return MakeAction(
"Save Scene As...",
"Ctrl+Shift+S",
false,
enabled,
true,
Shortcut(ImGuiKey_S, true, true));
}
inline ActionBinding MakeUndoAction(IEditorContext& context) {
auto& undoManager = context.GetUndoManager();
const bool enabled =
IsEditorSceneUndoRedoAllowed(context.GetRuntimeMode()) &&
undoManager.CanUndo();
const std::string label = undoManager.CanUndo() ? "Undo " + undoManager.GetUndoLabel() : "Undo";
return MakeAction(label, "Ctrl+Z", false, undoManager.CanUndo(), false, Shortcut(ImGuiKey_Z, true));
return MakeAction(label, "Ctrl+Z", false, enabled, false, Shortcut(ImGuiKey_Z, true));
}
inline ActionBinding MakeRedoAction(IEditorContext& context) {
auto& undoManager = context.GetUndoManager();
const bool enabled =
IsEditorSceneUndoRedoAllowed(context.GetRuntimeMode()) &&
undoManager.CanRedo();
const std::string label = undoManager.CanRedo() ? "Redo " + undoManager.GetRedoLabel() : "Redo";
return MakeAction(
label,
"Ctrl+Y",
false,
undoManager.CanRedo(),
enabled,
false,
Shortcut(ImGuiKey_Y, true),
Shortcut(ImGuiKey_Z, true, true));
@@ -125,10 +137,22 @@ inline ActionBinding MakeCreateSphereEntityAction() {
return MakeAction("Sphere");
}
inline ActionBinding MakeCreateCapsuleEntityAction() {
return MakeAction("Capsule");
}
inline ActionBinding MakeCreateCylinderEntityAction() {
return MakeAction("Cylinder");
}
inline ActionBinding MakeCreatePlaneEntityAction() {
return MakeAction("Plane");
}
inline ActionBinding MakeCreateQuadEntityAction() {
return MakeAction("Quad");
}
inline ActionBinding MakeResetLayoutAction() {
return MakeAction("Reset Layout");
}
@@ -141,6 +165,17 @@ inline ActionBinding MakeExitAction() {
return MakeAction("Exit", "Alt+F4");
}
inline ActionBinding MakeTogglePlayModeAction(EditorRuntimeMode mode, bool enabled = true) {
const bool active = IsEditorRuntimeActive(mode);
return MakeAction(
active ? "Stop" : "Play",
"F5",
active,
enabled,
false,
Shortcut(ImGuiKey_F5));
}
inline ActionBinding MakeNavigateBackAction(bool enabled) {
return MakeAction("<", "Alt+Left", false, enabled, false, Shortcut(ImGuiKey_LeftArrow, false, false, true));
}

View File

@@ -14,6 +14,10 @@ namespace XCEngine {
namespace Editor {
namespace Actions {
inline bool IsDocumentEditingAllowed(const IEditorContext& context) {
return IsEditorDocumentEditingAllowed(context.GetRuntimeMode());
}
inline void ExecuteNewScene(IEditorContext& context) {
Commands::NewScene(context);
}
@@ -58,33 +62,53 @@ inline void RequestDockLayoutReset(IEditorContext& context) {
context.GetEventBus().Publish(DockLayoutResetRequestedEvent{});
}
inline void RequestTogglePlayMode(IEditorContext& context) {
if (context.GetRuntimeMode() == EditorRuntimeMode::Edit) {
context.GetEventBus().Publish(PlayModeStartRequestedEvent{});
return;
}
context.GetEventBus().Publish(PlayModeStopRequestedEvent{});
}
inline void RequestAboutPopup(UI::DeferredPopupState& aboutPopup) {
aboutPopup.RequestOpen();
}
inline void HandleMainMenuShortcuts(IEditorContext& context, const ShortcutContext& shortcutContext) {
HandleShortcut(MakeNewSceneAction(), shortcutContext, [&]() { ExecuteNewScene(context); });
HandleShortcut(MakeOpenSceneAction(), shortcutContext, [&]() { ExecuteOpenScene(context); });
HandleShortcut(MakeSaveSceneAction(), shortcutContext, [&]() { ExecuteSaveScene(context); });
HandleShortcut(MakeSaveSceneAsAction(), shortcutContext, [&]() { ExecuteSaveSceneAs(context); });
const bool canEditDocuments = IsDocumentEditingAllowed(context);
HandleShortcut(MakeTogglePlayModeAction(context.GetRuntimeMode()), shortcutContext, [&]() {
RequestTogglePlayMode(context);
});
HandleShortcut(MakeNewSceneAction(canEditDocuments), shortcutContext, [&]() { ExecuteNewScene(context); });
HandleShortcut(MakeOpenSceneAction(canEditDocuments), shortcutContext, [&]() { ExecuteOpenScene(context); });
HandleShortcut(MakeSaveSceneAction(canEditDocuments), shortcutContext, [&]() { ExecuteSaveScene(context); });
HandleShortcut(MakeSaveSceneAsAction(canEditDocuments), shortcutContext, [&]() { ExecuteSaveSceneAs(context); });
HandleShortcut(MakeUndoAction(context), shortcutContext, [&]() { ExecuteUndo(context); });
HandleShortcut(MakeRedoAction(context), shortcutContext, [&]() { ExecuteRedo(context); });
HandleEditShortcuts(context, shortcutContext);
}
inline void DrawFileMenuActions(IEditorContext& context) {
DrawMenuAction(MakeNewProjectAction(), [&]() { ExecuteNewProject(context); });
DrawMenuAction(MakeOpenProjectAction(), [&]() { ExecuteOpenProject(context); });
DrawMenuAction(MakeSaveProjectAction(), [&]() { ExecuteSaveProject(context); });
const bool canEditDocuments = IsDocumentEditingAllowed(context);
DrawMenuAction(MakeNewProjectAction(canEditDocuments), [&]() { ExecuteNewProject(context); });
DrawMenuAction(MakeOpenProjectAction(canEditDocuments), [&]() { ExecuteOpenProject(context); });
DrawMenuAction(MakeSaveProjectAction(canEditDocuments), [&]() { ExecuteSaveProject(context); });
DrawMenuSeparator();
DrawMenuAction(MakeNewSceneAction(), [&]() { ExecuteNewScene(context); });
DrawMenuAction(MakeOpenSceneAction(), [&]() { ExecuteOpenScene(context); });
DrawMenuAction(MakeSaveSceneAction(), [&]() { ExecuteSaveScene(context); });
DrawMenuAction(MakeSaveSceneAsAction(), [&]() { ExecuteSaveSceneAs(context); });
DrawMenuAction(MakeNewSceneAction(canEditDocuments), [&]() { ExecuteNewScene(context); });
DrawMenuAction(MakeOpenSceneAction(canEditDocuments), [&]() { ExecuteOpenScene(context); });
DrawMenuAction(MakeSaveSceneAction(canEditDocuments), [&]() { ExecuteSaveScene(context); });
DrawMenuAction(MakeSaveSceneAsAction(canEditDocuments), [&]() { ExecuteSaveSceneAs(context); });
DrawMenuSeparator();
DrawMenuAction(MakeExitAction(), [&]() { RequestEditorExit(context); });
}
inline void DrawRunMenuActions(IEditorContext& context) {
DrawMenuAction(MakeTogglePlayModeAction(context.GetRuntimeMode()), [&]() {
RequestTogglePlayMode(context);
});
}
inline void DrawViewMenuActions(IEditorContext& context) {
DrawMenuAction(MakeResetLayoutAction(), [&]() { RequestDockLayoutReset(context); });
}
@@ -108,6 +132,9 @@ inline void DrawMainMenuBar(IEditorContext& context, UI::DeferredPopupState& abo
UI::DrawMenuScope("Edit", [&]() {
DrawEditActions(context);
});
UI::DrawMenuScope("Run", [&]() {
DrawRunMenuActions(context);
});
UI::DrawMenuScope("View", [&]() {
DrawViewMenuActions(context);
});