aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/window_render_object.cpp
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-09-16 22:11:11 +0800
committer杨宇千 <crupest@outlook.com>2019-09-16 22:11:11 +0800
commit465d89b4207cce929dc8e0b6ac93c3533ba19408 (patch)
tree157df74f42d46d9b631163c087fd126f2eed021b /src/ui/render/window_render_object.cpp
parentf1da8e06253748887ae769845a6e605d56d5789b (diff)
downloadcru-465d89b4207cce929dc8e0b6ac93c3533ba19408.tar.gz
cru-465d89b4207cce929dc8e0b6ac93c3533ba19408.tar.bz2
cru-465d89b4207cce929dc8e0b6ac93c3533ba19408.zip
...
Diffstat (limited to 'src/ui/render/window_render_object.cpp')
-rw-r--r--src/ui/render/window_render_object.cpp47
1 files changed, 39 insertions, 8 deletions
diff --git a/src/ui/render/window_render_object.cpp b/src/ui/render/window_render_object.cpp
index e61dd286..e2e96897 100644
--- a/src/ui/render/window_render_object.cpp
+++ b/src/ui/render/window_render_object.cpp
@@ -1,33 +1,64 @@
#include "cru/ui/render/window_render_object.hpp"
+#include "cru/common/logger.hpp"
#include "cru/platform/graph/util/painter_util.hpp"
#include "cru/platform/native/native_window.hpp"
+#include "cru/platform/native/ui_application.hpp"
#include "cru/ui/window.hpp"
#include <cassert>
namespace cru::ui::render {
-class WindowRenderHost : public IRenderHost {
+class WindowRenderHost : public IRenderHost,
+ public SelfResolvable<WindowRenderHost> {
public:
- WindowRenderHost(Window* window) : window_(window) {
- assert(window != nullptr);
+ WindowRenderHost(WindowRenderObject* render_object)
+ : render_object_(render_object) {
+ assert(render_object != nullptr);
}
- void InvalidateLayout() override { window_->InvalidateLayout(); }
+ void InvalidateLayout() override;
- void InvalidatePaint() override { window_->GetNativeWindow()->Repaint(); }
+ void InvalidatePaint() override {
+ render_object_->GetWindow()->GetNativeWindow()->Repaint();
+ }
+
+ IEvent<AfterLayoutEventArgs>* AfterLayoutEvent() override {
+ return &after_layout_event_;
+ }
private:
- Window* window_;
+ WindowRenderObject* render_object_;
+
+ bool need_layout_ = false;
+
+ Event<AfterLayoutEventArgs> after_layout_event_;
};
+void WindowRenderHost::InvalidateLayout() {
+ if (!need_layout_) {
+ log::Debug(L"A relayout is required.");
+ platform::native::UiApplication::GetInstance()->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(L"A relayout finished.");
+ host->InvalidatePaint();
+ }
+ });
+ need_layout_ = true;
+ }
+}
+
WindowRenderObject::WindowRenderObject(Window* window)
- : window_(window), render_host_(new WindowRenderHost(window)) {
+ : window_(window), render_host_(new WindowRenderHost(this)) {
SetChildMode(ChildMode::Single);
SetRenderHost(render_host_.get());
}
-void WindowRenderObject::MeasureAndLayout() {
+void WindowRenderObject::Relayout() {
const auto client_size = window_->GetNativeWindow()->GetClientSize();
Measure(client_size);
Layout(Rect{Point{}, client_size});