#include "EditorHostCommandBridge.h" #include #include namespace XCEngine::UI::Editor::App { void EditorHostCommandBridge::BindSession(EditorSession& session) { m_session = &session; } void EditorHostCommandBridge::BindEditCommandRoutes( EditorEditCommandRoute* hierarchyRoute, EditorEditCommandRoute* projectRoute) { m_hierarchyRoute = hierarchyRoute; m_projectRoute = projectRoute; } void EditorHostCommandBridge::SetExitRequestHandler(std::function handler) { m_requestExit = std::move(handler); } UIEditorHostCommandEvaluationResult EditorHostCommandBridge::EvaluateHostCommand( std::string_view commandId) const { if (commandId == "file.exit") { return BuildExecutableResult("Exit editor."); } if (commandId == "help.about") { return BuildDisabledResult("About dialog is unavailable in the current shell."); } if (commandId.rfind("edit.", 0u) == 0u) { return EvaluateEditCommand(commandId); } return EvaluateUnsupportedHostCommand(commandId); } UIEditorHostCommandDispatchResult EditorHostCommandBridge::DispatchHostCommand( std::string_view commandId) { UIEditorHostCommandDispatchResult result = {}; if (commandId == "file.exit") { result.commandExecuted = true; result.message = "Exit requested."; if (m_requestExit) { m_requestExit(); } return result; } if (commandId == "help.about") { result.message = EvaluateHostCommand(commandId).message; return result; } if (commandId.rfind("edit.", 0u) == 0u) { return DispatchEditCommand(commandId); } result.message = EvaluateHostCommand(commandId).message; return result; } UIEditorHostCommandEvaluationResult EditorHostCommandBridge::BuildDisabledResult( std::string_view message) const { UIEditorHostCommandEvaluationResult result = {}; result.executable = false; result.message = std::string(message); return result; } UIEditorHostCommandEvaluationResult EditorHostCommandBridge::BuildExecutableResult( std::string_view message) const { UIEditorHostCommandEvaluationResult result = {}; result.executable = true; result.message = std::string(message); return result; } UIEditorHostCommandEvaluationResult EditorHostCommandBridge::EvaluateFileCommand( std::string_view commandId) const { if (commandId == "file.exit") { return BuildExecutableResult("Exit editor."); } return BuildDisabledResult( "Only file.exit has a bound host owner in the current shell."); } UIEditorHostCommandEvaluationResult EditorHostCommandBridge::EvaluateAssetCommand( std::string_view commandId) const { (void)commandId; return BuildDisabledResult( "Asset commands have no bound Project/AssetDatabase owner in the current shell."); } UIEditorHostCommandEvaluationResult EditorHostCommandBridge::EvaluateRunCommand( std::string_view commandId) const { (void)commandId; return BuildDisabledResult( "Run commands have no bound play-mode owner in the current shell."); } UIEditorHostCommandEvaluationResult EditorHostCommandBridge::EvaluateScriptCommand( std::string_view commandId) const { (void)commandId; return BuildDisabledResult( "Script commands have no bound script-pipeline owner in the current shell."); } UIEditorHostCommandEvaluationResult EditorHostCommandBridge::EvaluateEditCommand( std::string_view commandId) const { if (m_session == nullptr) { return BuildDisabledResult("Editor session is unavailable."); } if (m_session->activeRoute == EditorActionRoute::None) { return BuildDisabledResult("No active edit route."); } EditorEditCommandRoute* route = ResolveEditCommandRoute(m_session->activeRoute); if (route == nullptr) { switch (m_session->activeRoute) { case EditorActionRoute::Hierarchy: return BuildDisabledResult("Hierarchy command route is unavailable in the current window."); case EditorActionRoute::Project: return BuildDisabledResult("Project command route is unavailable in the current window."); case EditorActionRoute::Inspector: return BuildDisabledResult("Inspector does not expose edit commands yet."); case EditorActionRoute::Console: return BuildDisabledResult("Console does not expose edit commands yet."); case EditorActionRoute::Scene: case EditorActionRoute::Game: return BuildDisabledResult("Viewport panels do not expose edit commands yet."); case EditorActionRoute::None: default: return BuildDisabledResult("Current panel does not expose edit commands."); } } return route->EvaluateEditCommand(commandId); } UIEditorHostCommandDispatchResult EditorHostCommandBridge::DispatchEditCommand( std::string_view commandId) { UIEditorHostCommandDispatchResult result = {}; const UIEditorHostCommandEvaluationResult evaluation = EvaluateEditCommand(commandId); if (!evaluation.executable) { result.message = evaluation.message; return result; } EditorEditCommandRoute* route = ResolveEditCommandRoute(m_session != nullptr ? m_session->activeRoute : EditorActionRoute::None); if (route == nullptr) { result.message = "Edit command route is unavailable."; return result; } return route->DispatchEditCommand(commandId); } UIEditorHostCommandEvaluationResult EditorHostCommandBridge::EvaluateUnsupportedHostCommand( std::string_view commandId) const { if (commandId.rfind("file.", 0u) == 0u) { return EvaluateFileCommand(commandId); } if (commandId.rfind("assets.", 0u) == 0u) { return EvaluateAssetCommand(commandId); } if (commandId.rfind("run.", 0u) == 0u) { return EvaluateRunCommand(commandId); } if (commandId.rfind("scripts.", 0u) == 0u) { return EvaluateScriptCommand(commandId); } return BuildDisabledResult("Host command has no owner in the current shell."); } EditorEditCommandRoute* EditorHostCommandBridge::ResolveEditCommandRoute( EditorActionRoute route) const { switch (route) { case EditorActionRoute::Hierarchy: return m_hierarchyRoute; case EditorActionRoute::Project: return m_projectRoute; default: return nullptr; } } } // namespace XCEngine::UI::Editor::App