/// 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
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;
return cb;
}
}
-
public virtual Rectangle ContextCoordinates(Rectangle r){
GraphicObject go = Parent as GraphicObject;
if (go == null)
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 ()
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 ?
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));
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) {
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)
using System;
using System.Diagnostics;
using System.Collections.Generic;
+using System.Linq;
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)
{
}
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
}
}
}