aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/render')
-rw-r--r--src/ui/render/render_object.cpp16
-rw-r--r--src/ui/render/window_render_object.cpp65
2 files changed, 16 insertions, 65 deletions
diff --git a/src/ui/render/render_object.cpp b/src/ui/render/render_object.cpp
index e329d150..4a1bedf3 100644
--- a/src/ui/render/render_object.cpp
+++ b/src/ui/render/render_object.cpp
@@ -1,6 +1,7 @@
#include "cru/ui/render/render_object.hpp"
#include "cru/common/logger.hpp"
+#include "cru/ui/ui_host.hpp"
#include <algorithm>
@@ -18,7 +19,7 @@ void RenderObject::AddChild(RenderObject* render_object, const Index position) {
children_.insert(children_.cbegin() + position, render_object);
render_object->SetParent(this);
- render_object->SetRenderHostRecursive(GetRenderHost());
+ render_object->SetRenderHostRecursive(GetUiHost());
OnAddChild(render_object, position);
}
@@ -165,6 +166,14 @@ void RenderObject::SetParent(RenderObject* new_parent) {
OnParentChanged(old_parent, new_parent);
}
+void RenderObject::InvalidateLayout() {
+ if (ui_host_ != nullptr) ui_host_->InvalidateLayout();
+}
+
+void RenderObject::InvalidatePaint() {
+ if (ui_host_ != nullptr) ui_host_->InvalidatePaint();
+}
+
void RenderObject::NotifyAfterLayoutRecursive(RenderObject* render_object) {
render_object->OnAfterLayout();
for (const auto o : render_object->GetChildren()) {
@@ -172,11 +181,10 @@ void RenderObject::NotifyAfterLayoutRecursive(RenderObject* render_object) {
}
}
-void RenderObject::SetRenderHostRecursive(IRenderHost* host) {
- SetRenderHost(host);
+void RenderObject::SetRenderHostRecursive(UiHost* host) {
+ ui_host_ = host;
for (const auto child : GetChildren()) {
child->SetRenderHostRecursive(host);
}
}
-
} // namespace cru::ui::render
diff --git a/src/ui/render/window_render_object.cpp b/src/ui/render/window_render_object.cpp
index 29313645..abed6fa4 100644
--- a/src/ui/render/window_render_object.cpp
+++ b/src/ui/render/window_render_object.cpp
@@ -1,74 +1,17 @@
#include "cru/ui/render/window_render_object.hpp"
#include "../helper.hpp"
-#include "cru/common/logger.hpp"
#include "cru/platform/graph/util/painter.hpp"
-#include "cru/platform/native/ui_application.hpp"
-#include "cru/platform/native/window.hpp"
-#include "cru/ui/window.hpp"
+#include "cru/ui/ui_host.hpp"
namespace cru::ui::render {
-class WindowRenderHost : public IRenderHost,
- public SelfResolvable<WindowRenderHost> {
- public:
- WindowRenderHost(WindowRenderObject* render_object)
- : render_object_(render_object) {
- Expects(render_object != nullptr);
- }
-
- void InvalidateLayout() override;
-
- void InvalidatePaint() override {
- if (const auto native_window =
- render_object_->GetWindow()->ResolveNativeWindow())
- native_window->RequestRepaint();
- }
-
- IEvent<AfterLayoutEventArgs>* AfterLayoutEvent() override {
- return &after_layout_event_;
- }
-
- private:
- WindowRenderObject* render_object_;
-
- bool need_layout_ = false;
-
- Event<AfterLayoutEventArgs> after_layout_event_;
-};
-
-void WindowRenderHost::InvalidateLayout() {
- if (!need_layout_) {
- log::Debug("A relayout is required.");
- GetUiApplication()->InvokeLater([resolver = this->CreateResolver()] {
- if (const auto host = resolver.Resolve()) {
- host->render_object_->Relayout();
- host->need_layout_ = false;
- host->after_layout_event_.Raise(AfterLayoutEventArgs{});
- log::Debug("A relayout finished.");
- host->InvalidatePaint();
- }
- });
- need_layout_ = true;
- }
-}
-
-WindowRenderObject::WindowRenderObject(Window* window)
- : window_(window), render_host_(new WindowRenderHost(this)) {
+WindowRenderObject::WindowRenderObject(UiHost* host) {
SetChildMode(ChildMode::Single);
- SetRenderHost(render_host_.get());
- after_layout_event_guard_.Reset(render_host_->AfterLayoutEvent()->AddHandler(
+ ui_host_ = host;
+ after_layout_event_guard_.Reset(host->AfterLayoutEvent()->AddHandler(
[this](auto) { NotifyAfterLayoutRecursive(this); }));
}
-void WindowRenderObject::Relayout() {
- const auto native_window = window_->ResolveNativeWindow();
- const auto client_size = native_window
- ? native_window->GetClientSize()
- : Size{100, 100}; // a reasonable assumed size
- Measure(client_size);
- Layout(Rect{Point{}, client_size});
-}
-
void WindowRenderObject::Draw(platform::graph::IPainter* painter) {
painter->Clear(colors::white);
if (const auto child = GetChild()) {