Fix crash in UI prefab changes apply when reparenting controls

#2082
This commit is contained in:
Wojtek Figat
2023-12-17 12:41:51 +01:00
parent 7bcf78d0c0
commit e448692eb9
2 changed files with 9 additions and 5 deletions

View File

@@ -448,6 +448,8 @@ namespace FlaxEngine.GUI
internal virtual void AddChildInternal(Control child) internal virtual void AddChildInternal(Control child)
{ {
Assert.IsNotNull(child, "Invalid control."); Assert.IsNotNull(child, "Invalid control.");
if (Parent == child)
throw new InvalidOperationException();
// Add child // Add child
_children.Add(child); _children.Add(child);
@@ -820,13 +822,14 @@ namespace FlaxEngine.GUI
protected virtual void DrawChildren() protected virtual void DrawChildren()
{ {
// Draw all visible child controls // Draw all visible child controls
var children = _children;
if (_cullChildren) if (_cullChildren)
{ {
Render2D.PeekClip(out var globalClipping); Render2D.PeekClip(out var globalClipping);
Render2D.PeekTransform(out var globalTransform); Render2D.PeekTransform(out var globalTransform);
for (int i = 0; i < _children.Count; i++) for (int i = 0; i < children.Count; i++)
{ {
var child = _children[i]; var child = children[i];
if (child.Visible) if (child.Visible)
{ {
Matrix3x3.Multiply(ref child._cachedTransform, ref globalTransform, out var globalChildTransform); Matrix3x3.Multiply(ref child._cachedTransform, ref globalTransform, out var globalChildTransform);
@@ -842,9 +845,9 @@ namespace FlaxEngine.GUI
} }
else else
{ {
for (int i = 0; i < _children.Count; i++) for (int i = 0; i < children.Count; i++)
{ {
var child = _children[i]; var child = children[i];
if (child.Visible) if (child.Visible)
{ {
Render2D.PushTransform(ref child._cachedTransform); Render2D.PushTransform(ref child._cachedTransform);

View File

@@ -58,10 +58,11 @@ namespace FlaxEngine
if (containerControl != null && IsActiveInHierarchy) if (containerControl != null && IsActiveInHierarchy)
{ {
var children = ChildrenCount; var children = ChildrenCount;
var parent = Parent;
for (int i = 0; i < children; i++) for (int i = 0; i < children; i++)
{ {
var child = GetChild(i) as UIControl; var child = GetChild(i) as UIControl;
if (child != null && child.IsActiveInHierarchy && child.HasControl) if (child != null && child.IsActiveInHierarchy && child.HasControl && child != parent)
{ {
child.Control.Parent = containerControl; child.Control.Parent = containerControl;
} }