feat: add runtime play tick and play-mode scene editing semantics
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user