aboutsummaryrefslogtreecommitdiff
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
parente5513daa53cb958b0c83d575c440f40aaf40f562 (diff)
downloadcru-9cf812f77a879d5394a9158ce290f9d7e858de7d.tar.gz
cru-9cf812f77a879d5394a9158ce290f9d7e858de7d.tar.bz2
cru-9cf812f77a879d5394a9158ce290f9d7e858de7d.zip
Refactor layout invalidation system.
-rw-r--r--src/main.cpp3
-rw-r--r--src/ui/control.cpp2
-rw-r--r--src/ui/layout_base.cpp18
-rw-r--r--src/ui/layout_base.hpp7
-rw-r--r--src/ui/window.cpp24
-rw-r--r--src/ui/window.hpp8
6 files changed, 32 insertions, 30 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 269da573..f5eb655a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -139,8 +139,7 @@ int APIENTRY wWinMain(
popup->AddChild(menu);
- popup->Relayout();
- popup->SetClientSize(menu->GetSize());
+ popup->SetSizeFitContent();
popup->Show();
});
diff --git a/src/ui/control.cpp b/src/ui/control.cpp
index ed904de1..2d09a382 100644
--- a/src/ui/control.cpp
+++ b/src/ui/control.cpp
@@ -238,7 +238,7 @@ namespace cru::ui
void Control::InvalidateLayout()
{
if (const auto window = GetWindow())
- LayoutManager::GetInstance()->InvalidateWindowLayout(window);
+ window->WindowInvalidateLayout();
}
void Control::Measure(const Size& available_size)
diff --git a/src/ui/layout_base.cpp b/src/ui/layout_base.cpp
index 5363c52b..40bb71b3 100644
--- a/src/ui/layout_base.cpp
+++ b/src/ui/layout_base.cpp
@@ -68,24 +68,6 @@ namespace cru::ui
RefreshControlPositionCacheInternal(control, point);
}
- void LayoutManager::InvalidateWindowLayout(Window* window)
- {
- layout_invalid_windows_.insert(window);
-
- if (layout_invalid_windows_.size() == 1)
- InvokeLater([this]()
- {
- this->RefreshInvalidWindowLayout();
- });
- }
-
- void LayoutManager::RefreshInvalidWindowLayout()
- {
- for (const auto window : layout_invalid_windows_)
- window->Relayout();
- layout_invalid_windows_.clear();
- }
-
void LayoutManager::RefreshControlPositionCacheInternal(Control * control, const Point & parent_lefttop_absolute)
{
const auto position = control->GetPositionRelative();
diff --git a/src/ui/layout_base.hpp b/src/ui/layout_base.hpp
index d8e4e2d1..7ae6f65c 100644
--- a/src/ui/layout_base.hpp
+++ b/src/ui/layout_base.hpp
@@ -132,13 +132,6 @@ namespace cru::ui
//Refresh position cache of the control and its descendants immediately.
static void RefreshControlPositionCache(Control* control);
-
- //*************** region: layout ***************
-
- void InvalidateWindowLayout(Window* window);
-
- void RefreshInvalidWindowLayout();
-
private:
static void RefreshControlPositionCacheInternal(Control* control, const Point& parent_lefttop_absolute);
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()
diff --git a/src/ui/window.hpp b/src/ui/window.hpp
index 963bff78..05b1a259 100644
--- a/src/ui/window.hpp
+++ b/src/ui/window.hpp
@@ -192,8 +192,12 @@ namespace cru::ui
//*************** region: layout ***************
+ void WindowInvalidateLayout();
+
void Relayout();
+ void SetSizeFitContent(const Size& max_size = Size(1000, 1000));
+
//*************** region: functions ***************
//Refresh control list.
@@ -319,7 +323,9 @@ namespace cru::ui
Control* focus_control_ = this; // "focus_control_" can't be nullptr
Control* mouse_capture_control_ = nullptr;
-
+
+ bool is_layout_invalid_ = false;
+
#ifdef CRU_DEBUG_LAYOUT
bool debug_layout_ = false;
#endif