#pragma once #include #include #include namespace XCEngine::UI::Editor::Widgets { enum class UIEditorObjectFieldHitTargetKind : std::uint8_t { None = 0, Row, ValueBox, ClearButton, PickerButton }; struct UIEditorObjectFieldSpec { std::string fieldId = {}; std::string label = {}; std::string objectName = {}; std::string objectTypeName = {}; std::string emptyText = "(none)"; bool hasValue = false; bool readOnly = false; bool showClearButton = true; bool showPickerButton = true; }; struct UIEditorObjectFieldState { UIEditorObjectFieldHitTargetKind hoveredTarget = UIEditorObjectFieldHitTargetKind::None; UIEditorObjectFieldHitTargetKind activeTarget = UIEditorObjectFieldHitTargetKind::None; bool focused = false; }; struct UIEditorObjectFieldMetrics { 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 = 5.0f; float valueTextInsetY = 0.0f; float valueFontSize = 12.0f; float typeTextInsetX = 5.0f; float typeTextInsetY = 0.0f; float typeFontSize = 10.0f; float typeMaxWidth = 96.0f; float typeMinWidth = 44.0f; float valueTypeGap = 6.0f; float buttonWidth = 20.0f; float buttonGlyphInsetY = -1.0f; float buttonGlyphFontSize = 10.0f; float cornerRounding = 0.0f; float valueBoxRounding = 2.0f; float borderThickness = 1.0f; float focusedBorderThickness = 1.0f; }; struct UIEditorObjectFieldPalette { ::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.0f, 0.0f, 0.0f, 0.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 controlFocusedBorderColor = ::XCEngine::UI::UIColor(0.46f, 0.46f, 0.46f, 1.0f); ::XCEngine::UI::UIColor buttonColor = ::XCEngine::UI::UIColor(0.16f, 0.16f, 0.16f, 1.0f); ::XCEngine::UI::UIColor buttonHoverColor = ::XCEngine::UI::UIColor(0.22f, 0.22f, 0.22f, 1.0f); ::XCEngine::UI::UIColor buttonActiveColor = ::XCEngine::UI::UIColor(0.26f, 0.26f, 0.26f, 1.0f); ::XCEngine::UI::UIColor buttonGlyphColor = ::XCEngine::UI::UIColor(0.86f, 0.86f, 0.86f, 1.0f); ::XCEngine::UI::UIColor separatorColor = ::XCEngine::UI::UIColor(0.24f, 0.24f, 0.24f, 1.0f); ::XCEngine::UI::UIColor labelColor = ::XCEngine::UI::UIColor(0.80f, 0.80f, 0.80f, 1.0f); ::XCEngine::UI::UIColor valueColor = ::XCEngine::UI::UIColor(0.92f, 0.92f, 0.92f, 1.0f); ::XCEngine::UI::UIColor emptyValueColor = ::XCEngine::UI::UIColor(0.62f, 0.62f, 0.62f, 1.0f); ::XCEngine::UI::UIColor typeColor = ::XCEngine::UI::UIColor(0.68f, 0.68f, 0.68f, 1.0f); }; struct UIEditorObjectFieldLayout { ::XCEngine::UI::UIRect bounds = {}; ::XCEngine::UI::UIRect labelRect = {}; ::XCEngine::UI::UIRect controlRect = {}; ::XCEngine::UI::UIRect valueRect = {}; ::XCEngine::UI::UIRect typeRect = {}; ::XCEngine::UI::UIRect clearButtonRect = {}; ::XCEngine::UI::UIRect pickerButtonRect = {}; }; struct UIEditorObjectFieldHitTarget { UIEditorObjectFieldHitTargetKind kind = UIEditorObjectFieldHitTargetKind::None; }; std::string ResolveUIEditorObjectFieldDisplayText(const UIEditorObjectFieldSpec& spec); UIEditorObjectFieldLayout BuildUIEditorObjectFieldLayout( const ::XCEngine::UI::UIRect& bounds, const UIEditorObjectFieldSpec& spec, const UIEditorObjectFieldMetrics& metrics = {}); UIEditorObjectFieldHitTarget HitTestUIEditorObjectField( const UIEditorObjectFieldLayout& layout, const ::XCEngine::UI::UIPoint& point); void AppendUIEditorObjectFieldBackground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorObjectFieldLayout& layout, const UIEditorObjectFieldSpec& spec, const UIEditorObjectFieldState& state, const UIEditorObjectFieldPalette& palette = {}, const UIEditorObjectFieldMetrics& metrics = {}); void AppendUIEditorObjectFieldForeground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorObjectFieldLayout& layout, const UIEditorObjectFieldSpec& spec, const UIEditorObjectFieldPalette& palette = {}, const UIEditorObjectFieldMetrics& metrics = {}); void AppendUIEditorObjectField( ::XCEngine::UI::UIDrawList& drawList, const ::XCEngine::UI::UIRect& bounds, const UIEditorObjectFieldSpec& spec, const UIEditorObjectFieldState& state, const UIEditorObjectFieldPalette& palette = {}, const UIEditorObjectFieldMetrics& metrics = {}); } // namespace XCEngine::UI::Editor::Widgets