diff options
author | crupest <crupest@outlook.com> | 2018-11-10 22:11:05 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2018-11-10 22:11:05 +0800 |
commit | 9cf812f77a879d5394a9158ce290f9d7e858de7d (patch) | |
tree | 83bbf3a45687be0a4f22840e295d988972de7b34 /src/ui/window.cpp | |
parent | e5513daa53cb958b0c83d575c440f40aaf40f562 (diff) | |
download | cru-9cf812f77a879d5394a9158ce290f9d7e858de7d.tar.gz cru-9cf812f77a879d5394a9158ce290f9d7e858de7d.tar.bz2 cru-9cf812f77a879d5394a9158ce290f9d7e858de7d.zip |
Refactor layout invalidation system.
Diffstat (limited to 'src/ui/window.cpp')
-rw-r--r-- | src/ui/window.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/ui/window.cpp b/src/ui/window.cpp index 2737b70b..41104924 100644 --- a/src/ui/window.cpp +++ b/src/ui/window.cpp @@ -429,10 +429,32 @@ namespace cru::ui } + void Window::WindowInvalidateLayout() + { + if (is_layout_invalid_) + return; + + is_layout_invalid_ = true; + InvokeLater([this] + { + if (is_layout_invalid_) + Relayout(); + }); + } + void Window::Relayout() { OnMeasureCore(GetSize()); OnLayoutCore(Rect(Point::Zero(), GetSize())); + is_layout_invalid_ = false; + } + + void Window::SetSizeFitContent(const Size& max_size) + { + OnMeasureCore(max_size); + SetClientSize(GetDesiredSize()); + OnLayoutCore(Rect(Point::Zero(), GetSize())); + is_layout_invalid_ = false; } void Window::RefreshControlList() { @@ -597,7 +619,7 @@ namespace cru::ui void Window::OnResizeInternal(const int new_width, const int new_height) { render_target_->ResizeBuffer(new_width, new_height); if (!(new_width == 0 && new_height == 0)) - InvalidateLayout(); + WindowInvalidateLayout(); } void Window::OnSetFocusInternal() |