private bool ValidateSubTree(VisualElement root) { if (root.renderData.lastLayout != new Rect(root.cssNode.LayoutX, root.cssNode.LayoutY, root.cssNode.LayoutWidth, root.cssNode.LayoutHeight)) { root.Dirty(ChangeType.Transform); root.renderData.lastLayout = new Rect(root.cssNode.LayoutX, root.cssNode.LayoutY, root.cssNode.LayoutWidth, root.cssNode.LayoutHeight); } bool hasNewLayout = root.cssNode.HasNewLayout; if (hasNewLayout) { for (int i = 0; i < root.shadow.childCount; i++) { this.ValidateSubTree(root.shadow[i]); } } using (PostLayoutEvent pooled = PostLayoutEvent.GetPooled(hasNewLayout)) { pooled.target = root; UIElementsUtility.eventDispatcher.DispatchEvent(pooled, this); } root.ClearDirty(ChangeType.Layout); root.cssNode.MarkLayoutSeen(); return(hasNewLayout); }
void ValidateSubTree(VisualElement root) { Rect cssRect = new Rect(root.cssNode.LayoutX, root.cssNode.LayoutY, root.cssNode.LayoutWidth, root.cssNode.LayoutHeight); Rect lastRect = root.renderData.lastLayout; bool rectChanged = lastRect != cssRect; // if the last layout rect is different than the current one we must dirty transform on children if (rectChanged) { if (lastRect.position != cssRect.position) { root.Dirty(ChangeType.Transform); } root.renderData.lastLayout = cssRect; } // ignore clean sub trees bool hasNewLayout = root.cssNode.HasNewLayout; if (hasNewLayout) { for (int i = 0; i < root.shadow.childCount; ++i) { ValidateSubTree(root.shadow[i]); } } if (rectChanged) { using (var evt = PostLayoutEvent.GetPooled(hasNewLayout, lastRect, cssRect)) { evt.target = root; UIElementsUtility.eventDispatcher.DispatchEvent(evt, this); } } // reset both flags at the end root.ClearDirty(ChangeType.Layout); if (hasNewLayout) { root.cssNode.MarkLayoutSeen(); } }