aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ui/render/border_render_object.cpp9
-rw-r--r--src/ui/render/flex_layout_render_object.cpp4
-rw-r--r--src/ui/render/render_object.cpp13
-rw-r--r--src/ui/render/text_render_object.cpp2
-rw-r--r--src/ui/render/window_render_object.cpp35
5 files changed, 55 insertions, 8 deletions
diff --git a/src/ui/render/border_render_object.cpp b/src/ui/render/border_render_object.cpp
index 68e74740..6af76b32 100644
--- a/src/ui/render/border_render_object.cpp
+++ b/src/ui/render/border_render_object.cpp
@@ -9,7 +9,10 @@
#include <cassert>
namespace cru::ui::render {
-BorderRenderObject::BorderRenderObject() { RecreateGeometry(); }
+BorderRenderObject::BorderRenderObject() {
+ SetChildMode(ChildMode::Single);
+ RecreateGeometry();
+}
BorderRenderObject::~BorderRenderObject() {}
@@ -61,10 +64,6 @@ RenderObject* BorderRenderObject::HitTest(const Point& point) {
}
}
-void BorderRenderObject::OnAddChild(RenderObject* new_child, int position) {
- assert(GetChildren().size() == 1);
-}
-
void BorderRenderObject::OnSizeChanged(const Size& old_size,
const Size& new_size) {
RecreateGeometry();
diff --git a/src/ui/render/flex_layout_render_object.cpp b/src/ui/render/flex_layout_render_object.cpp
index c4bdd874..416f39bd 100644
--- a/src/ui/render/flex_layout_render_object.cpp
+++ b/src/ui/render/flex_layout_render_object.cpp
@@ -7,6 +7,10 @@
#include <functional>
namespace cru::ui::render {
+FlexLayoutRenderObject::FlexLayoutRenderObject() {
+ SetChildMode(ChildMode::Multiple);
+}
+
FlexChildLayoutData* FlexLayoutRenderObject::GetChildLayoutData(int position) {
assert(position >= 0 &&
position < child_layout_data_.size()); // Position out of bound.
diff --git a/src/ui/render/render_object.cpp b/src/ui/render/render_object.cpp
index a083403b..dcd2f0b9 100644
--- a/src/ui/render/render_object.cpp
+++ b/src/ui/render/render_object.cpp
@@ -7,6 +7,9 @@
namespace cru::ui::render {
void RenderObject::AddChild(RenderObject* render_object, const int position) {
+ assert(child_mode_ == ChildMode::None);
+ assert(child_mode_ == ChildMode::Single && children_.size() > 0);
+
assert(render_object->GetParent() ==
nullptr); // Render object already has a parent.
assert(position >= 0); // Position index is less than 0.
@@ -41,9 +44,15 @@ void RenderObject::Layout(const Rect& rect) {
void RenderObject::OnParentChanged(RenderObject* old_parent,
RenderObject* new_parent) {}
-void RenderObject::OnAddChild(RenderObject* new_child, int position) {}
+void RenderObject::OnAddChild(RenderObject* new_child, int position) {
+ InvalidateLayout();
+ InvalidatePaint();
+}
-void RenderObject::OnRemoveChild(RenderObject* removed_child, int position) {}
+void RenderObject::OnRemoveChild(RenderObject* removed_child, int position) {
+ InvalidateLayout();
+ InvalidatePaint();
+}
void RenderObject::OnSizeChanged(const Size& old_size, const Size& new_size) {}
diff --git a/src/ui/render/text_render_object.cpp b/src/ui/render/text_render_object.cpp
index 64a34b6c..49d7bcb4 100644
--- a/src/ui/render/text_render_object.cpp
+++ b/src/ui/render/text_render_object.cpp
@@ -16,6 +16,8 @@ TextRenderObject::TextRenderObject(
assert(font);
assert(selection_brush);
+ SetChildMode(ChildMode::None);
+
brush.swap(brush_);
font.swap(font_);
selection_brush.swap(selection_brush_);
diff --git a/src/ui/render/window_render_object.cpp b/src/ui/render/window_render_object.cpp
index 18faeee8..e61dd286 100644
--- a/src/ui/render/window_render_object.cpp
+++ b/src/ui/render/window_render_object.cpp
@@ -7,6 +7,26 @@
#include <cassert>
namespace cru::ui::render {
+class WindowRenderHost : public IRenderHost {
+ public:
+ WindowRenderHost(Window* window) : window_(window) {
+ assert(window != nullptr);
+ }
+
+ void InvalidateLayout() override { window_->InvalidateLayout(); }
+
+ void InvalidatePaint() override { window_->GetNativeWindow()->Repaint(); }
+
+ private:
+ Window* window_;
+};
+
+WindowRenderObject::WindowRenderObject(Window* window)
+ : window_(window), render_host_(new WindowRenderHost(window)) {
+ SetChildMode(ChildMode::Single);
+ SetRenderHost(render_host_.get());
+}
+
void WindowRenderObject::MeasureAndLayout() {
const auto client_size = window_->GetNativeWindow()->GetClientSize();
Measure(client_size);
@@ -35,8 +55,21 @@ RenderObject* WindowRenderObject::HitTest(const Point& point) {
return Rect{Point{}, GetSize()}.IsPointInside(point) ? this : nullptr;
}
+namespace {
+void SetRenderHostRecursive(RenderObject* render_object, IRenderHost* host) {
+ render_object->SetRenderHost(host);
+ for (const auto child : render_object->GetChildren()) {
+ SetRenderHostRecursive(render_object, host);
+ }
+}
+} // namespace
+
void WindowRenderObject::OnAddChild(RenderObject* new_child, int position) {
- assert(GetChildren().size() == 1);
+ SetRenderHostRecursive(new_child, render_host_.get());
+}
+
+void WindowRenderObject::OnRemoveChild(RenderObject* new_child, int position) {
+ SetRenderHostRecursive(new_child, nullptr);
}
Size WindowRenderObject::OnMeasureContent(const Size& available_size) {