diff options
author | crupest <crupest@outlook.com> | 2022-02-08 16:53:51 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-02-08 16:53:51 +0800 |
commit | 74bb9cd27242b9320f99ff4d2b50c3051576cc14 (patch) | |
tree | 744bac5799c593d1d6f81e7b09581bea626f2cde /include/cru/ui/render/BorderRenderObject.h | |
parent | b90c398de829d1ba5329651d75bae82f5e4085fe (diff) | |
download | cru-74bb9cd27242b9320f99ff4d2b50c3051576cc14.tar.gz cru-74bb9cd27242b9320f99ff4d2b50c3051576cc14.tar.bz2 cru-74bb9cd27242b9320f99ff4d2b50c3051576cc14.zip |
...
Diffstat (limited to 'include/cru/ui/render/BorderRenderObject.h')
-rw-r--r-- | include/cru/ui/render/BorderRenderObject.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/include/cru/ui/render/BorderRenderObject.h b/include/cru/ui/render/BorderRenderObject.h new file mode 100644 index 00000000..d75a979f --- /dev/null +++ b/include/cru/ui/render/BorderRenderObject.h @@ -0,0 +1,109 @@ +#pragma once +#include <string_view> +#include "../style/ApplyBorderStyleInfo.h" +#include "RenderObject.h" +#include "cru/platform/GraphicsBase.h" +#include "cru/ui/Base.h" + +namespace cru::ui::render { +class CRU_UI_API BorderRenderObject : public RenderObject { + CRU_DEFINE_CLASS_LOG_TAG(u"cru::ui::render::BorderRenderObject") + + public: + BorderRenderObject(); + BorderRenderObject(const BorderRenderObject& other) = delete; + BorderRenderObject(BorderRenderObject&& other) = delete; + BorderRenderObject& operator=(const BorderRenderObject& other) = delete; + BorderRenderObject& operator=(BorderRenderObject&& other) = delete; + ~BorderRenderObject() override; + + bool IsBorderEnabled() const { return is_border_enabled_; } + void SetBorderEnabled(bool enabled) { is_border_enabled_ = enabled; } + + std::shared_ptr<platform::graphics::IBrush> GetBorderBrush() { + return border_brush_; + } + + void SetBorderBrush(std::shared_ptr<platform::graphics::IBrush> brush) { + if (brush == border_brush_) return; + border_brush_ = std::move(brush); + InvalidatePaint(); + } + + Thickness GetBorderThickness() const { return border_thickness_; } + + void SetBorderThickness(const Thickness thickness) { + if (thickness == border_thickness_) return; + border_thickness_ = thickness; + InvalidateLayout(); + } + + CornerRadius GetBorderRadius() { return border_radius_; } + + void SetBorderRadius(const CornerRadius radius) { + if (radius == border_radius_) return; + border_radius_ = radius; + RecreateGeometry(); + } + + std::shared_ptr<platform::graphics::IBrush> GetForegroundBrush() { + return foreground_brush_; + } + + void SetForegroundBrush(std::shared_ptr<platform::graphics::IBrush> brush) { + if (brush == foreground_brush_) return; + foreground_brush_ = std::move(brush); + InvalidatePaint(); + } + + std::shared_ptr<platform::graphics::IBrush> GetBackgroundBrush() { + return background_brush_; + } + + void SetBackgroundBrush(std::shared_ptr<platform::graphics::IBrush> brush) { + if (brush == background_brush_) return; + background_brush_ = std::move(brush); + InvalidatePaint(); + } + + void ApplyBorderStyle(const style::ApplyBorderStyleInfo& style); + + RenderObject* HitTest(const Point& point) override; + + Thickness GetOuterSpaceThickness() const override; + Rect GetPaddingRect() const override; + Rect GetContentRect() const override; + + std::u16string_view GetName() const override { return u"BorderRenderObject"; } + + protected: + void OnDrawCore(platform::graphics::IPainter* painter) override; + + Size OnMeasureContent(const MeasureRequirement& requirement, + const MeasureSize& preferred_size) override; + void OnLayoutContent(const Rect& content_rect) override; + + void OnAfterLayout() override; + + private: + void RecreateGeometry(); + + private: + bool is_border_enabled_ = false; + + std::shared_ptr<platform::graphics::IBrush> border_brush_; + Thickness border_thickness_; + CornerRadius border_radius_; + + std::shared_ptr<platform::graphics::IBrush> foreground_brush_; + std::shared_ptr<platform::graphics::IBrush> background_brush_; + + // The ring. Used for painting. + std::unique_ptr<platform::graphics::IGeometry> geometry_; + // Area including inner area of the border. Used for painting foreground and + // background. + std::unique_ptr<platform::graphics::IGeometry> border_inner_geometry_; + // Area including border ring and inner area. Used for hit test. + std::unique_ptr<platform::graphics::IGeometry> border_outer_geometry_; +}; +} // namespace cru::ui::render |