diff options
Diffstat (limited to 'src/ui/render/WindowRenderObject.cpp')
-rw-r--r-- | src/ui/render/WindowRenderObject.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/ui/render/WindowRenderObject.cpp b/src/ui/render/WindowRenderObject.cpp new file mode 100644 index 00000000..cd1f806f --- /dev/null +++ b/src/ui/render/WindowRenderObject.cpp @@ -0,0 +1,45 @@ +#include "cru/ui/render/WindowRenderObject.hpp" + +#include "../Helper.hpp" +#include "cru/platform/graph/util/Painter.hpp" +#include "cru/ui/UiHost.hpp" + +namespace cru::ui::render { +WindowRenderObject::WindowRenderObject(UiHost* host) { + SetChildMode(ChildMode::Single); + ui_host_ = host; + after_layout_event_guard_.Reset(host->AfterLayoutEvent()->AddHandler( + [this](auto) { NotifyAfterLayoutRecursive(this); })); +} + +void WindowRenderObject::Draw(platform::graph::IPainter* painter) { + painter->Clear(colors::white); + if (const auto child = GetChild()) { + auto offset = child->GetOffset(); + platform::graph::util::WithTransform( + painter, platform::Matrix::Translation(offset.x, offset.y), + [child](platform::graph::IPainter* p) { child->Draw(p); }); + } +} + +RenderObject* WindowRenderObject::HitTest(const Point& point) { + if (const auto child = GetChild()) { + auto offset = child->GetOffset(); + Point p{point.x - offset.x, point.y - offset.y}; + const auto result = child->HitTest(p); + if (result != nullptr) { + return result; + } + } + return Rect{Point{}, GetSize()}.IsPointInside(point) ? this : nullptr; +} + +Size WindowRenderObject::OnMeasureContent(const Size& available_size) { + if (const auto child = GetChild()) child->Measure(available_size); + return available_size; +} + +void WindowRenderObject::OnLayoutContent(const Rect& content_rect) { + if (const auto child = GetChild()) child->Layout(content_rect); +} +} // namespace cru::ui::render |