]> O.S.I.I.S - jp/crow.git/commitdiff
register LinkedListNode, prevent uneeded cyclic ref
authorjpbruyere <jp.bruyere@hotmail.com>
Thu, 4 Feb 2016 21:45:22 +0000 (22:45 +0100)
committerjpbruyere <jp.bruyere@hotmail.com>
Thu, 4 Feb 2016 21:45:22 +0000 (22:45 +0100)
UnitTest/NUnitCrowWindow.cs
src/GraphicObjects/GenericStack.cs
src/GraphicObjects/GraphicObject.cs
src/GraphicObjects/Grid.cs
src/GraphicObjects/ILayoutable.cs
src/LayoutingQueue.cs
src/LayoutingQueueItem.cs
src/OpenTKGameWindow.cs

index 999639cd2f1207d32f378689a8f1953acab1d773..1325dcafa35adce2b8c8d6b4bc59e8a6db5d55d1 100644 (file)
@@ -416,7 +416,7 @@ namespace Crow
                #region ILayoutable implementation
 
                //TODO:uneeded list, should be removed
-               public List<LayoutingQueueItem> RegisteredLQIs { get; } = new List<LayoutingQueueItem>();
+               public List<LinkedListNode<LayoutingQueueItem>> RegisteredLQINodes { get; } = new List<LinkedListNode<LayoutingQueueItem>>();
                public void RegisterForLayouting (int layoutType) { throw new NotImplementedException (); }
                public void UpdateLayout (LayoutingType layoutType) { throw new NotImplementedException (); }
                public Rectangle ContextCoordinates (Rectangle r)
index dd27d21a2835161bb787a2f9d219abb2190ea801..92e944bb1c3f6bb413725b2d8039482200ee30a8 100644 (file)
@@ -166,7 +166,7 @@ namespace Crow
                                }                               
                                ComputeChildrenPositions ();
                                //if no layouting remains in queue for item, registre for redraw
-                               if (RegisteredLQIs.Count () <= 0 && bmp==null)
+                               if (RegisteredLQINodes.Count () <= 0 && bmp==null)
                                        this.RegisterForRedraw ();
                        }else
                                base.UpdateLayout(layoutType);
index d96bdf297a4c690494a477244b5d9de35eca1a21..b9b142c08ca261b888b1a68727c17ca94ca5e16b 100644 (file)
@@ -91,7 +91,7 @@ namespace Crow
 
                #region ILayoutable
 
-               public List<LayoutingQueueItem> RegisteredLQIs { get; } = new List<LayoutingQueueItem>();
+               public List<LinkedListNode<LayoutingQueueItem>> RegisteredLQINodes { get; } = new List<LinkedListNode<LayoutingQueueItem>>();
                //TODO: it would save the recurent cost of a cast in event bubbling if parent type was GraphicObject
                //              or we could add to the interface the mouse events
                [XmlIgnore]public ILayoutable Parent { 
@@ -492,10 +492,10 @@ namespace Crow
                        return Bounds.Size;
                }
                void deleteLQI(int lt){
-                       LayoutingQueueItem[] lqis = this.RegisteredLQIs.Where (lq => (lt & (int)lq.LayoutType) > 0).ToArray ();
+                       LinkedListNode<LayoutingQueueItem>[] lqis = this.RegisteredLQINodes.Where (n => (lt & (int)n.Value.LayoutType) > 0).ToArray ();
                        for (int i = 0; i < lqis.Length; i++) {
-                               Interface.LayoutingQueue.Remove (lqis [i].Node);
-                               lqis [i].DeleteLayoutableRef();
+                               Interface.LayoutingQueue.Remove (lqis [i]);
+                               RegisteredLQINodes.Remove (lqis [i]);
                        }
                }
                /// <summary> clear current layoutingQueue items for object and
@@ -514,10 +514,10 @@ namespace Crow
                                                Interface.LayoutingQueue.EnqueueAfterParentSizing (LayoutingType.Width, this);
                                else if (Bounds.Width < 0) //fit 
                                                Interface.LayoutingQueue.EnqueueBeforeParentSizing (LayoutingType.Width, this);
-                               else {
-                                       LayoutingQueueItem lqi = new LayoutingQueueItem (LayoutingType.Width, this);
-                                       lqi.Node = Interface.LayoutingQueue.AddFirst (lqi);
-                               }
+                               else                                    
+                                       RegisteredLQINodes.Add(
+                                               Interface.LayoutingQueue.AddFirst (
+                                                       new LayoutingQueueItem (LayoutingType.Width, this)));                           
                        }
 
                        if ((layoutType & (int)LayoutingType.Height) > 0) {
@@ -526,8 +526,10 @@ namespace Crow
                                else if (Bounds.Height < 0) //fit 
                                                Interface.LayoutingQueue.EnqueueBeforeParentSizing (LayoutingType.Height, this);
                                else{
-                                       LayoutingQueueItem lqi = new LayoutingQueueItem (LayoutingType.Height, this);
-                                       lqi.Node = Interface.LayoutingQueue.AddFirst (lqi);
+                                       RegisteredLQINodes.Add(
+                                               Interface.LayoutingQueue.AddFirst (
+                                                       new LayoutingQueueItem (LayoutingType.Height, this)));                          
+                                       
                                }
                        }
 
@@ -707,7 +709,7 @@ namespace Crow
                                break;
                        }
                        //if no layouting remains in queue for item, registre for redraw
-                       if (this.RegisteredLQIs.Count () <= 0 && bmp == null)
+                       if (this.RegisteredLQINodes.Count () <= 0 && bmp == null)
                                this.RegisterForRedraw ();
                }
 
index 08241d9c71d71cced9b8659a37383f684a45844d..1981fc6033a2fe70fa29d382f7f50c1d8bb3c8ef 100644 (file)
@@ -137,7 +137,7 @@ namespace Crow
                        if (layoutType == LayoutingType.PositionChildren) {                             
                                ComputeChildrenPositions ();
                                //if no layouting remains in queue for item, registre for redraw
-                               if (RegisteredLQIs.Count () <= 0 && bmp==null)
+                               if (RegisteredLQINodes.Count () <= 0 && bmp==null)
                                        this.RegisterForRedraw ();
                        }else
                                base.UpdateLayout(layoutType);
index 3a7135e066bb310ce5b97cd8a3992aeac0892a49..7bb30bce9a6319751efc0b5d962d0bf1eb92e67b 100644 (file)
@@ -13,7 +13,7 @@ namespace Crow
 
                IGOLibHost HostContainer { get; }
 
-               List<LayoutingQueueItem> RegisteredLQIs { get; }
+               List<LinkedListNode<LayoutingQueueItem>> RegisteredLQINodes { get; }
                void RegisterForLayouting(int layoutType);
                void UpdateLayout(LayoutingType layoutType);
 
index 697c59aa6ad873efcd96d1c195b5fb6fe40b2d60..68372bbbdff3f1c2e1c80c3ccddaf4b28cd52318 100644 (file)
@@ -31,32 +31,31 @@ namespace Crow
                {
                }
                public void Enqueue(LayoutingType _lt, ILayoutable _object)
-               {
-                       LayoutingQueueItem lqi = new LayoutingQueueItem (_lt, _object);
-                       lqi.Node = this.AddLast (lqi);
+               {                       
+                       _object.RegisteredLQINodes.Add(this.AddLast (new LayoutingQueueItem (_lt, _object)));
                }
-               LayoutingQueueItem searchLqi(ILayoutable go, LayoutingType lt){
-                       return go.RegisteredLQIs.Where(lq => lq.LayoutType == lt).LastOrDefault();
+               LinkedListNode<LayoutingQueueItem> searchLqi(ILayoutable go, LayoutingType lt){
+                       return go.RegisteredLQINodes.Where(n => n.Value.LayoutType == lt).LastOrDefault();
                }
                public void EnqueueAfterParentSizing (LayoutingType _lt, ILayoutable _object)
                {
                        LayoutingQueueItem lqi = new LayoutingQueueItem (_lt, _object);
-                       LayoutingQueueItem parentLqi = searchLqi (_object.Parent, _lt);
+                       LinkedListNode<LayoutingQueueItem> parentLqi = searchLqi (_object.Parent, _lt);
 
                        if (parentLqi == null)
-                               lqi.Node = this.AddFirst (lqi);
+                               _object.RegisteredLQINodes.Add(this.AddFirst (lqi));
                        else
-                               lqi.Node = this.AddAfter (parentLqi.Node, lqi);
+                               _object.RegisteredLQINodes.Add(this.AddAfter (parentLqi, lqi));
                }
                public void EnqueueBeforeParentSizing (LayoutingType _lt, ILayoutable _object)
                {
                        LayoutingQueueItem lqi = new LayoutingQueueItem (_lt, _object);
-                       LayoutingQueueItem parentLqi = searchLqi (_object.Parent, _lt);
+                       LinkedListNode<LayoutingQueueItem> parentLqi = searchLqi (_object.Parent, _lt);
 
                        if (parentLqi == null)
-                               lqi.Node = this.AddLast (lqi);
+                               _object.RegisteredLQINodes.Add(this.AddLast (lqi));
                        else
-                               lqi.Node = this.AddBefore (parentLqi.Node, lqi);
+                               _object.RegisteredLQINodes.Add(this.AddBefore (parentLqi, lqi));
                }
                public void EnqueueAfterThisAndParentSizing (LayoutingType _lt, ILayoutable _object)
                {
@@ -66,30 +65,30 @@ namespace Crow
                        if (_lt == LayoutingType.Y)
                                sizing = LayoutingType.Height;
 
-                       LayoutingQueueItem parentLqi = searchLqi (_object.Parent, sizing);
-                       LayoutingQueueItem thisLqi = searchLqi (_object, sizing);
+                       LinkedListNode<LayoutingQueueItem> parentLqi = searchLqi (_object.Parent, sizing);
+                       LinkedListNode<LayoutingQueueItem> thisLqi = searchLqi (_object, sizing);
 
                        if (parentLqi == null) {
                                if (thisLqi != null)
-                                       lqi.Node = this.AddAfter (thisLqi.Node, lqi);
+                                       _object.RegisteredLQINodes.Add(this.AddAfter (thisLqi, lqi));
                                else
-                                       lqi.Node = this.AddLast (lqi);
+                                       _object.RegisteredLQINodes.Add(this.AddLast (lqi));
                        } else {
                                if (thisLqi == null)
-                                       lqi.Node = this.AddAfter (parentLqi.Node, lqi);
+                                       _object.RegisteredLQINodes.Add(this.AddAfter (parentLqi, lqi));
                                else {
                                        switch (sizing) {
                                        case LayoutingType.Width:
                                                if (_object.Parent.getBounds().Width<0)
-                                                       lqi.Node = this.AddAfter (parentLqi.Node, lqi);
+                                                       _object.RegisteredLQINodes.Add(this.AddAfter (parentLqi, lqi));
                                                else
-                                                       lqi.Node = this.AddAfter (thisLqi.Node, lqi);                                                   
+                                                       _object.RegisteredLQINodes.Add(this.AddAfter (thisLqi, lqi));   
                                                break;
                                        case LayoutingType.Height:
                                                if (_object.Parent.getBounds().Height<0)
-                                                       lqi.Node = this.AddAfter (parentLqi.Node, lqi);
+                                                       _object.RegisteredLQINodes.Add(this.AddAfter (parentLqi, lqi));
                                                else
-                                                       lqi.Node = this.AddAfter (thisLqi.Node, lqi);                                                   
+                                                       _object.RegisteredLQINodes.Add(this.AddAfter (thisLqi, lqi));                                                   
                                                break;
                                        }
                                }
@@ -98,7 +97,7 @@ namespace Crow
                public LayoutingQueueItem Dequeue()
                {
                        LayoutingQueueItem tmp = this.First.Value;
-                       tmp.DeleteLayoutableRef ();
+                       tmp.GraphicObject.RegisteredLQINodes.Remove(this.First);
                        this.RemoveFirst ();
                        return tmp;
                }
index 816d1923d6d3bd3208e12631548240b250bef256..80d04dc6d361bba0da4f2edf4b68730be00e3c4d 100644 (file)
@@ -37,8 +37,7 @@ namespace Crow
        }
 
        public class LayoutingQueueItem
-       {
-               public LinkedListNode<LayoutingQueueItem> Node;
+       {               
                public ILayoutable GraphicObject;
                public LayoutingType LayoutType;
 
@@ -46,11 +45,8 @@ namespace Crow
                {
                        LayoutType = _layoutType;
                        GraphicObject = _graphicObject;
-                       GraphicObject.RegisteredLQIs.Add (this);
-               }
-               public void DeleteLayoutableRef(){
-                       GraphicObject.RegisteredLQIs.Remove(this);
                }
+       
                public void ProcessLayouting()
                {
                        #if DEBUG_LAYOUTING
index fcd08f95a93f42837f82e79a3266877cf4bb1642..89df8ee4e5c490e75044a3a5279bf3257d557a2e 100644 (file)
@@ -553,7 +553,7 @@ namespace Crow
                #region ILayoutable implementation
 
                //TODO:uneeded list, should be removed
-               public List<LayoutingQueueItem> RegisteredLQIs { get; } = new List<LayoutingQueueItem>();
+               public List<LinkedListNode<LayoutingQueueItem>> RegisteredLQINodes { get; } = new List<LinkedListNode<LayoutingQueueItem>>();
                public void RegisterForLayouting (int layoutType) { throw new NotImplementedException (); }
                public void UpdateLayout (LayoutingType layoutType) { throw new NotImplementedException (); }
                public Rectangle ContextCoordinates (Rectangle r)