feat: expand editor scripting asset and viewport flow

This commit is contained in:
2026-04-03 13:22:30 +08:00
parent ed8c27fde2
commit a05d0b80a2
124 changed files with 10397 additions and 1737 deletions

View File

@@ -28,6 +28,14 @@ inline ActionBinding MakeSaveProjectAction(bool enabled = true) {
return MakeAction("Save Project", nullptr, false, enabled);
}
inline ActionBinding MakeRebuildScriptsAction(bool enabled = true) {
return MakeAction("Rebuild Script Assemblies", nullptr, false, enabled);
}
inline ActionBinding MakeMigrateSceneAssetReferencesAction(bool enabled = true) {
return MakeAction("Migrate Scene AssetRefs", nullptr, false, enabled);
}
inline ActionBinding MakeNewSceneAction(bool enabled = true) {
return MakeAction("New Scene", "Ctrl+N", false, enabled, true, Shortcut(ImGuiKey_N, true));
}

View File

@@ -168,6 +168,19 @@ inline void DrawHierarchySortOptionsPopup(
}
inline void DrawHierarchyCreateActions(IEditorContext& context, ::XCEngine::Components::GameObject* parent) {
const auto drawPrimitiveCreateAction = [&](
const ActionBinding& action,
::XCEngine::Resources::BuiltinPrimitiveType primitiveType) {
const char* label = ::XCEngine::Resources::GetBuiltinPrimitiveDisplayName(primitiveType);
DrawMenuAction(action, [&]() {
TraceHierarchyPopup(std::string("Hierarchy create clicked: ") + label);
auto* created = Commands::CreatePrimitiveEntity(context, primitiveType, parent);
TraceHierarchyPopup(
std::string("Hierarchy create result: ") + label + ", createdId=" +
std::to_string(created ? created->GetID() : 0));
});
};
DrawMenuAction(MakeCreateEmptyEntityAction(), [&]() {
TraceHierarchyPopup("Hierarchy create clicked: Empty Object");
auto* created = Commands::CreateEmptyEntity(context, parent, "Create Entity", "GameObject");
@@ -175,6 +188,16 @@ inline void DrawHierarchyCreateActions(IEditorContext& context, ::XCEngine::Comp
std::string("Hierarchy create result: Empty Object, createdId=") +
std::to_string(created ? created->GetID() : 0));
});
UI::DrawContextSubmenu("3D Object", [&]() {
drawPrimitiveCreateAction(MakeCreateCubeEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Cube);
drawPrimitiveCreateAction(MakeCreateSphereEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Sphere);
drawPrimitiveCreateAction(MakeCreateCapsuleEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Capsule);
drawPrimitiveCreateAction(MakeCreateCylinderEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Cylinder);
drawPrimitiveCreateAction(MakeCreatePlaneEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Plane);
drawPrimitiveCreateAction(MakeCreateQuadEntityAction(), ::XCEngine::Resources::BuiltinPrimitiveType::Quad);
});
DrawMenuSeparator();
DrawMenuAction(MakeCreateCameraEntityAction(), [&]() {
TraceHierarchyPopup("Hierarchy create clicked: Camera");
@@ -190,28 +213,6 @@ inline void DrawHierarchyCreateActions(IEditorContext& context, ::XCEngine::Comp
std::string("Hierarchy create result: Light, createdId=") +
std::to_string(created ? created->GetID() : 0));
});
DrawMenuSeparator();
DrawMenuAction(MakeCreateCubeEntityAction(), [&]() {
TraceHierarchyPopup("Hierarchy create clicked: Cube");
auto* created = Commands::CreateEmptyEntity(context, parent, "Create Cube", "Cube");
TraceHierarchyPopup(
std::string("Hierarchy create result: Cube, createdId=") +
std::to_string(created ? created->GetID() : 0));
});
DrawMenuAction(MakeCreateSphereEntityAction(), [&]() {
TraceHierarchyPopup("Hierarchy create clicked: Sphere");
auto* created = Commands::CreateEmptyEntity(context, parent, "Create Sphere", "Sphere");
TraceHierarchyPopup(
std::string("Hierarchy create result: Sphere, createdId=") +
std::to_string(created ? created->GetID() : 0));
});
DrawMenuAction(MakeCreatePlaneEntityAction(), [&]() {
TraceHierarchyPopup("Hierarchy create clicked: Plane");
auto* created = Commands::CreateEmptyEntity(context, parent, "Create Plane", "Plane");
TraceHierarchyPopup(
std::string("Hierarchy create result: Plane, createdId=") +
std::to_string(created ? created->GetID() : 0));
});
}
inline void HandleHierarchyItemContextRequest(
@@ -275,7 +276,7 @@ inline void DrawHierarchyBackgroundContextPopup(IEditorContext& context, UI::Def
backgroundContextMenu.ConsumeOpenRequest("HierarchyContextMenu");
static bool s_lastBackgroundPopupOpen = false;
if (!UI::BeginPopup("HierarchyContextMenu")) {
if (!UI::BeginContextMenu("HierarchyContextMenu")) {
if (s_lastBackgroundPopupOpen) {
TraceHierarchyPopup("Hierarchy background popup closed");
s_lastBackgroundPopupOpen = false;
@@ -289,7 +290,7 @@ inline void DrawHierarchyBackgroundContextPopup(IEditorContext& context, UI::Def
}
DrawHierarchyContextActions(context, nullptr, true);
UI::EndPopup();
UI::EndContextMenu();
}
inline void DrawHierarchyEntityContextPopup(
@@ -298,7 +299,7 @@ inline void DrawHierarchyEntityContextPopup(
itemContextMenu.ConsumeOpenRequest("HierarchyEntityContextMenu");
static bool s_lastEntityPopupOpen = false;
if (!UI::BeginPopup("HierarchyEntityContextMenu")) {
if (!UI::BeginContextMenu("HierarchyEntityContextMenu")) {
if (s_lastEntityPopupOpen) {
TraceHierarchyPopup("Hierarchy entity popup closed");
s_lastEntityPopupOpen = false;
@@ -314,7 +315,7 @@ inline void DrawHierarchyEntityContextPopup(
if (itemContextMenu.HasTarget()) {
DrawHierarchyContextActions(context, itemContextMenu.TargetValue());
}
UI::EndPopup();
UI::EndContextMenu();
if (!ImGui::IsPopupOpen("HierarchyEntityContextMenu") && !itemContextMenu.HasPendingOpenRequest()) {
itemContextMenu.Clear();

View File

@@ -34,6 +34,14 @@ inline void ExecuteSaveProject(IEditorContext& context) {
Commands::SaveProject(context);
}
inline void ExecuteRebuildScriptAssemblies(IEditorContext& context) {
Commands::RebuildScriptAssemblies(context);
}
inline void ExecuteMigrateSceneAssetReferences(IEditorContext& context) {
Commands::MigrateSceneAssetReferences(context);
}
inline void ExecuteOpenScene(IEditorContext& context) {
Commands::OpenSceneWithDialog(context);
}
@@ -143,6 +151,10 @@ inline void DrawFileMenuActions(IEditorContext& context) {
DrawMenuAction(MakeSaveSceneAction(canEditDocuments), [&]() { ExecuteSaveScene(context); });
DrawMenuAction(MakeSaveSceneAsAction(canEditDocuments), [&]() { ExecuteSaveSceneAs(context); });
DrawMenuSeparator();
DrawMenuAction(
MakeMigrateSceneAssetReferencesAction(Commands::CanMigrateSceneAssetReferences(context)),
[&]() { ExecuteMigrateSceneAssetReferences(context); });
DrawMenuSeparator();
DrawMenuAction(MakeExitAction(), [&]() { RequestEditorExit(context); });
}
@@ -160,6 +172,12 @@ inline void DrawRunMenuActions(IEditorContext& context) {
});
}
inline void DrawScriptsMenuActions(IEditorContext& context) {
DrawMenuAction(
MakeRebuildScriptsAction(Commands::CanRebuildScriptAssemblies(context)),
[&]() { ExecuteRebuildScriptAssemblies(context); });
}
inline void DrawViewMenuActions(IEditorContext& context) {
DrawMenuAction(MakeResetLayoutAction(), [&]() { RequestDockLayoutReset(context); });
}
@@ -186,6 +204,9 @@ inline void DrawMainMenuBar(IEditorContext& context, UI::DeferredPopupState& abo
UI::DrawMenuScope("Run", [&]() {
DrawRunMenuActions(context);
});
UI::DrawMenuScope("Scripts", [&]() {
DrawScriptsMenuActions(context);
});
UI::DrawMenuScope("View", [&]() {
DrawViewMenuActions(context);
});