aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/window_render_object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/render/window_render_object.cpp')
-rw-r--r--src/ui/render/window_render_object.cpp35
1 files changed, 34 insertions, 1 deletions
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) {