diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ui/render/border_render_object.cpp | 9 | ||||
-rw-r--r-- | src/ui/render/flex_layout_render_object.cpp | 4 | ||||
-rw-r--r-- | src/ui/render/render_object.cpp | 13 | ||||
-rw-r--r-- | src/ui/render/text_render_object.cpp | 2 | ||||
-rw-r--r-- | src/ui/render/window_render_object.cpp | 35 |
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) { |