Jelajahi Sumber

Managed GUI element instances are now properly stored

Marko Pintera 12 tahun lalu
induk
melakukan
c37ea515a6

+ 8 - 0
MBansheeEngine/GUIArea.cs

@@ -6,6 +6,7 @@ namespace BansheeEngine
     public sealed class GUIArea : ScriptObject
     {
         private GUILayout _layout;
+        private GUIBase parent;
 
         public GUILayout layout
         {
@@ -19,6 +20,7 @@ namespace BansheeEngine
         {
             GUIArea newArea = new GUIArea();
             Internal_CreateInstance(newArea, parent, x, y, width, height, depth);
+            newArea.parent = parent;
             newArea._layout = new GUILayoutX(newArea);
 
             return newArea;
@@ -28,6 +30,7 @@ namespace BansheeEngine
         {
             GUIArea newArea = new GUIArea();
             Internal_CreateInstanceResizableX(newArea, parent, offsetLeft, offsetRight, offsetTop, height, depth);
+            newArea.parent = parent;
             newArea._layout = new GUILayoutX(newArea);
 
             return newArea;
@@ -37,6 +40,7 @@ namespace BansheeEngine
         {
             GUIArea newArea = new GUIArea();
             Internal_CreateInstanceResizableY(newArea, parent, offsetTop, offsetBottom, offsetLeft, width, depth);
+            newArea.parent = parent;
             newArea._layout = new GUILayoutX(newArea);
 
             return newArea;
@@ -46,6 +50,7 @@ namespace BansheeEngine
         {
             GUIArea newArea = new GUIArea();
             Internal_CreateInstanceResizableXY(newArea, parent, offsetLeft, offsetRight, offsetTop, offsetBottom, depth);
+            newArea.parent = parent;
             newArea._layout = new GUILayoutX(newArea);
 
             return newArea;
@@ -53,6 +58,9 @@ namespace BansheeEngine
 
         public void Destroy()
         {
+            _layout.Destroy();
+            parent.childAreas.Remove(this);
+
             Internal_Destroy(mCachedPtr);
         }
 

+ 29 - 5
MBansheeEngine/GUIBase.cs

@@ -1,14 +1,16 @@
 using System;
+using System.Collections.Generic;
 using System.Runtime.CompilerServices;
 
 namespace BansheeEngine
 {
-
     public abstract class GUIBase : ScriptObject
     {
         private GUIArea mainArea;
         private GUILayout _mainLayout;
 
+        internal List<GUIArea> childAreas = new List<GUIArea>();
+
         public GUILayout layout
         {
             get { return _mainLayout; }
@@ -19,6 +21,16 @@ namespace BansheeEngine
         internal GUIBase()
         { }
 
+        ~GUIBase()
+        {
+            for (int i = 0; i < childAreas.Count; i++)
+            {
+                childAreas[i].Destroy();
+            }
+
+            childAreas.Clear();
+        }
+
         internal void Initialize()
         {
             mainArea = AddResizableAreaXY(0, 0, 0, 0);
@@ -27,22 +39,34 @@ namespace BansheeEngine
 
         public GUIArea AddArea(int x, int y, int width = 0, int height = 0, short depth = 0)
         {
-            return GUIArea.Create(this, x, y, width, height, depth);
+            GUIArea area = GUIArea.Create(this, x, y, width, height, depth);
+            childAreas.Add(area);
+
+            return area;
         }
 
         public GUIArea AddResizableAreaX(int offsetLeft, int offsetRight, int offsetTop, int height, short depth = 0)
         {
-            return GUIArea.CreateResizableX(this, offsetLeft, offsetRight, offsetTop, height, depth);
+            GUIArea area = GUIArea.CreateResizableX(this, offsetLeft, offsetRight, offsetTop, height, depth);
+            childAreas.Add(area);
+
+            return area;
         }
 
         public GUIArea AddResizableAreaY(int offsetTop, int offsetBottom, int offsetLeft, int width, short depth = 0)
         {
-            return GUIArea.CreateResizableY(this, offsetTop, offsetBottom, offsetLeft, width, depth);
+            GUIArea area = GUIArea.CreateResizableY(this, offsetTop, offsetBottom, offsetLeft, width, depth);
+            childAreas.Add(area);
+
+            return area;
         }
 
         public GUIArea AddResizableAreaXY(int offsetLeft, int offsetRight, int offsetTop, int offsetBottom, short depth = 0)
         {
-            return GUIArea.CreateResizableXY(this, offsetLeft, offsetRight, offsetTop, offsetBottom, depth);
+            GUIArea area = GUIArea.CreateResizableXY(this, offsetLeft, offsetRight, offsetTop, offsetBottom, depth);
+            childAreas.Add(area);
+
+            return area;
         }
     }
 }

+ 2 - 1
MBansheeEngine/GUIButton.cs

@@ -3,7 +3,7 @@ using System.Runtime.CompilerServices;
 
 namespace BansheeEngine
 {
-    public sealed class GUIButton : ScriptObject
+    public sealed class GUIButton : GUIElement
     {
         public delegate void OnClickDelegate();
         public delegate void OnHoverDelegate();
@@ -14,6 +14,7 @@ namespace BansheeEngine
         public event OnOutDelegate OnOut;
 
         internal GUIButton(GUILayout parentLayout, GUIContent content, GUIElementStyle style, params GUIOption[] options)
+            :base(parentLayout)
         {
             Internal_CreateInstance(this, parentLayout, content, style, options);
         }

+ 22 - 0
MBansheeEngine/GUIElement.cs

@@ -1,12 +1,34 @@
 using System;
+using System.Collections.Generic;
 using System.Runtime.CompilerServices;
 
 namespace BansheeEngine
 {
     public class GUIElement : ScriptObject
     {
+        protected GUIElement parent;
+        protected List<GUIElement> children = new List<GUIElement>();
+
+        internal GUIElement(GUIElement parent)
+        {
+            this.parent = parent;
+
+            if (parent != null)
+                parent.children.Add(this);
+        }
+
         public void Destroy()
         {
+            for (int i = 0; i < children.Count; i++)
+                children[i].Destroy();
+
+            children.Clear();
+
+            if (parent != null)
+                parent.children.Remove(this);
+
+            parent = null;
+
             Internal_Destroy(mCachedPtr);
         }
 

+ 1 - 0
MBansheeEngine/GUILabel.cs

@@ -6,6 +6,7 @@ namespace BansheeEngine
     public sealed class GUILabel : GUIElement
     {
         internal GUILabel(GUILayout parentLayout, GUIContent content, GUIElementStyle style, params GUIOption[] options)
+            :base(parentLayout)
         {
             Internal_CreateInstance(this, parentLayout, content, style, options);
         }

+ 4 - 0
MBansheeEngine/GUILayout.cs

@@ -5,6 +5,10 @@ namespace BansheeEngine
 {
     public abstract class GUILayout : GUIElement
     {
+        internal GUILayout(GUIElement parent)
+            :base(parent)
+        { }
+
         public GUILabel AddLabel(GUIContent content, GUIElementStyle style, params GUIOption[] options)
         {
             return new GUILabel(this, content, style, options);

+ 2 - 2
MBansheeEngine/GUILayoutX.cs

@@ -5,14 +5,14 @@ namespace BansheeEngine
 {
     public sealed class GUILayoutX : GUILayout
     {
-        internal GUILayoutX() { }
-
         internal GUILayoutX(GUIArea parentArea)
+            :base(null)
         {
             Internal_CreateInstanceXFromArea(this, parentArea);
         }
 
         internal GUILayoutX(GUILayout parentLayout)
+            :base(parentLayout)
         {
             Internal_CreateInstanceXFromLayout(this, parentLayout);
         }

+ 2 - 2
MBansheeEngine/GUILayoutY.cs

@@ -5,14 +5,14 @@ namespace BansheeEngine
 {
     public sealed class GUILayoutY : GUILayout
     {
-        internal GUILayoutY() { }
-
         internal GUILayoutY(GUILayout parentLayout)
+            :base(parentLayout)
         {
             Internal_CreateInstanceYFromLayout(this, parentLayout);
         }
 
         internal GUILayoutY(GUIScrollArea parentArea)
+            :base(parentArea)
         {
             Internal_CreateInstanceYFromScrollArea(this, parentArea);
         }

+ 1 - 0
MBansheeEngine/GUIListBox.cs

@@ -10,6 +10,7 @@ namespace BansheeEngine
         public event OnSelectionChangedDelegate OnSelectionChanged;
 
         internal GUIListBox(GUILayout parentLayout, LocString[] elements, GUIElementStyle style, params GUIOption[] options)
+            :base(parentLayout)
         {
             Internal_CreateInstance(this, parentLayout, elements, style, options);
         }

+ 1 - 0
MBansheeEngine/GUIScrollArea.cs

@@ -12,6 +12,7 @@ namespace BansheeEngine
         }
 
         internal GUIScrollArea(GUILayout parentLayout, GUIElementStyle style, params GUIOption[] options)
+            :base(parentLayout)
         {
             Internal_CreateInstance(this, parentLayout, style, options);
             _mainLayout = new GUILayoutY(this);

+ 2 - 0
MBansheeEngine/GUISpace.cs

@@ -5,6 +5,7 @@ namespace BansheeEngine
     public sealed class GUIFixedSpace : GUIElement
     {
         internal GUIFixedSpace(GUILayout parentLayout, int size)
+            :base(parentLayout)
         {
             Internal_CreateInstance(this, parentLayout, size);
         }
@@ -16,6 +17,7 @@ namespace BansheeEngine
     public sealed class GUIFlexibleSpace : GUIElement
     {
         internal GUIFlexibleSpace(GUILayout parentLayout)
+            :base(parentLayout)
         {
             Internal_CreateInstance(this, parentLayout);
         }

+ 1 - 0
MBansheeEngine/GUITextBox.cs

@@ -6,6 +6,7 @@ namespace BansheeEngine
     public sealed class GUITextBox : GUIElement
     {
         internal GUITextBox(GUILayout parentLayout, bool multiline, GUIElementStyle style, params GUIOption[] options)
+            :base(parentLayout)
         {
             Internal_CreateInstance(this, parentLayout, multiline, style, options);
         }

+ 1 - 0
MBansheeEngine/GUITexture.cs

@@ -15,6 +15,7 @@ namespace BansheeEngine
     public sealed class GUITexture : GUIElement
     {
         internal GUITexture(GUILayout parentLayout, SpriteTexture texture, GUIImageScaleMode scale, GUIElementStyle style, params GUIOption[] options)
+            :base(parentLayout)
         {
             Internal_CreateInstance(this, parentLayout, texture, scale, style, options);
         }

+ 1 - 0
MBansheeEngine/GUIToggle.cs

@@ -16,6 +16,7 @@ namespace BansheeEngine
         public event OnToggleDelegate OnToggled;
 
         internal GUIToggle(GUILayout parentLayout, GUIContent content, GUIToggleGroup toggleGroup, GUIElementStyle style, params GUIOption[] options)
+            :base(parentLayout)
         {
             Internal_CreateInstance(this, parentLayout, content, toggleGroup, style, options);
         }