#pragma once #include #include #include #include #include namespace XCEngine::UI::Editor::Widgets { enum class UIEditorEnumFieldHitTargetKind : std::uint8_t { None = 0, Row, ValueBox, DropdownArrow }; struct UIEditorEnumFieldSpec { std::string fieldId = {}; std::string label = {}; std::vector options = {}; std::size_t selectedIndex = 0u; bool readOnly = false; }; struct UIEditorEnumFieldState { UIEditorEnumFieldHitTargetKind hoveredTarget = UIEditorEnumFieldHitTargetKind::None; bool focused = false; bool active = false; bool popupOpen = false; }; struct UIEditorEnumFieldMetrics { float rowHeight = 22.0f; float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; float controlTrailingInset = 8.0f; float valueBoxMinWidth = 96.0f; float controlInsetY = 1.0f; float labelTextInsetY = 0.0f; float labelFontSize = 11.0f; float valueTextInsetX = 3.0f; float valueTextInsetY = 0.0f; float valueFontSize = 12.0f; float dropdownArrowWidth = 20.0f; float dropdownArrowInsetX = 0.0f; float dropdownArrowInsetY = -1.0f; float dropdownArrowFontSize = 10.0f; float cornerRounding = 0.0f; float valueBoxRounding = 2.0f; float borderThickness = 1.0f; float focusedBorderThickness = 1.0f; }; struct UIEditorEnumFieldPalette { ::XCEngine::UI::UIColor surfaceColor = ::XCEngine::UI::UIColor(0.0f, 0.0f, 0.0f, 0.0f); ::XCEngine::UI::UIColor borderColor = ::XCEngine::UI::UIColor(0.0f, 0.0f, 0.0f, 0.0f); ::XCEngine::UI::UIColor focusedBorderColor = ::XCEngine::UI::UIColor(0.14f, 0.14f, 0.14f, 1.0f); ::XCEngine::UI::UIColor rowHoverColor = ::XCEngine::UI::UIColor(0.0f, 0.0f, 0.0f, 0.0f); ::XCEngine::UI::UIColor rowActiveColor = ::XCEngine::UI::UIColor(0.0f, 0.0f, 0.0f, 0.0f); ::XCEngine::UI::UIColor valueBoxColor = ::XCEngine::UI::UIColor(0.18f, 0.18f, 0.18f, 1.0f); ::XCEngine::UI::UIColor valueBoxHoverColor = ::XCEngine::UI::UIColor(0.21f, 0.21f, 0.21f, 1.0f); ::XCEngine::UI::UIColor readOnlyColor = ::XCEngine::UI::UIColor(0.17f, 0.17f, 0.17f, 1.0f); ::XCEngine::UI::UIColor controlBorderColor = ::XCEngine::UI::UIColor(0.14f, 0.14f, 0.14f, 1.0f); ::XCEngine::UI::UIColor labelColor = ::XCEngine::UI::UIColor(0.88f, 0.88f, 0.88f, 1.0f); ::XCEngine::UI::UIColor valueColor = ::XCEngine::UI::UIColor(0.88f, 0.88f, 0.88f, 1.0f); ::XCEngine::UI::UIColor arrowColor = ::XCEngine::UI::UIColor(0.88f, 0.88f, 0.88f, 1.0f); }; struct UIEditorEnumFieldLayout { ::XCEngine::UI::UIRect bounds = {}; ::XCEngine::UI::UIRect labelRect = {}; ::XCEngine::UI::UIRect controlRect = {}; ::XCEngine::UI::UIRect valueRect = {}; ::XCEngine::UI::UIRect arrowRect = {}; }; struct UIEditorEnumFieldHitTarget { UIEditorEnumFieldHitTargetKind kind = UIEditorEnumFieldHitTargetKind::None; }; std::string ResolveUIEditorEnumFieldValueText(const UIEditorEnumFieldSpec& spec); UIEditorEnumFieldLayout BuildUIEditorEnumFieldLayout( const ::XCEngine::UI::UIRect& bounds, const UIEditorEnumFieldSpec& spec, const UIEditorEnumFieldMetrics& metrics = {}); UIEditorEnumFieldHitTarget HitTestUIEditorEnumField( const UIEditorEnumFieldLayout& layout, const ::XCEngine::UI::UIPoint& point); void AppendUIEditorEnumFieldBackground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorEnumFieldLayout& layout, const UIEditorEnumFieldSpec& spec, const UIEditorEnumFieldState& state, const UIEditorEnumFieldPalette& palette = {}, const UIEditorEnumFieldMetrics& metrics = {}); void AppendUIEditorEnumFieldForeground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorEnumFieldLayout& layout, const UIEditorEnumFieldSpec& spec, const UIEditorEnumFieldPalette& palette = {}, const UIEditorEnumFieldMetrics& metrics = {}); void AppendUIEditorEnumField( ::XCEngine::UI::UIDrawList& drawList, const ::XCEngine::UI::UIRect& bounds, const UIEditorEnumFieldSpec& spec, const UIEditorEnumFieldState& state, const UIEditorEnumFieldPalette& palette = {}, const UIEditorEnumFieldMetrics& metrics = {}); } // namespace XCEngine::UI::Editor::Widgets