#pragma once #include #include #include #include #include namespace XCEngine::UI::Editor::Widgets { enum class UIEditorNumberFieldHitTargetKind : std::uint8_t { None = 0, Row, ValueBox }; struct UIEditorNumberFieldSpec { std::string fieldId = {}; std::string label = {}; double value = 0.0; double step = 1.0; double minValue = 0.0; double maxValue = 100.0; bool integerMode = true; bool readOnly = false; }; struct UIEditorNumberFieldState { UIEditorNumberFieldHitTargetKind hoveredTarget = UIEditorNumberFieldHitTargetKind::None; UIEditorNumberFieldHitTargetKind activeTarget = UIEditorNumberFieldHitTargetKind::None; bool focused = false; bool editing = false; std::string displayText = {}; }; struct UIEditorNumberFieldMetrics { 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 cornerRounding = 0.0f; float valueBoxRounding = 2.0f; float borderThickness = 1.0f; float focusedBorderThickness = 1.0f; }; struct UIEditorNumberFieldPalette { ::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 valueBoxEditingColor = ::XCEngine::UI::UIColor(0.24f, 0.24f, 0.24f, 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 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 readOnlyValueColor = ::XCEngine::UI::UIColor(0.62f, 0.62f, 0.62f, 1.0f); }; struct UIEditorNumberFieldLayout { ::XCEngine::UI::UIRect bounds = {}; ::XCEngine::UI::UIRect labelRect = {}; ::XCEngine::UI::UIRect controlRect = {}; ::XCEngine::UI::UIRect valueRect = {}; }; struct UIEditorNumberFieldHitTarget { UIEditorNumberFieldHitTargetKind kind = UIEditorNumberFieldHitTargetKind::None; }; bool IsUIEditorNumberFieldPointInside( const ::XCEngine::UI::UIRect& rect, const ::XCEngine::UI::UIPoint& point); double NormalizeUIEditorNumberFieldValue( const UIEditorNumberFieldSpec& spec, double value); bool TryParseUIEditorNumberFieldValue( const UIEditorNumberFieldSpec& spec, std::string_view text, double& outValue); std::string FormatUIEditorNumberFieldValue(const UIEditorNumberFieldSpec& spec); UIEditorNumberFieldLayout BuildUIEditorNumberFieldLayout( const ::XCEngine::UI::UIRect& bounds, const UIEditorNumberFieldSpec& spec, const UIEditorNumberFieldMetrics& metrics = {}); UIEditorNumberFieldHitTarget HitTestUIEditorNumberField( const UIEditorNumberFieldLayout& layout, const ::XCEngine::UI::UIPoint& point); void AppendUIEditorNumberFieldBackground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorNumberFieldLayout& layout, const UIEditorNumberFieldSpec& spec, const UIEditorNumberFieldState& state, const UIEditorNumberFieldPalette& palette = {}, const UIEditorNumberFieldMetrics& metrics = {}); void AppendUIEditorNumberFieldForeground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorNumberFieldLayout& layout, const UIEditorNumberFieldSpec& spec, const UIEditorNumberFieldState& state, const UIEditorNumberFieldPalette& palette = {}, const UIEditorNumberFieldMetrics& metrics = {}); void AppendUIEditorNumberField( ::XCEngine::UI::UIDrawList& drawList, const ::XCEngine::UI::UIRect& bounds, const UIEditorNumberFieldSpec& spec, const UIEditorNumberFieldState& state, const UIEditorNumberFieldPalette& palette = {}, const UIEditorNumberFieldMetrics& metrics = {}); } // namespace XCEngine::UI::Editor::Widgets