#pragma once #include "Scene/EditorSceneBackend.h" #include "UtilityWindows/EditorUtilityWindowRuntime.h" #include #include #include namespace XCEngine::UI::Editor::App { class EditorSceneRuntime; class AddComponentPanel final : public EditorUtilityWindowPanel { public: explicit AddComponentPanel(EditorSceneRuntime& sceneRuntime) : m_sceneRuntime(sceneRuntime) {} std::string_view GetDrawListId() const override { return "XCEditorUtility.AddComponent"; } void ResetInteractionState() override; void Update( const EditorUtilityWindowHostContext& hostContext, const std::vector<::XCEngine::UI::UIInputEvent>& inputEvents) override; void Append(::XCEngine::UI::UIDrawList& drawList) const override; private: struct EntryPresentation { std::string componentTypeName = {}; std::string displayName = {}; std::string disabledReason = {}; ::XCEngine::UI::UIRect rect = {}; bool enabled = false; }; void ResetPanelState(); void RebuildEntries(const EditorSceneObjectSnapshot* gameObject); bool TryActivateEntry(std::size_t entryIndex); std::size_t HitTestEntry(const ::XCEngine::UI::UIPoint& point) const; EditorSceneRuntime& m_sceneRuntime; bool m_visible = false; bool m_hasTarget = false; ::XCEngine::UI::UIRect m_bounds = {}; std::string m_targetDisplayName = {}; std::vector m_entries = {}; std::size_t m_hoveredEntryIndex = static_cast(-1); std::size_t m_pressedEntryIndex = static_cast(-1); }; } // namespace XCEngine::UI::Editor::App