using System.Linq; namespace RosettaUI.Builder { public static class LayoutHint { public static bool IsIndentOrigin(Element element) => element is PageElement or WindowElement; /// /// 子のマイナスインデントを許容しないElement /// マイナスインデントは親の左側をはみ出るので Box や Fold では絵的にまずい /// public static bool IsIndentWall(Element element) => element is BoxElement or FoldElement or TabsElement or ScrollViewElement || IsIndentOrigin(element); /// /// Foldなど、ラベルの左側にあるElementは1つ目のインデントを無視することで通常のラベルと並びが揃う /// この1つ目のインデントがあるかどうかの判定 /// public static bool CanMinusIndent(this Element element) { for (var e = element; e.Parent != null && !IsIndentWall(e.Parent); e = e.Parent) { switch (e.Parent) { // Row内なら一番左のみ有効 case RowElement row when row.Children.FirstOrDefault() != e: return false; case IndentElement or ListViewItemContainerElement: return true; } } return false; } public static bool IsPrefix(this LabelElement label) { return label.labelType == LabelType.Prefix && label.IsMostLeftLabel(); } public static bool IsMostLeftLabel(this LabelElement element) { for (Element e = element; e.Parent != null && !IsIndentWall(e.Parent); e = e.Parent) { switch (e.Parent) { case RowElement row when row.Children.FirstOrDefault() != e && row.FirstLabel() != element: return false; case CompositeFieldElement c when c.Label != e: return false; } } return true; } } }