#pragma once #include #include #include #include #include namespace XCEngine::UI::Editor::Widgets { inline constexpr std::size_t UIEditorMenuBarInvalidIndex = static_cast(-1); struct UIEditorMenuBarItem { std::string menuId = {}; std::string label = {}; bool enabled = true; float desiredLabelWidth = 0.0f; }; struct UIEditorMenuBarState { std::size_t openIndex = UIEditorMenuBarInvalidIndex; std::size_t hoveredIndex = UIEditorMenuBarInvalidIndex; bool focused = false; }; struct UIEditorMenuBarMetrics { float barHeight = 34.0f; float horizontalInset = 10.0f; float verticalInset = 4.0f; float buttonGap = 6.0f; float buttonPaddingX = 14.0f; float estimatedGlyphWidth = 7.0f; float labelInsetY = -1.0f; float barCornerRounding = 8.0f; float buttonCornerRounding = 6.0f; float baseBorderThickness = 1.0f; float focusedBorderThickness = 2.0f; float openBorderThickness = 1.5f; }; struct UIEditorMenuBarPalette { ::XCEngine::UI::UIColor barColor = ::XCEngine::UI::UIColor(0.18f, 0.18f, 0.19f, 1.0f); ::XCEngine::UI::UIColor buttonColor = ::XCEngine::UI::UIColor(0.21f, 0.22f, 0.24f, 1.0f); ::XCEngine::UI::UIColor buttonHoveredColor = ::XCEngine::UI::UIColor(0.27f, 0.28f, 0.30f, 1.0f); ::XCEngine::UI::UIColor buttonOpenColor = ::XCEngine::UI::UIColor(0.33f, 0.35f, 0.38f, 1.0f); ::XCEngine::UI::UIColor borderColor = ::XCEngine::UI::UIColor(0.30f, 0.32f, 0.34f, 1.0f); ::XCEngine::UI::UIColor focusedBorderColor = ::XCEngine::UI::UIColor(0.78f, 0.80f, 0.84f, 1.0f); ::XCEngine::UI::UIColor openBorderColor = ::XCEngine::UI::UIColor(0.50f, 0.52f, 0.56f, 1.0f); ::XCEngine::UI::UIColor textPrimary = ::XCEngine::UI::UIColor(0.93f, 0.94f, 0.96f, 1.0f); ::XCEngine::UI::UIColor textMuted = ::XCEngine::UI::UIColor(0.70f, 0.72f, 0.74f, 1.0f); ::XCEngine::UI::UIColor textDisabled = ::XCEngine::UI::UIColor(0.54f, 0.55f, 0.58f, 1.0f); }; struct UIEditorMenuBarLayout { ::XCEngine::UI::UIRect bounds = {}; ::XCEngine::UI::UIRect contentRect = {}; std::vector<::XCEngine::UI::UIRect> buttonRects = {}; }; enum class UIEditorMenuBarHitTargetKind : std::uint8_t { None = 0, BarBackground, Button }; struct UIEditorMenuBarHitTarget { UIEditorMenuBarHitTargetKind kind = UIEditorMenuBarHitTargetKind::None; std::size_t index = UIEditorMenuBarInvalidIndex; }; float ResolveUIEditorMenuBarDesiredButtonWidth( const UIEditorMenuBarItem& item, const UIEditorMenuBarMetrics& metrics = {}); UIEditorMenuBarLayout BuildUIEditorMenuBarLayout( const ::XCEngine::UI::UIRect& bounds, const std::vector& items, const UIEditorMenuBarMetrics& metrics = {}); UIEditorMenuBarHitTarget HitTestUIEditorMenuBar( const UIEditorMenuBarLayout& layout, const ::XCEngine::UI::UIPoint& point); void AppendUIEditorMenuBarBackground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorMenuBarLayout& layout, const std::vector& items, const UIEditorMenuBarState& state, const UIEditorMenuBarPalette& palette = {}, const UIEditorMenuBarMetrics& metrics = {}); void AppendUIEditorMenuBarForeground( ::XCEngine::UI::UIDrawList& drawList, const UIEditorMenuBarLayout& layout, const std::vector& items, const UIEditorMenuBarState& state, const UIEditorMenuBarPalette& palette = {}, const UIEditorMenuBarMetrics& metrics = {}); void AppendUIEditorMenuBar( ::XCEngine::UI::UIDrawList& drawList, const ::XCEngine::UI::UIRect& bounds, const std::vector& items, const UIEditorMenuBarState& state, const UIEditorMenuBarPalette& palette = {}, const UIEditorMenuBarMetrics& metrics = {}); } // namespace XCEngine::UI::Editor::Widgets