aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render/StackLayoutRenderObject.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-05-24 01:40:02 +0800
committercrupest <crupest@outlook.com>2020-05-24 01:40:02 +0800
commitd86a71f79afe0e4dac768f61d6bff690567aca5b (patch)
tree4957e9a64c77680deb07201fbd879bf036616dae /src/ui/render/StackLayoutRenderObject.cpp
parentf3a8fd608a9776ef0a5f547da918a32cf6074060 (diff)
downloadcru-d86a71f79afe0e4dac768f61d6bff690567aca5b.tar.gz
cru-d86a71f79afe0e4dac768f61d6bff690567aca5b.tar.bz2
cru-d86a71f79afe0e4dac768f61d6bff690567aca5b.zip
...
Diffstat (limited to 'src/ui/render/StackLayoutRenderObject.cpp')
-rw-r--r--src/ui/render/StackLayoutRenderObject.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/ui/render/StackLayoutRenderObject.cpp b/src/ui/render/StackLayoutRenderObject.cpp
new file mode 100644
index 00000000..d08e136d
--- /dev/null
+++ b/src/ui/render/StackLayoutRenderObject.cpp
@@ -0,0 +1,49 @@
+#include "cru/ui/render/StackLayoutRenderObject.hpp"
+
+#include <algorithm>
+
+namespace cru::ui::render {
+Size StackLayoutRenderObject::OnMeasureContent(const Size& available_size) {
+ auto size = Size{};
+ for (const auto child : GetChildren()) {
+ child->Measure(available_size);
+ const auto& preferred_size = child->GetPreferredSize();
+ size.width = std::max(size.width, preferred_size.width);
+ size.height = std::max(size.height, preferred_size.height);
+ }
+ return size;
+}
+
+void StackLayoutRenderObject::OnLayoutContent(const Rect& rect) {
+ auto calculate_anchor = [](int alignment, float start_point,
+ float total_length,
+ float content_length) -> float {
+ switch (alignment) {
+ case internal::align_start:
+ return start_point;
+ case internal::align_center:
+ return start_point + (total_length - content_length) / 2.0f;
+ case internal::align_end:
+ return start_point + total_length - content_length;
+ default:
+ return 0;
+ }
+ };
+
+ const auto count = GetChildCount();
+ const auto& children = GetChildren();
+
+ for (int i = 0; i < count; i++) {
+ const auto layout_data = GetChildLayoutData(i);
+ const auto child = children[i];
+ const auto& size = child->GetPreferredSize();
+ child->Layout(
+ Rect{calculate_anchor(static_cast<int>(layout_data->horizontal),
+ rect.left, rect.width, size.width),
+ calculate_anchor(static_cast<int>(layout_data->vertical), rect.top,
+ rect.height, size.height),
+ size.width, size.height});
+ }
+}
+
+} // namespace cru::ui::render