#pragma once #include "Features/Inspector/InspectorPresentationModel.h" #include "Features/Inspector/InspectorSubject.h" #include "Commands/EditorEditCommandRoute.h" #include #include #include #include #include #include #include #include #include #include #include #include namespace XCEngine::UI::Editor::App { class EditorCommandFocusService; class EditorContext; class EditorSceneRuntime; class InspectorPanel final : public EditorEditCommandRoute { public: void SetCommandFocusService(EditorCommandFocusService* commandFocusService); void Update( EditorContext& context, const UIEditorHostedPanelDispatchEntry& dispatchEntry, const std::vector<::XCEngine::UI::UIInputEvent>& inputEvents); void Append(::XCEngine::UI::UIDrawList& drawList) const; UIEditorHostCommandEvaluationResult EvaluateEditCommand( std::string_view commandId) const override; UIEditorHostCommandDispatchResult DispatchEditCommand( std::string_view commandId) override; private: void ResetPanelState(); void ResetInteractionState(); bool HasActivePointerCapture() const; void SyncExpansionState(bool subjectChanged); void SyncSelectionState(); std::string BuildSubjectKey() const; float ResolveHeaderHeight() const; bool ShouldShowAddComponentButton() const; ::XCEngine::UI::UIRect BuildScrollViewportBounds() const; ::XCEngine::UI::UIRect BuildAddComponentButtonRect( const Widgets::UIEditorPropertyGridLayout& gridLayout, const ::XCEngine::UI::UIRect& contentBounds) const; float MeasureScrollableContentHeight( const ::XCEngine::UI::UIRect& contentBounds) const; void RebuildScrollableLayout(); const InspectorPresentationComponentBinding* FindSelectedComponentBinding() const; const Widgets::UIEditorPropertyGridField* FindField(std::string_view fieldId) const; Widgets::UIEditorPropertyGridField* FindMutableField(std::string_view fieldId); void CapturePresentationStamps(const EditorContext& context); void RebuildPresentation(EditorContext& context, bool subjectChanged); void RefreshPresentation(EditorContext& context, bool subjectChanged); void ForceResyncPresentation(EditorContext& context); bool ApplyColorPickerToolValue(EditorContext& context); void RequestColorPicker(EditorContext& context, std::string_view fieldId); void ResetAddComponentButtonState(); void UpdateAddComponentButton( EditorContext& context, const std::vector<::XCEngine::UI::UIInputEvent>& inputEvents); bool ApplyChangedField(std::string_view fieldId); EditorCommandFocusService* m_commandFocusService = nullptr; EditorSceneRuntime* m_sceneRuntime = nullptr; bool m_visible = false; ::XCEngine::UI::UIRect m_bounds = {}; InspectorSubject m_subject = {}; std::string m_subjectKey = {}; InspectorPresentationModel m_presentation = {}; ::XCEngine::UI::Widgets::UISelectionModel m_fieldSelection = {}; ::XCEngine::UI::Widgets::UIExpansionModel m_sectionExpansion = {}; ::XCEngine::UI::Widgets::UIPropertyEditModel m_propertyEditModel = {}; UIEditorScrollViewInteractionState m_scrollInteractionState = {}; UIEditorScrollViewInteractionFrame m_scrollFrame = {}; float m_scrollVerticalOffset = 0.0f; UIEditorPropertyGridInteractionState m_interactionState = {}; UIEditorPropertyGridInteractionFrame m_gridFrame = {}; std::unordered_set m_knownSectionIds = {}; std::uint64_t m_lastSceneSelectionStamp = 0u; std::uint64_t m_lastProjectSelectionStamp = 0u; std::uint64_t m_lastSceneInspectorRevision = 0u; std::uint64_t m_lastAppliedColorPickerRevision = 0u; const ::XCEngine::UI::Editor::UIEditorTextMeasurer* m_textMeasurer = nullptr; bool m_addComponentButtonHovered = false; bool m_addComponentButtonPressed = false; }; } // namespace XCEngine::UI::Editor::App