Files
XCEngine/new_editor/app/Features/Inspector/InspectorPanel.h

97 lines
4.1 KiB
C++

#pragma once
#include "Features/Inspector/InspectorPresentationModel.h"
#include "Features/Inspector/InspectorSubject.h"
#include "Commands/EditorEditCommandRoute.h"
#include <XCEditor/Collections/UIEditorScrollViewInteraction.h>
#include <XCEditor/Fields/UIEditorPropertyGridInteraction.h>
#include <XCEditor/Panels/UIEditorHostedPanelDispatch.h>
#include <XCEngine/UI/DrawData.h>
#include <XCEngine/UI/Widgets/UIExpansionModel.h>
#include <XCEngine/UI/Widgets/UIPropertyEditModel.h>
#include <XCEngine/UI/Widgets/UISelectionModel.h>
#include <cstdint>
#include <string>
#include <unordered_set>
#include <vector>
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<std::string> 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;
bool m_addComponentButtonHovered = false;
bool m_addComponentButtonPressed = false;
};
} // namespace XCEngine::UI::Editor::App