]> O.S.I.I.S - jp/crow.git/commitdiff
DEBUG_LAYOUTING:save every LQI in GraphicObjects for further analysis
authorjpbruyere <jp.bruyere@hotmail.com>
Thu, 4 Aug 2016 22:59:24 +0000 (00:59 +0200)
committerjpbruyere <jp.bruyere@hotmail.com>
Fri, 5 Aug 2016 00:11:49 +0000 (02:11 +0200)
modifié :         src/GraphicObjects/GraphicObject.cs
modifié :         src/LayoutingQueueItem.cs

src/GraphicObjects/GraphicObject.cs
src/LayoutingQueueItem.cs

index 20173172a3dde548a459d7cbfe629ecab880738c..f2f2564f2ba943f059854313c8c51a75ae9cef28 100644 (file)
@@ -101,8 +101,19 @@ namespace Crow
                /// IDEA is to add a ScreenCoordinates function that use only lastPaintedSlots
                /// </summary>
                public Rectangle LastPaintedSlot;
+               /// <summary>Prevent requeuing multiple times the same widget</summary>
+               public bool IsQueueForRedraw = false;
+               /// <summary>Random value placeholder</summary>
                public object Tag;
+               /// <summary>drawing Cache, if null, a redraw is done, cached or not</summary>
                public byte[] bmp;
+               /// <summary>
+               /// This size is computed on each child' layout changes.
+               /// In stacking widget, it is used to compute the remaining space for the stretched
+               /// widget inside the stack, which is never added to the contentSize, instead, its size
+               /// is deducted from (parent.ClientRectangle - contentSize) 
+               /// </summary>
+               internal Size contentSize;
                #endregion
 
                #region ILayoutable
@@ -116,12 +127,10 @@ namespace Crow
                        get { return _parent; }
                        set { _parent = value; }
                }
-
                [XmlIgnore]public ILayoutable LogicalParent {
                        get { return logicalParent == null ? Parent : logicalParent; }
                        set { logicalParent = value; }
                }
-
                [XmlIgnore]public virtual Rectangle ClientRectangle {
                        get {
                                Rectangle cb = Slot.Size;
@@ -129,7 +138,6 @@ namespace Crow
                                return cb;
                        }
                }
-
                public virtual Rectangle ContextCoordinates(Rectangle r){
                        GraphicObject go = Parent as GraphicObject;
                        if (go == null)
@@ -731,7 +739,6 @@ namespace Crow
                        if (Parent != null)
                                Parent.RegisterClip (clip + Slot.Position + ClientRectangle.Position);
                }
-               public bool IsQueueForRedraw = false;
                /// <summary> Full update, taking care of sizing policy </summary>
                [MethodImpl(MethodImplOptions.AggressiveInlining)]
                public void RegisterForGraphicUpdate ()
@@ -751,7 +758,11 @@ namespace Crow
                                Interface.CurrentInterface.EnqueueForRepaint (this);
                }
                #region Layouting
-               internal Size contentSize;
+
+               #if DEBUG_LAYOUTING
+               public List<LayoutingQueueItem> CurrentDrawLQIs = null;
+               public List<List<LayoutingQueueItem>> LQIs = new List<List<LayoutingQueueItem>>();
+               #endif
                /// <summary> return size of content + margins </summary>
                protected virtual int measureRawSize (LayoutingType lt) {
                        return lt == LayoutingType.Width ?
@@ -784,9 +795,6 @@ namespace Crow
                                if (layoutType == LayoutingType.None)
                                        return;
 
-                               #if DEBUG_LAYOUTING
-                               Debug.WriteLine ("REGLayout => {1}->{0}", layoutType, this.ToString());
-                               #endif
                                //enqueue LQI LayoutingTypes separately
                                if (layoutType.HasFlag (LayoutingType.Width))
                                        Interface.CurrentInterface.LayoutingQueue.Enqueue (new LayoutingQueueItem (LayoutingType.Width, this));
@@ -805,7 +813,8 @@ namespace Crow
                public virtual void OnLayoutChanges(LayoutingType  layoutType)
                {
                        #if DEBUG_LAYOUTING
-                       Debug.WriteLine ("\t    " + LastSlots.ToString() + "\n\t => " + Slot.ToString ());
+                       LayoutingQueueItem.currentLQI.Slot = LastSlots;
+                       LayoutingQueueItem.currentLQI.Slot = Slot;
                        #endif
 
                        switch (layoutType) {
@@ -1029,6 +1038,12 @@ namespace Crow
                                return;
 
                        LastPaintedSlot = Slot;
+                       #if DEBUG_LAYOUTING
+                       if (CurrentDrawLQIs != null){
+                               LQIs.Add (CurrentDrawLQIs);
+                               CurrentDrawLQIs = null;
+                       }
+                       #endif
 
                        if (cacheEnabled) {
                                if (Slot.Width > Interface.MaxCacheSize || Slot.Height > Interface.MaxCacheSize)
index f35eb78d5ad43d811e9b88910d57d41b1f379a69..b2a5f3caf1a7675fe36e2a8953c4f654666ea060 100644 (file)
@@ -21,6 +21,7 @@
 using System;
 using System.Diagnostics;
 using System.Collections.Generic;
+using System.Linq;
 
 namespace Crow
 {
@@ -42,63 +43,84 @@ namespace Crow
        public class LayoutingQueueItem
        {
                /// <summary> Instance of widget to be layouted</summary>
-               public ILayoutable GraphicObject;
+               public ILayoutable Layoutable;
                /// <summary> Bitfield containing the element of the layout to performs (x|y|width|height)</summary>
                public LayoutingType LayoutType;
                /// <summary> Unsuccessfull UpdateLayout and requeueing count </summary>
                public int LayoutingTries, DiscardCount;
 
+               #if DEBUG_LAYOUTING
+               public static List<LayoutingQueueItem> processedLQIs = new List<LayoutingQueueItem>();
+               public static LayoutingQueueItem[] MultipleRunsLQIs {
+                       get { return processedLQIs.Where(l=>l.LayoutingTries>2 || l.DiscardCount > 0).ToArray(); }
+               }
+               public static LayoutingQueueItem currentLQI = null;
+               public Stopwatch LQITime = new Stopwatch();
+               public List<LayoutingQueueItem> triggeredLQIs = new List<LayoutingQueueItem>();
+               public LayoutingQueueItem wasTriggeredBy = null;
+               public GraphicObject graphicObject {
+                       get { return Layoutable as GraphicObject; }
+               }
+               public Rectangle Slot, NewSlot;
+               #endif
+
                #region CTOR
                public LayoutingQueueItem (LayoutingType _layoutType, ILayoutable _graphicObject)
                {
                        LayoutType = _layoutType;
-                       GraphicObject = _graphicObject;
-                       GraphicObject.RegisteredLayoutings |= LayoutType;
+                       Layoutable = _graphicObject;
+                       Layoutable.RegisteredLayoutings |= LayoutType;
+                       #if DEBUG_LAYOUTING
+                       if (graphicObject.CurrentDrawLQIs == null)
+                               graphicObject.CurrentDrawLQIs = new List<LayoutingQueueItem>();
+                       graphicObject.CurrentDrawLQIs.Add(this);
+                       if (currentLQI != null){
+                               wasTriggeredBy = currentLQI;
+                               currentLQI.triggeredLQIs.Add(this);
+                       }
+                       #endif
                }
                #endregion
 
 
                public void ProcessLayouting()
                {
-                       if (GraphicObject.Parent == null) {//TODO:improve this
+                       if (Layoutable.Parent == null) {//TODO:improve this
                                //cancel layouting for object without parent, maybe some were in queue when
                                //removed from a listbox
                                Debug.WriteLine ("ERROR: processLayouting, no parent for: " + this.ToString ());
                                return;
                        }
                        #if DEBUG_LAYOUTING
-                       Debug.WriteLine ("Layouting => " + this.ToString ());
+                       currentLQI = this;
+                       processedLQIs.Add(this);
+                       LQITime.Start();
                        #endif
-                       if (!GraphicObject.UpdateLayout (LayoutType)) {
+                       if (!Layoutable.UpdateLayout (LayoutType)) {
                                if (LayoutingTries < Interface.MaxLayoutingTries) {
-                                       #if DEBUG_LAYOUTING
-                                       Debug.WriteLine ("\tRequeuing  => " + this.ToString ());
-                                       #endif
                                        LayoutingTries++;
-                                       GraphicObject.RegisteredLayoutings |= LayoutType;
+                                       Layoutable.RegisteredLayoutings |= LayoutType;
                                        Interface.CurrentInterface.LayoutingQueue.Enqueue (this);
                                } else if (DiscardCount < Interface.MaxDiscardCount) {
-                                       #if DEBUG_LAYOUTING
-                                       Debug.WriteLine ("\tDiscarding => " + this.ToString ());
-                                       #endif
                                        LayoutingTries = 0;
                                        DiscardCount++;
-                                       GraphicObject.RegisteredLayoutings |= LayoutType;
+                                       Layoutable.RegisteredLayoutings |= LayoutType;
                                        Interface.CurrentInterface.DiscardQueue.Enqueue (this);
                                }
                                //#if DEBUG_LAYOUTING
                                else
                                        Debug.WriteLine ("\tDELETED    => " + this.ToString ());
                                //#endif
-                       } else {
-                               DiscardCount = 0;
-                               LayoutingTries = 0;
                        }
+                       #if DEBUG_LAYOUTING
+                       currentLQI = null;
+                       LQITime.Stop();
+                       #endif
                }
 
                public static implicit operator GraphicObject(LayoutingQueueItem queueItem)
                {
-                       return queueItem.GraphicObject as GraphicObject;
+                       return queueItem.Layoutable as GraphicObject;
                }
                public static implicit operator LayoutingType(LayoutingQueueItem lqi)
                {
@@ -106,7 +128,13 @@ namespace Crow
                }
                public override string ToString ()
                {
-                       return string.Format ("{1}->{0}", LayoutType,GraphicObject.ToString());
+                       #if DEBUG_LAYOUTING
+                       return string.Format ("{2};{3};{4} {1}->{0}", LayoutType,Layoutable.ToString(),
+                               LayoutingTries,DiscardCount,LQITime.ElapsedTicks);
+                       #else
+                       return string.Format ("{2};{3} {1}->{0}", LayoutType,Layoutable.ToString(),
+                               LayoutingTries, DiscardCount);
+                       #endif
                }
        }
 }