diff options
author | crupest <crupest@outlook.com> | 2021-05-10 19:34:01 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-05-10 19:34:01 +0800 |
commit | 43a1883ac80ce3ff4782cd74e5ad16a03887c2aa (patch) | |
tree | daa3c374813f478e0ce99dfca858393b6ad95a3a /src/ui/render | |
parent | ae5042599688af2d8b462e49e3cd103b6ec92fe9 (diff) | |
download | cru-43a1883ac80ce3ff4782cd74e5ad16a03887c2aa.tar.gz cru-43a1883ac80ce3ff4782cd74e5ad16a03887c2aa.tar.bz2 cru-43a1883ac80ce3ff4782cd74e5ad16a03887c2aa.zip |
...
Diffstat (limited to 'src/ui/render')
-rw-r--r-- | src/ui/render/ScrollBar.cpp | 87 |
1 files changed, 61 insertions, 26 deletions
diff --git a/src/ui/render/ScrollBar.cpp b/src/ui/render/ScrollBar.cpp index 198e0a6e..fa8e0118 100644 --- a/src/ui/render/ScrollBar.cpp +++ b/src/ui/render/ScrollBar.cpp @@ -10,6 +10,7 @@ #include "cru/platform/gui/Base.hpp" #include "cru/platform/gui/Cursor.hpp" #include "cru/ui/Base.hpp" +#include "cru/ui/ThemeManager.hpp" #include "cru/ui/UiManager.hpp" #include "cru/ui/events/UiEvent.hpp" #include "cru/ui/helper/ClickDetector.hpp" @@ -22,6 +23,7 @@ #include <memory> #include <optional> #include <stdexcept> +#include <string> namespace cru::ui::render { using namespace std::chrono_literals; @@ -36,6 +38,42 @@ constexpr std::array<ScrollBarAreaKind, 5> kScrollBarAreaKindList{ ScrollBarAreaKind::UpSlot, ScrollBarAreaKind::DownSlot, ScrollBarAreaKind::Thumb}; +std::u16string GenerateScrollBarThemeColorKey(ScrollBarBrushUsageKind usage, + ScrollBarBrushStateKind state) { + std::u16string result = u"scrollbar."; + switch (usage) { + case ScrollBarBrushUsageKind::Arrow: + result.append(u"arrow"); + break; + case ScrollBarBrushUsageKind::ArrowBackground: + result.append(u"arrow-background"); + break; + case ScrollBarBrushUsageKind::Slot: + result.append(u"slot"); + break; + case ScrollBarBrushUsageKind::Thumb: + result.append(u"thumb"); + break; + } + result.push_back(u'.'); + switch (state) { + case ScrollBarBrushStateKind::Normal: + result.append(u"normal"); + break; + case ScrollBarBrushStateKind::Hover: + result.append(u"hover"); + break; + case ScrollBarBrushStateKind::Press: + result.append(u"press"); + break; + case ScrollBarBrushStateKind::Disable: + result.append(u"disable"); + break; + } + result.append(u".color"); + return result; +} + namespace { std::unique_ptr<platform::graphics::IGeometry> CreateScrollBarArrowGeometry() { auto geometry_builder = GetGraphFactory()->CreateGeometryBuilder(); @@ -207,10 +245,9 @@ void ScrollBar::InstallHandlers(controls::Control* control) { gsl::not_null<std::shared_ptr<platform::graphics::IBrush>> ScrollBar::GetCollapsedThumbBrush() { - return collapsed_thumb_brush_ ? collapsed_thumb_brush_ - : UiManager::GetInstance() - ->GetThemeResources() - ->scroll_bar_colllapsed_thumb_brush; + return collapsed_thumb_brush_ ? gsl::not_null(collapsed_thumb_brush_) + : ThemeManager::GetInstance()->GetBrush( + u"scrollbar.collapse-thumb.color"); } void ScrollBar::SetCollapsedThumbBrush( @@ -221,21 +258,19 @@ void ScrollBar::SetCollapsedThumbBrush( } gsl::not_null<std::shared_ptr<platform::graphics::IBrush>> ScrollBar::GetBrush( - ScrollBarBrushUsageKind kind, helper::ClickState click_state) { - auto b = brushes_[kind][click_state]; - return b ? b - : UiManager::GetInstance() - ->GetThemeResources() - ->scroll_bar_brushes.at(kind) - .at(click_state); + ScrollBarBrushUsageKind usage, ScrollBarBrushStateKind state) { + auto b = brushes_[usage][state]; + return b ? gsl::not_null(b) + : ThemeManager::GetInstance()->GetBrush( + GenerateScrollBarThemeColorKey(usage, state)); } // Brush could be nullptr to use the theme brush. -void ScrollBar::SetBrush(ScrollBarBrushUsageKind kind, - helper::ClickState click_state, +void ScrollBar::SetBrush(ScrollBarBrushUsageKind usage, + ScrollBarBrushStateKind state, std::shared_ptr<platform::graphics::IBrush> brush) { - if (brushes_[kind][click_state] == brush) return; - brushes_[kind][click_state] = std::move(brush); + if (brushes_[usage][state] == brush) return; + brushes_[usage][state] = std::move(brush); render_object_->InvalidatePaint(); } @@ -244,14 +279,14 @@ void ScrollBar::OnDraw(platform::graphics::IPainter* painter, if (is_expanded) { auto thumb_rect = GetExpandedAreaRect(ScrollBarAreaKind::Thumb); if (thumb_rect) - painter->FillRectangle( - *thumb_rect, - GetBrush(ScrollBarBrushUsageKind::Thumb, helper::ClickState::None) - .get() - .get()); + painter->FillRectangle(*thumb_rect, + GetBrush(ScrollBarBrushUsageKind::Thumb, + ScrollBarBrushStateKind::Normal) + .get() + .get()); auto slot_brush = - GetBrush(ScrollBarBrushUsageKind::Slot, helper::ClickState::None) + GetBrush(ScrollBarBrushUsageKind::Slot, ScrollBarBrushStateKind::Normal) .get() .get(); @@ -261,13 +296,13 @@ void ScrollBar::OnDraw(platform::graphics::IPainter* painter, auto down_slot_rect = GetExpandedAreaRect(ScrollBarAreaKind::DownSlot); if (down_slot_rect) painter->FillRectangle(*down_slot_rect, slot_brush); - auto arrow_brush = - GetBrush(ScrollBarBrushUsageKind::Arrow, helper::ClickState::None) - .get() - .get(); + auto arrow_brush = GetBrush(ScrollBarBrushUsageKind::Arrow, + ScrollBarBrushStateKind::Normal) + .get() + .get(); auto arrow_background_brush = GetBrush(ScrollBarBrushUsageKind::ArrowBackground, - helper::ClickState::None) + ScrollBarBrushStateKind::Normal) .get() .get(); |