diff options
Diffstat (limited to 'include/cru/ui/render')
-rw-r--r-- | include/cru/ui/render/Base.h | 12 | ||||
-rw-r--r-- | include/cru/ui/render/BorderRenderObject.h | 46 | ||||
-rw-r--r-- | include/cru/ui/render/FlexLayoutRenderObject.h | 18 | ||||
-rw-r--r-- | include/cru/ui/render/LayoutHelper.h | 6 | ||||
-rw-r--r-- | include/cru/ui/render/LayoutRenderObject.h | 12 | ||||
-rw-r--r-- | include/cru/ui/render/MeasureRequirement.h | 3 | ||||
-rw-r--r-- | include/cru/ui/render/RenderObject.h | 4 | ||||
-rw-r--r-- | include/cru/ui/render/ScrollBar.h | 1 | ||||
-rw-r--r-- | include/cru/ui/render/ScrollRenderObject.h | 13 | ||||
-rw-r--r-- | include/cru/ui/render/SingleChildRenderObject.h | 23 | ||||
-rw-r--r-- | include/cru/ui/render/StackLayoutRenderObject.h | 1 | ||||
-rw-r--r-- | include/cru/ui/render/TextRenderObject.h | 2 |
12 files changed, 66 insertions, 75 deletions
diff --git a/include/cru/ui/render/Base.h b/include/cru/ui/render/Base.h deleted file mode 100644 index fca67086..00000000 --- a/include/cru/ui/render/Base.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "../Base.h" - -namespace cru::ui::render { -class RenderObject; -class BorderRenderObject; -class CanvasRenderObject; -class FlexLayoutRenderObject; -class ScrollRenderObject; -class StackLayoutRenderObject; -class TextRenderObject; -} // namespace cru::ui::render diff --git a/include/cru/ui/render/BorderRenderObject.h b/include/cru/ui/render/BorderRenderObject.h index 1720d680..2fc74f0f 100644 --- a/include/cru/ui/render/BorderRenderObject.h +++ b/include/cru/ui/render/BorderRenderObject.h @@ -1,10 +1,10 @@ #pragma once -#include "RenderObject.h" +#include "SingleChildRenderObject.h" #include "../style/ApplyBorderStyleInfo.h" namespace cru::ui::render { -class CRU_UI_API BorderRenderObject : public RenderObject { +class CRU_UI_API BorderRenderObject : public SingleChildRenderObject { CRU_DEFINE_CLASS_LOG_TAG(u"cru::ui::render::BorderRenderObject") public: @@ -13,57 +13,31 @@ class CRU_UI_API BorderRenderObject : public RenderObject { CRU_DELETE_MOVE(BorderRenderObject) ~BorderRenderObject() override; - RenderObject* GetChild() const { return child_; } - void SetChild(RenderObject* new_child); - bool IsBorderEnabled() const { return is_border_enabled_; } - void SetBorderEnabled(bool enabled) { is_border_enabled_ = enabled; } + void SetBorderEnabled(bool 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(); - } + void SetBorderBrush(std::shared_ptr<platform::graphics::IBrush> brush); Thickness GetBorderThickness() const { return border_thickness_; } - - void SetBorderThickness(const Thickness thickness) { - if (thickness == border_thickness_) return; - border_thickness_ = thickness; - InvalidateLayout(); - } + void SetBorderThickness(const Thickness thickness); CornerRadius GetBorderRadius() { return border_radius_; } - - void SetBorderRadius(const CornerRadius radius) { - if (radius == border_radius_) return; - border_radius_ = radius; - RecreateGeometry(); - } + void SetBorderRadius(const CornerRadius radius); 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(); - } + void SetForegroundBrush(std::shared_ptr<platform::graphics::IBrush> brush); 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 SetBackgroundBrush(std::shared_ptr<platform::graphics::IBrush> brush); void ApplyBorderStyle(const style::ApplyBorderStyleInfo& style); @@ -74,7 +48,7 @@ class CRU_UI_API BorderRenderObject : public RenderObject { Rect GetPaddingRect() const override; Rect GetContentRect() const override; - String GetName() const override { return u"BorderRenderObject"; } + String GetName() const override; protected: Size OnMeasureContent(const MeasureRequirement& requirement, @@ -87,8 +61,6 @@ class CRU_UI_API BorderRenderObject : public RenderObject { void RecreateGeometry(); private: - RenderObject* child_ = nullptr; - bool is_border_enabled_ = false; std::shared_ptr<platform::graphics::IBrush> border_brush_; diff --git a/include/cru/ui/render/FlexLayoutRenderObject.h b/include/cru/ui/render/FlexLayoutRenderObject.h index 164bae39..ff7340cb 100644 --- a/include/cru/ui/render/FlexLayoutRenderObject.h +++ b/include/cru/ui/render/FlexLayoutRenderObject.h @@ -2,6 +2,24 @@ #include "LayoutRenderObject.h" namespace cru::ui::render { + +enum class FlexDirection { + Horizontal, + HorizontalReverse, + Vertical, + VertivalReverse +}; + +using FlexMainAlignment = Alignment; +using FlexCrossAlignment = Alignment; + +struct FlexChildLayoutData { + float expand_factor = 0; + float shrink_factor = 1; + // nullopt stands for looking at parent's setting + std::optional<FlexCrossAlignment> cross_alignment = std::nullopt; +}; + // Measure Logic (v0.1): // Cross axis measure logic is the same as stack layout. // diff --git a/include/cru/ui/render/LayoutHelper.h b/include/cru/ui/render/LayoutHelper.h index c2377066..05813489 100644 --- a/include/cru/ui/render/LayoutHelper.h +++ b/include/cru/ui/render/LayoutHelper.h @@ -1,14 +1,8 @@ #pragma once -#include "Base.h" - #include "MeasureRequirement.h" namespace cru::ui::render { float CalculateAnchorByAlignment(Alignment alignment, float start_point, float content_length, float child_length); -MeasureLength StackLayoutCalculateChildMaxLength( - MeasureLength parent_preferred_size, MeasureLength parent_max_size, - MeasureLength child_min_size, std::u16string_view log_tag, - std::u16string_view exceeds_message); } // namespace cru::ui::render diff --git a/include/cru/ui/render/LayoutRenderObject.h b/include/cru/ui/render/LayoutRenderObject.h index 05da1bb8..62ee9005 100644 --- a/include/cru/ui/render/LayoutRenderObject.h +++ b/include/cru/ui/render/LayoutRenderObject.h @@ -1,7 +1,7 @@ #pragma once #include "RenderObject.h" -#include "cru/platform/graphics/util/Painter.h" +#include "cru/platform/graphics/Painter.h" namespace cru::ui::render { template <typename TChildLayoutData> @@ -54,6 +54,16 @@ class CRU_UI_API LayoutRenderObject : public RenderObject { return children_[position].layout_data; } + void Draw(platform::graphics::IPainter* painter) override { + for (auto& child : children_) { + painter->PushState(); + painter->ConcatTransform( + Matrix::Translation(child.render_object->GetOffset())); + child.render_object->Draw(painter); + painter->PopState(); + } + } + RenderObject* HitTest(const Point& point) override { const auto child_count = GetChildCount(); for (auto i = child_count - 1; i >= 0; --i) { diff --git a/include/cru/ui/render/MeasureRequirement.h b/include/cru/ui/render/MeasureRequirement.h index c740385b..832b936c 100644 --- a/include/cru/ui/render/MeasureRequirement.h +++ b/include/cru/ui/render/MeasureRequirement.h @@ -1,11 +1,10 @@ #pragma once -#include "Base.h" +#include "../Base.h" #include "cru/common/String.h" #include <algorithm> #include <limits> -#include <string> namespace cru::ui::render { constexpr Size Min(const Size& left, const Size& right) { diff --git a/include/cru/ui/render/RenderObject.h b/include/cru/ui/render/RenderObject.h index 67ef6162..cfa72b7d 100644 --- a/include/cru/ui/render/RenderObject.h +++ b/include/cru/ui/render/RenderObject.h @@ -1,10 +1,8 @@ #pragma once -#include "Base.h" +#include "../Base.h" #include "MeasureRequirement.h" -#include "cru/common/Base.h" #include "cru/common/String.h" -#include "cru/ui/Base.h" namespace cru::ui::render { // Render object will not destroy its children when destroyed. Control must diff --git a/include/cru/ui/render/ScrollBar.h b/include/cru/ui/render/ScrollBar.h index 84d4375b..c65c0345 100644 --- a/include/cru/ui/render/ScrollBar.h +++ b/include/cru/ui/render/ScrollBar.h @@ -1,5 +1,4 @@ #pragma once -#include "Base.h" #include "cru/common/Base.h" #include "cru/common/Event.h" #include "cru/platform/graphics/Base.h" diff --git a/include/cru/ui/render/ScrollRenderObject.h b/include/cru/ui/render/ScrollRenderObject.h index 0890ec21..53c64c6c 100644 --- a/include/cru/ui/render/ScrollRenderObject.h +++ b/include/cru/ui/render/ScrollRenderObject.h @@ -1,10 +1,8 @@ #pragma once -#include "RenderObject.h" +#include "SingleChildRenderObject.h" +#include "ScrollBar.h" #include "cru/common/Event.h" -#include "cru/platform/graphics/util/Painter.h" -#include "cru/ui/Base.h" -#include "cru/ui/render/ScrollBar.h" #include <memory> #include <optional> @@ -18,7 +16,7 @@ namespace cru::ui::render { // Layout logic: // If child is smaller than content area, layout at lefttop. // Or layout by scroll state. -class CRU_UI_API ScrollRenderObject : public RenderObject { +class CRU_UI_API ScrollRenderObject : public SingleChildRenderObject { public: ScrollRenderObject(); @@ -27,9 +25,6 @@ class CRU_UI_API ScrollRenderObject : public RenderObject { ~ScrollRenderObject() override = default; - RenderObject* GetChild() const { return child_; } - void SetChild(RenderObject* new_child); - RenderObject* HitTest(const Point& point) override; // Return the coerced scroll offset. @@ -91,8 +86,6 @@ class CRU_UI_API ScrollRenderObject : public RenderObject { void InstallMouseWheelHandler(controls::Control* control); private: - RenderObject* child_; - Point scroll_offset_; std::unique_ptr<ScrollBarDelegate> scroll_bar_delegate_; diff --git a/include/cru/ui/render/SingleChildRenderObject.h b/include/cru/ui/render/SingleChildRenderObject.h new file mode 100644 index 00000000..cc9e4126 --- /dev/null +++ b/include/cru/ui/render/SingleChildRenderObject.h @@ -0,0 +1,23 @@ +#pragma once +#include "RenderObject.h" + +namespace cru::ui::render { +class CRU_UI_API SingleChildRenderObject : public RenderObject { + CRU_DEFINE_CLASS_LOG_TAG(u"cru::ui::render::SingleChildRenderObject") + + public: + SingleChildRenderObject() = default; + CRU_DELETE_COPY(SingleChildRenderObject) + CRU_DELETE_MOVE(SingleChildRenderObject) + ~SingleChildRenderObject() override = default; + + RenderObject* GetChild() const { return child_; } + void SetChild(RenderObject* new_child); + + protected: + virtual void OnChildChanged(RenderObject* old_child, RenderObject* new_child); + + private: + RenderObject* child_ = nullptr; +}; +} // namespace cru::ui::render diff --git a/include/cru/ui/render/StackLayoutRenderObject.h b/include/cru/ui/render/StackLayoutRenderObject.h index 68b5b30c..65b81b3d 100644 --- a/include/cru/ui/render/StackLayoutRenderObject.h +++ b/include/cru/ui/render/StackLayoutRenderObject.h @@ -1,6 +1,5 @@ #pragma once #include "LayoutRenderObject.h" -#include "cru/ui/Base.h" namespace cru::ui::render { // Measure Logic: diff --git a/include/cru/ui/render/TextRenderObject.h b/include/cru/ui/render/TextRenderObject.h index f3a7332f..db8ff0d0 100644 --- a/include/cru/ui/render/TextRenderObject.h +++ b/include/cru/ui/render/TextRenderObject.h @@ -101,8 +101,6 @@ class CRU_UI_API TextRenderObject : public RenderObject { const MeasureSize& preferred_size) override; void OnLayoutContent(const Rect& content_rect) override; - void OnResize(const Size& size) override; - private: std::shared_ptr<platform::graphics::IBrush> brush_; std::shared_ptr<platform::graphics::IFont> font_; |