aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/render
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/ui/render')
-rw-r--r--include/cru/ui/render/Base.h12
-rw-r--r--include/cru/ui/render/BorderRenderObject.h46
-rw-r--r--include/cru/ui/render/FlexLayoutRenderObject.h18
-rw-r--r--include/cru/ui/render/LayoutHelper.h6
-rw-r--r--include/cru/ui/render/LayoutRenderObject.h12
-rw-r--r--include/cru/ui/render/MeasureRequirement.h3
-rw-r--r--include/cru/ui/render/RenderObject.h4
-rw-r--r--include/cru/ui/render/ScrollBar.h1
-rw-r--r--include/cru/ui/render/ScrollRenderObject.h13
-rw-r--r--include/cru/ui/render/SingleChildRenderObject.h23
-rw-r--r--include/cru/ui/render/StackLayoutRenderObject.h1
-rw-r--r--include/cru/ui/render/TextRenderObject.h2
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_;