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();
+ }
}
}