From d2ab30e7a69bfe7efda63ae75812207377917bd3 Mon Sep 17 00:00:00 2001
From: miepzerino <o.skotnik@gmail.com>
Date: Sun, 30 Mar 2025 18:50:27 +0000
Subject: [PATCH] Merge branch 'Flexalon-UI-Layouts' into develop

---
 Assets/Flexalon/Samples/Runtime/CustomLayout.cs |   98 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 98 insertions(+), 0 deletions(-)

diff --git a/Assets/Flexalon/Samples/Runtime/CustomLayout.cs b/Assets/Flexalon/Samples/Runtime/CustomLayout.cs
new file mode 100644
index 0000000..76e701c
--- /dev/null
+++ b/Assets/Flexalon/Samples/Runtime/CustomLayout.cs
@@ -0,0 +1,98 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Flexalon.Samples
+{
+    // This is an example of how to implement your own Layout.
+    // The layout strategy is to place the children on after
+    // the other diagonally ascending.
+    // See also CustomLayoutEditor.
+    public class CustomLayout : LayoutBase
+    {
+        [SerializeField]
+        private Vector3 _gap = Vector3.zero;
+
+        private static List<FlexItem> _flexItems = new List<FlexItem>();
+
+        public static Vector3 AggregateLayoutSizes(IReadOnlyList<FlexalonNode> nodes, Vector3 size)
+        {
+            var totalSize = Vector3.zero;
+            foreach (var child in nodes)
+            {
+                // Note: this GetMeasureSize will be 0 for any child axis using SizeType.Fill.
+                totalSize += child.GetMeasureSize(size);
+            }
+
+            return totalSize;
+        }
+
+        private static void ShrinkFillChildren(IReadOnlyList<FlexalonNode> nodes, Vector3 usedSize, Vector3 size, Vector3 gap)
+        {
+            var remainingSpace = size - usedSize;
+            for (int axis = 0; axis < 3; axis++)
+            {
+                if (Mathf.Abs(remainingSpace[axis]) <= 1e-6f)
+                {
+                    continue;
+                }
+
+                _flexItems.Clear();
+                for (int i = 0; i < nodes.Count; i++)
+                {
+                    _flexItems.Add(Flex.CreateFlexItem(
+                        nodes[i], axis, nodes[i].GetMeasureSize(axis, size[axis]), usedSize[axis], size[axis]));
+                }
+
+                Flex.GrowOrShrink(_flexItems, usedSize[axis], size[axis], gap[axis]);
+
+                for (int i = 0; i < nodes.Count; i++)
+                {
+                    nodes[i].SetShrinkFillSize(axis, _flexItems[i].FinalSize, size[axis]);
+                }
+            }
+        }
+
+        // Measure update the size of this node by accounting
+        // for any axes which are assigned SizeType.Layout. This method
+        // should also determine the sizes of any children using SizeType.Fill
+        // by calling SetFillSize.
+        public override Bounds Measure(FlexalonNode node, Vector3 size, Vector3 min, Vector3 max)
+        {
+            // The layout size should be the sum of all child sizes.
+            var aggregateSize = AggregateLayoutSizes(node.Children, size);
+
+            // Make sure to add the gaps between children.
+            aggregateSize += _gap * (node.Children.Count - 1);
+
+            // Clamp the aggregate size between min and max. Note 'size' is already clamped.
+            aggregateSize = Math.Clamp(aggregateSize, min, max);
+
+            // Adjust the size for axes which are SizeType.Layout.
+            for (int axis = 0; axis < 3; axis++)
+            {
+                if (node.GetSizeType(axis) == SizeType.Layout)
+                {
+                    size[axis] = aggregateSize[axis];
+                }
+            }
+
+            // Grow or shrink the children to try to make aggregateSize match size.
+            ShrinkFillChildren(node.Children, aggregateSize, size, _gap);
+
+            return new Bounds(Vector3.zero, size);
+        }
+
+        // Arrange the children in a diagonal pattern.
+        public override void Arrange(FlexalonNode node, Vector3 layoutSize)
+        {
+            var nextPosition = -layoutSize / 2;
+            foreach (var child in node.Children)
+            {
+                var childSize = child.GetArrangeSize();
+                child.SetPositionResult(nextPosition + childSize / 2);
+                child.SetRotationResult(Quaternion.identity);
+                nextPosition += childSize + _gap;
+            }
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3