#pragma once #include #include #include namespace XCEngine::UI::Editor::Widgets { enum class UIEditorAssetFieldHitTargetKind : std::uint8_t { None = 0, Row, ValueBox, PickerButton, ClearButton }; struct UIEditorAssetFieldSpec { std::string fieldId = {}; std::string label = {}; std::string assetId = {}; std::string displayName = {}; std::string statusText = {}; std::string emptyText = "None"; ::XCEngine::UI::UIColor tint = ::XCEngine::UI::UIColor(0.28f, 0.50f, 0.83f, 1.0f); bool readOnly = false; bool showPickerButton = true; bool allowClear = true; bool showStatusBadge = true; }; struct UIEditorAssetFieldState { UIEditorAssetFieldHitTargetKind hoveredTarget = UIEditorAssetFieldHitTargetKind::None; UIEditorAssetFieldHitTargetKind activeTarget = UIEditorAssetFieldHitTargetKind::None; bool focused = false; }; struct UIEditorAssetFieldMetrics { float rowHeight = 22.0f; float horizontalPadding = 12.0f; float labelControlGap = 20.0f; float controlColumnStart = 236.0f; float controlTrailingInset = 8.0f; float valueBoxMinWidth = 116.0f; float controlInsetY = 1.0f; float labelTextInsetY = 0.0f; float labelFontSize = 11.0f; float valueTextInsetX = 6.0f; float valueTextInsetY = 0.0f; float valueFontSize = 12.0f; float previewSize = 16.0f; float previewInsetX = 4.0f; float previewGap = 6.0f; float previewGlyphFontSize = 10.0f; float statusBadgeGap = 6.0f; float statusBadgeMinWidth = 44.0f; float statusBadgePaddingX = 6.0f; float statusBadgeHeight = 14.0f; float statusBadgeFontSize = 10.0f; float actionButtonGap = 2.0f; float actionButtonWidth = 20.0f; float actionGlyphFontSize = 10.0f; float actionGlyphInsetY = -1.0f; float cornerRounding = 0.0f; float valueBoxRounding = 2.0f; float previewRounding = 2.0f; float badgeRounding = 2.0f; float borderThickness = 1.0f; float focusedBorderThickness = 1.0f; }; struct UIEditorAssetFieldPalette { ::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.22f, 0.22f, 0.22f, 1.0f); ::XCEngine::UI::UIColor valueBoxActiveColor = ::XCEngine::UI::UIColor(0.24f, 0.24f, 0.24f, 1.0f); ::XCEngine::UI::UIColor readOnlyColor = ::XCEngine::UI::UIColor(0.16f, 0.16f, 0.16f, 1.0f); ::XCEngine::UI::UIColor controlBorderColor = ::XCEngine::UI::UIColor(0.12f, 0.12f, 0.12f, 1.0f); ::XCEngine::UI::UIColor controlFocusedBorderColor = ::XCEngine::UI::UIColor(0.42f, 0.42f, 0.42f, 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.60f, 0.60f, 0.60f, 1.0f); ::XCEngine::UI::UIColor previewBaseColor = ::XCEngine::UI::UIColor(0.23f, 0.25f, 0.28f, 1.0f); ::XCEngine::UI::UIColor previewEmptyColor = ::XCEngine::UI::UIColor(0.26f, 0.26f, 0.26f, 1.0f); ::XCEngine::UI::UIColor previewBorderColor = ::XCEngine::UI::UIColor(0.08f, 0.08f, 0.08f, 1.0f); ::XCEngine::UI::UIColor previewGlyphColor = ::XCEngine::UI::UIColor(0.94f, 0.94f, 0.94f, 1.0f); ::XCEngine::UI::UIColor statusBadgeColor = ::XCEngine::UI::UIColor(0.25f, 0.29f, 0.34f, 1.0f); ::XCEngine::UI::UIColor statusBadgeBorderColor = ::XCEngine::UI::UIColor(0.14f, 0.14f, 0.14f, 1.0f); ::XCEngine::UI::UIColor statusBadgeTextColor = ::XCEngine::UI::UIColor(0.82f, 0.87f, 0.96f, 1.0f); ::XCEngine::UI::UIColor actionButtonHoverColor = ::XCEngine::UI::UIColor(0.28f, 0.28f, 0.28f, 1.0f); ::XCEngine::UI::UIColor actionButtonActiveColor = ::XCEngine::UI::UIColor(0.32f, 0.32f, 0.32f, 1.0f); ::XCEngine::UI::UIColor actionButtonColor = ::XCEngine::UI::UIColor(0.16f, 0.16f, 0.16f, 1.0f); ::XCEngine::UI::UIColor separatorColor = ::XCEngine::UI::UIColor(0.24f, 0.24f, 0.24f, 1.0f); ::XCEngine::UI::UIColor pickerGlyphColor = ::XCEngine::UI::UIColor(0.88f, 0.88f, 0.88f, 1.0f); ::XCEngine::UI::UIColor clearGlyphColor = ::XCEngine::UI::UIColor(0.95f, 0.68f, 0.68f, 1.0f); }; struct UIEditorAssetFieldLayout { ::XCEngine::UI::UIRect bounds = {}; ::XCEngine::UI::UIRect labelRect = {}; ::XCEngine::UI::UIRect controlRect = {}; ::XCEngine::UI::UIRect valueRect = {}; ::XCEngine::UI::UIRect previewRect = {}; ::XCEngine::UI::UIRect textRect = {}; ::XCEngine::UI::UIRect statusBadgeRect = {}; ::XCEngine::UI::UIRect pickerRect = {}; ::XCEngine::UI::UIRect clearRect = {}; }; struct UIEditorAssetFieldHitTarget { UIEditorAssetFieldHitTargetKind kind = UIEditorAssetFieldHitTargetKind::None; }; bool HasUIEditorAssetFieldValue(const UIEditorAssetFieldSpec& spec); std::string ResolveUIEditorAssetFieldValueText(const UIEditorAssetFieldSpec& spec); std::string ResolveUIEditorAssetFieldPreviewGlyph(const UIEditorAssetFieldSpec& spec); bool IsUIEditorAssetFieldPointInside( const ::XCEngine::UI::UIRect& rect, const ::XCEngine::UI::UIPoint& point); UIEditorAssetFieldLayout BuildUIEditorAssetFieldLayout( const ::XCEngine::UI::UIRect& bounds, const UIEditorAssetFieldSpec& spec, const UIEditorAssetFieldMetrics& metrics = {}); UIEditorAssetFieldHitTarget HitTestUIEditorAssetField( const UIEditorAssetFieldLayout& layout, const ::XCEngine::UI::UIPoint& point); void AppendUIEditorAssetFieldBackground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorAssetFieldLayout& layout, const UIEditorAssetFieldSpec& spec, const UIEditorAssetFieldState& state, const UIEditorAssetFieldPalette& palette = {}, const UIEditorAssetFieldMetrics& metrics = {}); void AppendUIEditorAssetFieldForeground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorAssetFieldLayout& layout, const UIEditorAssetFieldSpec& spec, const UIEditorAssetFieldState& state, const UIEditorAssetFieldPalette& palette = {}, const UIEditorAssetFieldMetrics& metrics = {}); void AppendUIEditorAssetField( ::XCEngine::UI::UIDrawList& drawList, const ::XCEngine::UI::UIRect& bounds, const UIEditorAssetFieldSpec& spec, const UIEditorAssetFieldState& state, const UIEditorAssetFieldPalette& palette = {}, const UIEditorAssetFieldMetrics& metrics = {}); } // namespace XCEngine::UI::Editor::Widgets