diff options
Diffstat (limited to 'src/ui/render')
-rw-r--r-- | src/ui/render/render_object.cpp | 42 | ||||
-rw-r--r-- | src/ui/render/render_object.hpp | 82 |
2 files changed, 48 insertions, 76 deletions
diff --git a/src/ui/render/render_object.cpp b/src/ui/render/render_object.cpp index 3e2e5265..bfa250d6 100644 --- a/src/ui/render/render_object.cpp +++ b/src/ui/render/render_object.cpp @@ -60,48 +60,18 @@ namespace cru::ui::render InvalidateRenderHost(); } - void RoundedRectangleRenderObject::SetRect(const Rect& rect) + namespace details { - const auto converted_rect = Convert(rect); - if (rounded_rect_.rect == converted_rect) - return; - - rounded_rect_.rect = converted_rect; - InvalidateRenderHost(); - } - - void RoundedRectangleRenderObject::SetRadiusX(const float new_radius_x) - { - if (rounded_rect_.radiusX == new_radius_x) - return; - - rounded_rect_.radiusX = new_radius_x; - InvalidateRenderHost(); - } - - void RoundedRectangleRenderObject::SetRadiusY(const float new_radius_y) - { - if (rounded_rect_.radiusY == new_radius_y) - return; - - rounded_rect_.radiusY = new_radius_y; - InvalidateRenderHost(); - } - - void RoundedRectangleRenderObject::SetRoundedRect(const D2D1_ROUNDED_RECT& new_rounded_rect) - { - if (rounded_rect_ == new_rounded_rect) - return; - - rounded_rect_ = new_rounded_rect; - InvalidateRenderHost(); + template class ShapeRenderObject<Rect>; + template class ShapeRenderObject<RoundedRect>; + template class ShapeRenderObject<Ellipse>; } void RoundedRectangleStrokeRenderObject::Draw(ID2D1RenderTarget* render_target) { const auto brush = GetBrush(); if (brush != nullptr) - render_target->DrawRoundedRectangle(GetRoundedRect(), GetBrush().Get(), GetStrokeWidth()); + render_target->DrawRoundedRectangle(Convert(GetShape()), GetBrush().Get(), GetStrokeWidth()); } void CustomDrawHandlerRenderObject::SetDrawHandler(DrawHandler new_draw_handler) @@ -110,7 +80,7 @@ namespace cru::ui::render return; draw_handler_ = std::move(new_draw_handler); - InvalidateRenderHost; + InvalidateRenderHost(); } void CustomDrawHandlerRenderObject::Draw(ID2D1RenderTarget* render_target) diff --git a/src/ui/render/render_object.hpp b/src/ui/render/render_object.hpp index b6f9f13b..0fbeb8c7 100644 --- a/src/ui/render/render_object.hpp +++ b/src/ui/render/render_object.hpp @@ -119,48 +119,50 @@ namespace cru::ui::render }; - class RoundedRectangleRenderObject : public virtual RenderObject + namespace details { - protected: - RoundedRectangleRenderObject() = default; - public: - RoundedRectangleRenderObject(const RoundedRectangleRenderObject& other) = delete; - RoundedRectangleRenderObject(RoundedRectangleRenderObject&& other) = delete; - RoundedRectangleRenderObject& operator=(const RoundedRectangleRenderObject& other) = delete; - RoundedRectangleRenderObject& operator=(RoundedRectangleRenderObject&& other) = delete; - ~RoundedRectangleRenderObject() override = default; - - Rect GetRect() const - { - return Convert(rounded_rect_.rect); - } - - void SetRect(const Rect& rect); - - float GetRadiusX() const - { - return rounded_rect_.radiusX; - } - - void SetRadiusX(float new_radius_x); - - float GetRadiusY() const - { - return rounded_rect_.radiusY; - } - - void SetRadiusY(float new_radius_y); - - D2D1_ROUNDED_RECT GetRoundedRect() const + template <typename TShapeType> + class ShapeRenderObject : public virtual RenderObject { - return rounded_rect_; - } - - void SetRoundedRect(const D2D1_ROUNDED_RECT& new_rounded_rect); - - private: - D2D1_ROUNDED_RECT rounded_rect_ = D2D1::RoundedRect(D2D1::RectF(), 0.0f, 0.0f); - }; + public: + using ShapeType = TShapeType; + protected: + ShapeRenderObject() = default; + public: + ShapeRenderObject(const ShapeRenderObject& other) = delete; + ShapeRenderObject& operator=(const ShapeRenderObject& other) = delete; + ShapeRenderObject(ShapeRenderObject&& other) = delete; + ShapeRenderObject& operator=(ShapeRenderObject&& other) = delete; + ~ShapeRenderObject() override = default; + + ShapeType GetShape() const + { + return shape_; + } + + void SetShape(const ShapeType& new_shape) + { + if (new_shape == shape_) + return; + + shape_ = new_shape; + InvalidateRenderHost(); + } + + private: + ShapeType shape_; + }; + + + extern template class ShapeRenderObject<Rect>; + extern template class ShapeRenderObject<RoundedRect>; + extern template class ShapeRenderObject<Ellipse>; + } + + + using RectangleRenderObject = details::ShapeRenderObject<Rect>; + using RoundedRectangleRenderObject = details::ShapeRenderObject<RoundedRect>; + using EllipseRenderObject = details::ShapeRenderObject<Ellipse>; class RoundedRectangleStrokeRenderObject final : public StrokeRenderObject, public RoundedRectangleRenderObject |