#pragma once #include #include #include namespace XCEngine::UI::Editor::Widgets { enum class UIEditorPanelFrameAction : std::uint8_t { None = 0, Pin, Close }; enum class UIEditorPanelFrameHitTarget : std::uint8_t { None = 0, Header, Body, Footer, PinButton, CloseButton }; struct UIEditorPanelFrameState { bool active = false; bool hovered = false; bool focused = false; bool pinned = false; bool closable = true; bool pinnable = true; bool showFooter = false; bool pinHovered = false; bool closeHovered = false; }; struct UIEditorPanelFrameText { std::string_view title = {}; std::string_view subtitle = {}; std::string_view footer = {}; }; struct UIEditorPanelFrameMetrics { float cornerRounding = 0.0f; float headerHeight = 28.0f; float footerHeight = 18.0f; float contentPadding = 8.0f; float titleInsetX = 9.0f; float titleInsetY = 6.0f; float subtitleInsetY = 16.0f; float footerInsetX = 9.0f; float footerInsetY = 3.0f; float actionButtonExtent = 14.0f; float actionInsetX = 8.0f; float actionGap = 4.0f; float baseBorderThickness = 1.0f; float hoveredBorderThickness = 1.0f; float activeBorderThickness = 1.0f; float focusedBorderThickness = 1.0f; }; struct UIEditorPanelFramePalette { ::XCEngine::UI::UIColor surfaceColor = ::XCEngine::UI::UIColor(0.18f, 0.18f, 0.18f, 1.0f); ::XCEngine::UI::UIColor headerColor = ::XCEngine::UI::UIColor(0.20f, 0.20f, 0.20f, 1.0f); ::XCEngine::UI::UIColor footerColor = ::XCEngine::UI::UIColor(0.18f, 0.18f, 0.18f, 1.0f); ::XCEngine::UI::UIColor borderColor = ::XCEngine::UI::UIColor(0.23f, 0.23f, 0.23f, 1.0f); ::XCEngine::UI::UIColor hoveredBorderColor = ::XCEngine::UI::UIColor(0.28f, 0.28f, 0.28f, 1.0f); ::XCEngine::UI::UIColor activeBorderColor = ::XCEngine::UI::UIColor(0.32f, 0.32f, 0.32f, 1.0f); ::XCEngine::UI::UIColor focusedBorderColor = ::XCEngine::UI::UIColor(0.36f, 0.36f, 0.36f, 1.0f); ::XCEngine::UI::UIColor textPrimary = ::XCEngine::UI::UIColor(0.86f, 0.86f, 0.86f, 1.0f); ::XCEngine::UI::UIColor textSecondary = ::XCEngine::UI::UIColor(0.64f, 0.64f, 0.64f, 1.0f); ::XCEngine::UI::UIColor textMuted = ::XCEngine::UI::UIColor(0.58f, 0.58f, 0.58f, 1.0f); ::XCEngine::UI::UIColor actionButtonColor = ::XCEngine::UI::UIColor(0.21f, 0.21f, 0.21f, 1.0f); ::XCEngine::UI::UIColor actionButtonHoveredColor = ::XCEngine::UI::UIColor(0.24f, 0.24f, 0.24f, 1.0f); ::XCEngine::UI::UIColor actionButtonSelectedColor = ::XCEngine::UI::UIColor(0.27f, 0.27f, 0.27f, 1.0f); ::XCEngine::UI::UIColor actionButtonBorderColor = ::XCEngine::UI::UIColor(0.29f, 0.29f, 0.29f, 1.0f); ::XCEngine::UI::UIColor actionGlyphColor = ::XCEngine::UI::UIColor(0.82f, 0.82f, 0.82f, 1.0f); }; struct UIEditorPanelFrameLayout { ::XCEngine::UI::UIRect frameRect = {}; ::XCEngine::UI::UIRect headerRect = {}; ::XCEngine::UI::UIRect bodyRect = {}; ::XCEngine::UI::UIRect footerRect = {}; ::XCEngine::UI::UIRect pinButtonRect = {}; ::XCEngine::UI::UIRect closeButtonRect = {}; bool hasFooter = false; bool showPinButton = false; bool showCloseButton = false; }; bool IsUIEditorPanelFramePointInside( const ::XCEngine::UI::UIRect& rect, const ::XCEngine::UI::UIPoint& point); bool IsUIEditorPanelFramePinButtonVisible(const UIEditorPanelFrameState& state); bool IsUIEditorPanelFrameCloseButtonVisible(const UIEditorPanelFrameState& state); UIEditorPanelFrameLayout BuildUIEditorPanelFrameLayout( const ::XCEngine::UI::UIRect& frameRect, const UIEditorPanelFrameState& state, const UIEditorPanelFrameMetrics& metrics = {}); ::XCEngine::UI::UIColor ResolveUIEditorPanelFrameBorderColor( const UIEditorPanelFrameState& state, const UIEditorPanelFramePalette& palette = {}); float ResolveUIEditorPanelFrameBorderThickness( const UIEditorPanelFrameState& state, const UIEditorPanelFrameMetrics& metrics = {}); UIEditorPanelFrameAction HitTestUIEditorPanelFrameAction( const UIEditorPanelFrameLayout& layout, const UIEditorPanelFrameState& state, const ::XCEngine::UI::UIPoint& point); UIEditorPanelFrameHitTarget HitTestUIEditorPanelFrame( const UIEditorPanelFrameLayout& layout, const UIEditorPanelFrameState& state, const ::XCEngine::UI::UIPoint& point); void AppendUIEditorPanelFrameBackground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorPanelFrameLayout& layout, const UIEditorPanelFrameState& state, const UIEditorPanelFramePalette& palette = {}, const UIEditorPanelFrameMetrics& metrics = {}); void AppendUIEditorPanelFrameForeground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorPanelFrameLayout& layout, const UIEditorPanelFrameState& state, const UIEditorPanelFrameText& text, const UIEditorPanelFramePalette& palette = {}, const UIEditorPanelFrameMetrics& metrics = {}); void AppendUIEditorPanelFrame( ::XCEngine::UI::UIDrawList& drawList, const ::XCEngine::UI::UIRect& frameRect, const UIEditorPanelFrameState& state, const UIEditorPanelFrameText& text, const UIEditorPanelFramePalette& palette = {}, const UIEditorPanelFrameMetrics& metrics = {}); } // namespace XCEngine::UI::Editor::Widgets