/// <summary> /// /// </summary> /// <param name="self"></param> public static void ClearLayouts(this ILayoutTarget self) { while (0 < self.Layouts.Count) { self.RemoveLayout(self.Layouts[self.Layouts.Count - 1]); } }
/// <summary> /// 親のサイズが変更された時はAnchorMin/MaxとAnchorOffsetMin/Maxが変更されないようにパラメータを変更してください /// </summary> /// <param name="parent"></param> void ParentOnChangedLocalSize(ILayoutTarget parent, Vector3 prevLocalSize) { if (parent != Parent) { return; } if (IsAutoUpdate) { FollowParent(); } }
public static IEnumerable <ILayoutTarget> GetHierarchyEnumerable(this ILayoutTarget self) { return(new HierachyEnumerable(self)); }
/// <summary> /// /// </summary> /// <param name="self"></param> /// <returns></returns> public static IEnumerable <ILayoutTarget> GetParentEnumerable(this ILayoutTarget self) { return(new ParentEnumerable(self)); }
/// <summary> /// /// </summary> /// <param name="self"></param> /// <returns></returns> public static LayoutTargetAnchorMode AnchorMode(this ILayoutTarget self) { return(self.AnchorMin.AreNearlyEqual(self.AnchorMax, LayoutDefines.NUMBER_PRECISION) ? LayoutTargetAnchorMode.Point : LayoutTargetAnchorMode.Area); }
/// <summary> /// この関数はILayoutTarget.UpdateLocalSizeWithAnchorParam(self.AnchorMin, self.AnchorMax, min, max)と同じです。 /// </summary> /// <param name="self"></param> /// <param name="min"></param> /// <param name="max"></param> public static void SetAnchorOffset(this ILayoutTarget self, Vector3 min, Vector3 max) { self.UpdateAnchorParam(self.AnchorMin, self.AnchorMax, min, max); }
/// <summary> /// この関数はILayoutTarget.UpdateLocalSizeWithAnchorParam(min, max, self.AnchorOffsetMin, self.AnchorOffsetMax)と同じです。 /// </summary> /// <param name="self"></param> /// <param name="min"></param> /// <param name="max"></param> public static void SetAnchor(this ILayoutTarget self, Vector3 min, Vector3 max) { var offset = self.AnchorOffsetMinMax(); self.UpdateAnchorParam(min, max, offset.offsetMin, offset.offsetMax); }
/// <summary> /// Pivotによるオフセットを計算します。 /// ILayoutTarget#Offsetの影響はないものになります。 /// </summary> /// <param name="self"></param> /// <returns></returns> public static Vector3 PivotOffset(this ILayoutTarget self) { return(-self.LocalSize.Mul(self.Pivot - Vector3.one * 0.5f)); }
/// <summary> /// LocalSizeを指定したサイズに変更します。 /// /// この関数によってAnchorMin/Max, Offsetは変更されません。 /// </summary> /// <param name="self"></param> /// <param name="min"></param> public static void SetLocalSize(this ILayoutTarget self, Vector3 localSize) { localSize = Vector3.Max(localSize, Vector3.zero); self.UpdateLocalSize(localSize, self.Offset); }
/// <summary> /// AnchorAreaからのLocalSizeのオフセットを返します。 /// 返される値の正負はAnchorAreaから外側方向に正の数、内側に負の数になっています。 /// /// /// + | - <- AnchorOffsetMin /// --a-----O-----A--- /// - | + AnchorOffsetMax /// /// a: AnchorMinPos /// A: AnchorMaxPos /// </summary> /// <param name="self"></param> /// <returns></returns> public static (Vector3 offsetMin, Vector3 offsetMax) AnchorOffsetMinMax(this ILayoutTarget self) { var(min, max) = self.AnchorAreaMinMaxPos(); var(localMin, localMax) = self.LocalAreaMinMaxPos(); return(-(localMin - min), localMax - max); }
/// <summary> /// 自身のローカル領域のMin/Max位置を取得する。 /// /// AnchorOffsetMin/Maxの影響を受けます。 /// </summary> /// <param name="self"></param> /// <returns></returns> public static (Vector3 min, Vector3 max) LocalAreaMinMaxPos(this ILayoutTarget self) { var halfSize = self.LocalSize * 0.5f; return(-halfSize + self.Offset, halfSize + self.Offset); }
/// <summary> /// アンカー領域のMin/Max位置を取得する。 /// /// この関数の返り値はAnchorOffsetMin/Maxの影響を受けません。 /// </summary> /// <param name="self"></param> /// <returns></returns> public static (Vector3 min, Vector3 max) AnchorAreaMinMaxPos(this ILayoutTarget self) { var halfParentAreaSize = self.AnchorAreaSize() * 0.5f; return(-halfParentAreaSize, halfParentAreaSize); }
/// <summary> /// 現在のアンカー領域のサイズを返します。 /// /// AnchorMode() == Pointの場合は0サイズを返します。 /// </summary> /// <param name="self"></param> /// <returns></returns> public static Vector3 AnchorAreaSize(this ILayoutTarget self) { return(self.PrevParentSize.Mul(self.AnchorMax - self.AnchorMin)); }
/// <summary> /// ParentがNullの場合は0サイズを返します。 /// </summary> /// <param name="self"></param> /// <returns></returns> public static Vector3 ParentLocalSize(this ILayoutTarget self) => self.Parent?.LocalSize ?? Vector3.zero;
/// <summary> /// レイアウト計算用のサイズを返します。 /// </summary> /// <param name="self"></param> /// <returns></returns> public static Vector3 LayoutSize(this ILayoutTarget self) { return(self.LayoutInfo.GetLayoutSize(self)); }
/// <summary> /// この関数はILayoutTarget.UpdateLocalSizeWithSizeAndAnchorParam(self.LocalSize, offset)と同じです。 /// </summary> /// <param name="self"></param> /// <param name="offset"></param> public static void SetOffset(this ILayoutTarget self, Vector3 offset) { self.UpdateLocalSize(self.LocalSize, offset); }
virtual protected void InnerOnChangedTarget(ILayoutTarget current, ILayoutTarget prev) { }
protected override void InnerOnChangedTarget(ILayoutTarget current, ILayoutTarget prev) { CallCounterOnChangedTarget++; CurrentOnChangedTarget = current; PrevOnChangedTarget = prev; }