diff options
author | 杨宇千 <crupest@outlook.com> | 2019-09-16 22:11:11 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-09-16 22:11:11 +0800 |
commit | 465d89b4207cce929dc8e0b6ac93c3533ba19408 (patch) | |
tree | 157df74f42d46d9b631163c087fd126f2eed021b /src | |
parent | f1da8e06253748887ae769845a6e605d56d5789b (diff) | |
download | cru-465d89b4207cce929dc8e0b6ac93c3533ba19408.tar.gz cru-465d89b4207cce929dc8e0b6ac93c3533ba19408.tar.bz2 cru-465d89b4207cce929dc8e0b6ac93c3533ba19408.zip |
...
Diffstat (limited to 'src')
-rw-r--r-- | src/ui/render/window_render_object.cpp | 47 | ||||
-rw-r--r-- | src/ui/window.cpp | 26 |
2 files changed, 46 insertions, 27 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}); diff --git a/src/ui/window.cpp b/src/ui/window.cpp index 13784718..25dffe11 100644 --- a/src/ui/window.cpp +++ b/src/ui/window.cpp @@ -135,21 +135,6 @@ render::RenderObject* Window::GetRenderObject() const { return render_object_.get(); } -void Window::Relayout() { this->render_object_->MeasureAndLayout(); } - -void Window::InvalidateLayout() { - if (!need_layout_) { - platform::native::UiApplication::GetInstance()->InvokeLater( - [resolver = this->CreateResolver()] { - if (const auto window = resolver.Resolve()) { - window->Relayout(); - window->need_layout_ = false; - } - }); - need_layout_ = true; - } -} - bool Window::RequestFocusFor(Control* control) { assert(control != nullptr); // The control to request focus can't be null. // You can set it as the window. @@ -216,7 +201,7 @@ void Window::OnNativePaint(std::nullptr_t) { } void Window::OnNativeResize(const Size& size) { - render_object_->MeasureAndLayout(); + render_object_->GetRenderHost()->InvalidateLayout(); } void Window::OnNativeFocus(bool focus) { @@ -241,13 +226,16 @@ void Window::OnNativeMouseMove(const Point& point) { mouse_hover_control_ = new_mouse_hover_control; if (mouse_captured_control_) { - const auto n = FindLowestCommonAncestor(new_mouse_hover_control, mouse_captured_control_); - const auto o = FindLowestCommonAncestor(old_mouse_hover_control, mouse_captured_control_); + const auto n = FindLowestCommonAncestor(new_mouse_hover_control, + mouse_captured_control_); + const auto o = FindLowestCommonAncestor(old_mouse_hover_control, + mouse_captured_control_); bool a = IsAncestor(o, n); if (a) { DispatchEvent(event_names::MouseLeave, o, &Control::MouseLeaveEvent, n); } else { - DispatchEvent(event_names::MouseEnter, n, &Control::MouseEnterEvent, o, point); + DispatchEvent(event_names::MouseEnter, n, &Control::MouseEnterEvent, o, + point); } DispatchEvent(event_names::MouseMove, mouse_captured_control_, &Control::MouseMoveEvent, nullptr, point); |