using UnityEngine; namespace Flexalon { /// <summary> A transform updater determines how an object /// gets from its current position to the computed layout position. </summary> public interface TransformUpdater { /// <summary> Called before the layout system starts updating any transforms. /// Use this to capture the transform position. </summary> /// <param name="node"> The node being updated. </param> void PreUpdate(FlexalonNode node); /// <summary> Called to update the position of the object. </summary> /// <param name="node"> The node being updated. </param> /// <param name="position"> The computed local position of the object. </param> bool UpdatePosition(FlexalonNode node, Vector3 position); /// <summary> Called to update the rotation of the object. </summary> /// <param name="node"> The node being updated. </param> /// <param name="rotation"> The computed local rotation of the object. </param> bool UpdateRotation(FlexalonNode node, Quaternion rotation); /// <summary> Called to update the scale of the object. </summary> /// <param name="node"> The node being updated. </param> /// <param name="scale"> The computed local scale of the object. </param> bool UpdateScale(FlexalonNode node, Vector3 scale); /// <summary> Called to update the rect of the object. </summary> /// <param name="node"> The node being updated. </param> /// <param name="rect"> The computed rect of the object. </param> bool UpdateRectSize(FlexalonNode node, Vector2 rect); } internal class DefaultTransformUpdater : TransformUpdater { private void RecordEdit(FlexalonNode node) { #if UNITY_EDITOR if (Flexalon.RecordFrameChanges) { UnityEditor.Undo.RecordObject(node.GameObject.transform, "Flexalon transform change"); UnityEditor.PrefabUtility.RecordPrefabInstancePropertyModifications(node.GameObject.transform); } #endif } public void PreUpdate(FlexalonNode node) { } public bool UpdatePosition(FlexalonNode node, Vector3 position) { RecordEdit(node); node.GameObject.transform.localPosition = position; return true; } public bool UpdateRotation(FlexalonNode node, Quaternion rotation) { RecordEdit(node); node.GameObject.transform.localRotation = rotation; return true; } public bool UpdateScale(FlexalonNode node, Vector3 scale) { RecordEdit(node); node.GameObject.transform.localScale = scale; return true; } public bool UpdateRectSize(FlexalonNode node, Vector2 size) { RecordEdit(node); var rectTransform = node.GameObject.transform as RectTransform; rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x); rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y); return true; } } }