aboutsummaryrefslogtreecommitdiff
path: root/src
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
parentf1da8e06253748887ae769845a6e605d56d5789b (diff)
downloadcru-465d89b4207cce929dc8e0b6ac93c3533ba19408.tar.gz
cru-465d89b4207cce929dc8e0b6ac93c3533ba19408.tar.bz2
cru-465d89b4207cce929dc8e0b6ac93c3533ba19408.zip
...
Diffstat (limited to 'src')
-rw-r--r--src/ui/render/window_render_object.cpp47
-rw-r--r--src/ui/window.cpp26
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);