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/06/08 07:48:29 UTC

[royale-asjs] 02/02: BoxLayout listens to children and runs layout if they change size

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 0977676251212ef20382044da91701a3a0047691
Author: Alex Harui <ah...@apache.org>
AuthorDate: Mon Jun 8 00:47:53 2020 -0700

    BoxLayout listens to children and runs layout if they change size
---
 .../main/royale/mx/containers/beads/BoxLayout.as   | 42 +++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/BoxLayout.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/BoxLayout.as
index f1b88b0..7bd5811 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/BoxLayout.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/BoxLayout.as
@@ -34,6 +34,8 @@ package mx.containers.beads
 	import org.apache.royale.core.UIBase;
     import org.apache.royale.core.layout.EdgeData;
 	import org.apache.royale.core.ValuesManager;
+	import org.apache.royale.events.Event;
+	import org.apache.royale.events.IEventDispatcher;
 
 	//import mx.core.mx_internal;
 	//import mx.core.ScrollPolicy;
@@ -80,7 +82,9 @@ package mx.containers.beads
 			_strand = value;
 			_target = value as Container;
 			super.strand = value;
-			
+			// The main layout may not get put on the strand until
+			// after children are added so listen here as well
+			listenToChildren();			
 		}
 		
 		private var _target:Container;
@@ -193,8 +197,12 @@ package mx.containers.beads
 			target.measuredHeight = preferredHeight + hPadding;
 		}
 		
+		private var ranLayout:Boolean;
+		
 		override public function layout():Boolean
 		{
+			ranLayout = true;
+			
 			var n:int = layoutView.numElements;
 			if (n == 0)
 				return false;
@@ -214,6 +222,8 @@ package mx.containers.beads
 			return true;
 		}
 		
+		private var inUpdateDisplayList:Boolean;
+		
 		/**
 		 *  @private
 		 *  Lay out children as per Box layout rules.
@@ -223,6 +233,7 @@ package mx.containers.beads
 		{			
 			var n:int = layoutView.numElements;
 			if (n == 0) return;
+			inUpdateDisplayList = true;
 			
 			var vm:EdgeMetrics = target.viewMetricsAndPadding;
             var pd:EdgeData = (ValuesManager.valuesImpl as IBorderPaddingMarginValuesImpl).getPaddingMetrics(target);
@@ -417,6 +428,7 @@ package mx.containers.beads
 						left += obj.width + gap;
 				}
 			}
+			inUpdateDisplayList = false;
 		}
 		
 		//--------------------------------------------------------------------------
@@ -504,6 +516,34 @@ package mx.containers.beads
 			// default = top
 			return 0;
 		}
+		
+		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();
+		}		
 	}
 	
 }