You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ah...@apache.org on 2020/12/08 03:51:15 UTC

[royale-asjs] 03/03: listen for child size changing

This is an automated email from the ASF dual-hosted git repository.

aharui pushed a commit to branch ChildResize
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git

commit 8ccfa56c28f457f725c7025b1779025d27060f64
Author: Alex Harui <ah...@apache.org>
AuthorDate: Mon Dec 7 19:50:57 2020 -0800

    listen for child size changing
---
 .../layouts/supportClasses/SparkLayoutBead.as      | 43 +++++++++++++++++++++-
 1 file changed, 41 insertions(+), 2 deletions(-)

diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/layouts/supportClasses/SparkLayoutBead.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/layouts/supportClasses/SparkLayoutBead.as
index e1ed277..96a59ab 100644
--- a/frameworks/projects/SparkRoyale/src/main/royale/spark/layouts/supportClasses/SparkLayoutBead.as
+++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/layouts/supportClasses/SparkLayoutBead.as
@@ -36,6 +36,7 @@ import org.apache.royale.core.LayoutBase;
 import org.apache.royale.core.UIBase;
 import org.apache.royale.events.Event;
 import org.apache.royale.events.EventDispatcher;
+import org.apache.royale.events.IEventDispatcher;
 import org.apache.royale.utils.MXMLDataInterpreter;
 import org.apache.royale.utils.loadBeadFromValuesManager;
 
@@ -78,9 +79,14 @@ public class SparkLayoutBead extends org.apache.royale.core.LayoutBase
 		sawSizeChanged = true;
 		super.handleSizeChange(event);
 	}
-
+	
+	private var ranLayout:Boolean;	
+	private var inUpdateDisplayList:Boolean;	
+		
     override public function layout():Boolean
     {
+		ranLayout = true;
+		
         var n:int = target.numChildren;
         if (n == 0)
             return false;
@@ -107,7 +113,9 @@ public class SparkLayoutBead extends org.apache.royale.core.LayoutBase
             h = target.measuredHeight;
         if (target.layout.isWidthSizedToContent())
             w = target.measuredWidth;
+		inUpdateDisplayList = true;
         target.layout.updateDisplayList(w, h);
+		inUpdateDisplayList = false;
         
         // update the target's actual size if needed.
         if (target.layout.isWidthSizedToContent() && target.layout.isHeightSizedToContent()) {
@@ -136,7 +144,10 @@ public class SparkLayoutBead extends org.apache.royale.core.LayoutBase
         var host:UIBase = value as UIBase;
         _target = (host.view as ILayoutHost).contentView as GroupBase;
         super.strand = value;
-        
+        	// The main layout may not get put on the strand until
+		// after children are added so listen here as well
+		if (target.parent)
+			listenToChildren();		
     }
     
     private var _target:GroupBase;
@@ -151,5 +162,33 @@ public class SparkLayoutBead extends org.apache.royale.core.LayoutBase
         _target = value;
     }
 
+	override protected function handleChildrenAdded(event:Event):void
+	{
+		COMPILE::JS {
+			super.handleChildrenAdded(event);
+			listenToChildren();
+		}
+	}
+	
+	private function listenToChildren():void
+	{
+		var n:Number = layoutView.numElements;
+		for(var i:int=0; i < n; i++) {
+			var child:IEventDispatcher = layoutView.getElementAt(i) as IEventDispatcher;
+			child.addEventListener("widthChanged", childResizeHandler);
+			child.addEventListener("heightChanged", childResizeHandler);
+			child.addEventListener("sizeChanged", childResizeHandler);
+		}
+	}
+	
+	override protected function childResizeHandler(event:Event):void
+	{
+		if (inUpdateDisplayList) return;
+		ranLayout = false;
+		super.childResizeHandler(event); // will set ranLayout if it did
+		if (!ranLayout)
+			performLayout();
+	}		
+		
 }
 }