aboutsummaryrefslogtreecommitdiff
path: root/src/ui/window.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-11-10 22:11:05 +0800
committercrupest <crupest@outlook.com>2018-11-10 22:11:05 +0800
commit9cf812f77a879d5394a9158ce290f9d7e858de7d (patch)
tree83bbf3a45687be0a4f22840e295d988972de7b34 /src/ui/window.cpp
parente5513daa53cb958b0c83d575c440f40aaf40f562 (diff)
downloadcru-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.cpp24
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()