From 351960c268b3a648c501d429521352f4fbe47535 Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Fri, 5 Aug 2016 00:59:24 +0200 Subject: [PATCH] =?utf8?q?DEBUG=5FLAYOUTING:save=20every=20LQI=20in=20Grap?= =?utf8?q?hicObjects=20for=20further=20analysis=20=09modifi=C3=A9=C2=A0:?= =?utf8?q?=20=20=20=20=20=20=20=20=20src/GraphicObjects/GraphicObject.cs?= =?utf8?q?=20=09modifi=C3=A9=C2=A0:=20=20=20=20=20=20=20=20=20src/Layoutin?= =?utf8?q?gQueueItem.cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/GraphicObjects/GraphicObject.cs | 33 +++++++++++---- src/LayoutingQueueItem.cs | 66 ++++++++++++++++++++--------- 2 files changed, 71 insertions(+), 28 deletions(-) diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs index 20173172..f2f2564f 100644 --- a/src/GraphicObjects/GraphicObject.cs +++ b/src/GraphicObjects/GraphicObject.cs @@ -101,8 +101,19 @@ namespace Crow /// IDEA is to add a ScreenCoordinates function that use only lastPaintedSlots /// public Rectangle LastPaintedSlot; + /// Prevent requeuing multiple times the same widget + public bool IsQueueForRedraw = false; + /// Random value placeholder public object Tag; + /// drawing Cache, if null, a redraw is done, cached or not public byte[] bmp; + /// + /// 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) + /// + 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; /// Full update, taking care of sizing policy [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 CurrentDrawLQIs = null; + public List> LQIs = new List>(); + #endif /// return size of content + margins 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) diff --git a/src/LayoutingQueueItem.cs b/src/LayoutingQueueItem.cs index f35eb78d..b2a5f3ca 100644 --- a/src/LayoutingQueueItem.cs +++ b/src/LayoutingQueueItem.cs @@ -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 { /// Instance of widget to be layouted - public ILayoutable GraphicObject; + public ILayoutable Layoutable; /// Bitfield containing the element of the layout to performs (x|y|width|height) public LayoutingType LayoutType; /// Unsuccessfull UpdateLayout and requeueing count public int LayoutingTries, DiscardCount; + #if DEBUG_LAYOUTING + public static List processedLQIs = new List(); + 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 triggeredLQIs = new List(); + 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(); + 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 } } } -- 2.47.3