Easy thing first:  The bubbling of layoutNeeded from Image is a hack and should 
go away someday.

Turns out I was wrong and JS LayoutBase is not listening for 
widthChanged/heightChanged/sizeChanged.  That was SWF-only code I saw earlier.  
IMO, that's the first thing to change by overriding handleChildrenAdded in 
BoxLayout and other MX Layouts.  I don't think Basic layouts need to watch 
children for size changes.  

Also UIComponent's setActualSize() should set the noEvent flag on 
setWidthAndHeight.  

The reason I'm suggesting these changes is because I think that's closer to 
what Flex does.  I don't think Flex has logic like 
sizeChangedBeforeLayout/sizeChangedDuringLayout logic.

For some reason, ApplicationLayout is not getting the handleChildrenAdded.  I 
will work on it more tomorrow.

HTH,
-Alex

On 6/6/20, 12:16 AM, "Greg Dove" <greg.d...@gmail.com> wrote:

    Long day... I stepped away from the keyboard and thought I had finished
    that when I returned.
    But this: ' although I know it's not a ' needs ''one:one mapping for
    features/behavior" on the end (or something like that!)
    
    
    On Sat, Jun 6, 2020 at 7:13 PM Greg Dove <greg.d...@gmail.com> wrote:
    
    >
    > Yeah, that is the sort of thinking that I was trying to make work with
    > what is there already (and yes it does seem like maybe something else is
    > missing). Apart from simple size changes, it is the change on measuredSize
    > after layout has happened in the child that I think some parents *might* 
be
    > interested in when their children are containers with percent dimensions
    > ('flexible' children I think is how they are described in some Flex code -
    > this sort of makes me think of css Flexbox a bit when I look at what the
    > BoxLayout stuff is doing, although I know it's not a  ).
    > But I am probably only scratching the surface here, you have the
    > experience with this stuff.
    > In terms of plumbing, one thing I pondered about would be whether MXRoyale
    > layouts could form their own tree where they connect/detach directly to
    > eachother as part of addChild/removeChild so that it is almost like a tree
    > in parallel with the display tree.
    > Maybe that could be a structure where they talk to each other directly up
    > and down the tree with measurement and layout order somehow optimized. I
    > think it still would not be as efficient as using the 'temporal buffer' of
    > the Flex life cycle, with enterFrame or with 'requestAnimationFrame' but
    > maybe it could be a little better... not sure, was just a thought and I
    > know it seems like a radical change, so maybe that alone rules it out.
    >
    > I was going to drop another zip into the github issue. It occurred to me
    > that it might be easier for you to test if I just put the changed files
    > into the test app fileset as a monkey patch. That way you can mess with
    > them locally more easily if you want to make quick changes and retest,
    > without recompiling MXRoyale. (I was doing this a bit with 
GridItem/GridRow
    > today in the app I am working on, where I have the monkey patch approach
    > and it's quite a bit faster when testing changes).
    >
    > A little aside: one other thing I think I noticed today... I think mx
    > Image has a 'layoutNeeded' dispatch on image load. That makes sense. But I
    > think I saw that it is a bubbling event. Is that correct? Would this call
    > layoutNeeded all the way up to SystemManager for a deeply nested Image (I
    > did not check if it does yet)?
    >
    > Thanks again for looking at this. If I can help by creating more test
    > cases or looking into anything specific in more detail, let me know.
    > Greg
    >
    >
    >
    >
    >
    >
    >
    > On Sat, Jun 6, 2020 at 6:30 PM Alex Harui <aha...@adobe.com.invalid>
    > wrote:
    >
    >> I hope to have time tomorrow.
    >>
    >> Looking quickly at the things you've tried to fix the problem, it occurs
    >> to me that the piece that is probably missing in MXRoyale is the
    >> propagation of something like invalidateSize() instead of just
    >> "layoutNeeded".  My thinking is that in the general case the child can't
    >> really know that because something about the child changed that the 
parent
    >> needs to run a new layout and especially the parent of that parent.
    >>
    >> So some new plumbing may be needed where, when a component changes in a
    >> way that its measured or explicit size had changed (as opposed to the 
size
    >> change from the parent laying out the child), that some sort of
    >> layoutMightBeNeeded is sent to the parent which then uses its measurement
    >> code and explicit sizes to determine whether its size has changed and
    >> propagates a layoutMightBeNeeded to its parent.  But if it decides its 
size
    >> has not changed, it would then run layout which should start the parents
    >> laying out children.
    >>
    >> We'll see if the test case points in that direction.
    >>
    >> HTH,
    >> -Alex
    >>
    >> On 6/5/20, 3:05 AM, "Greg Dove" <greg.d...@gmail.com> wrote:
    >>
    >>     Hi Alex, thanks for the detailed explanation and offer to take a
    >> look, for
    >>     now some quick replies inline.... please add questions in the github
    >> issue
    >>     if you want more details about anything I did so far.
    >>     thanks
    >>     Greg
    >>
    >>     On Fri, Jun 5, 2020 at 6:50 PM Alex Harui <aha...@adobe.com.invalid>
    >> wrote:
    >>
    >>     > Greg,
    >>     >
    >>     > I think this thread got forked somehow.  If you have a simple test
    >> case I
    >>     > can try to look at it this weekend.
    >>     >
    >>     > Thanks. I added issue #849 [1] which should give you something to
    >> look at.
    >>     I suggest you open the Flex build in a browser and then compare
    >> things to
    >>     it in Royale. There are 2 royale builds as well with the same code in
    >> the
    >>     other 2 zips. One without the modifications to MXRoyale and one with.
    >> The
    >>     'one with' zip also has the modified MXRoyale files, so you should be
    >> able
    >>     to drop them in and overwrite in your local MXRoyale and build to
    >>     test/review/change what I did. I'm the first to admit that I do think
    >> it
    >>     doesn't feel right. But so far at least it does make a bunch of code
    >> work
    >>     in one app with a lot of deeply nested layouts that was not working
    >> before.
    >>     It certainly does not make everything work. But it helps quite a bit.
    >>     Certainly appreciate any review/consideration. I am really keen to
    >>     collaborate on a solution that makes sense for most here.
    >>
    >>     I don't doubt that the changes you propose work for you, but they
    >> make me
    >>     > nervous although I'm not the best at reading code and understanding
    >> what it
    >>     > does.  Here's a brain dump on layout in case it helps.
    >>     >
    >>     > So far they work better 'for me' I agree. But I think you probably
    >> know me
    >>     enough by now to know that if I am confident that I have a
    >> contribution
    >>     that is objectively good (passes unit tests compared with swf is my
    >> normal
    >>     benchmark) then I will add it. Part of the reason I started this
    >> discussion
    >>     is because I feel a bit the same way here. I am still learning this
    >> stuff
    >>     and figuring things out, so I am not pushing it because I don't want
    >> to
    >>     inflict anything that is not an objective improvement on others.
    >>
    >>     In terms of describing it, the main thing I think, is that the view
    >> checks
    >>     when layout happens if there was a size change since last time layout
    >> ran,
    >>     or if there was a change in size during the current run. Then there
    >> is some
    >>     somewhat awkward checking to see if the parent might be interested in
    >> this
    >>     because there is some 'sizedToContent' aspect to it (which includes a
    >>     percentage variation on that check). If we think it is relevant, then
    >>     request the parent to layout. Is this likely to do it sometimes when
    >> it is
    >>     not needed, I suspect so. But so far it has not caused any problems
    >> in the
    >>     codebase I am working with.
    >>
    >>     I'm also working on the Grid related stuff, but you could probably
    >> just
    >>     ignore that for now and focus only on the BoxLayout stuff.
    >>
    >>     In Flex, parents always size their children.  The children probably
    >>     > shouldn't override that size or if they do they have to be careful
    >> that it
    >>     > doesn't trigger the another layout in the parent in a way that you
    >> run
    >>     > layout forever (a "layout loop").  In Flex, because of the
    >> LayoutManager
    >>     > running on frame events, that generally doesn't freeze the UI and I
    >> have
    >>     > seen situations where the LayoutManager never goes idle even though
    >> the app
    >>     > appears to be running fine.  There is also the case where the first
    >> layout
    >>     > pass results in scrollbars which causes children to adjust and
    >> results in
    >>     > the removal of scrollbars and that loops forever with the 
scrollbars
    >>     > blinking on and off.  In Royale, there is a greater chance of
    >> hanging.
    >>     >
    >>     > Also in Flex, with the LayoutManager, EVERY widget added itself to
    >> the
    >>     > LayoutManager ensuring validation in a particular order, enforcing
    >> the
    >>     > "parents size children" rule.
    >>     >
    >>     > In Royale, I tried to go without a LayoutManager because we started
    >> out
    >>     > targeting IE8 and I wasn’t sure if there were some things that were
    >>     > exceptions to requestAnimationFrame (like setting text or sizing
    >> images).
    >>     > To this day, I'm concerned that it will create an poor debugging
    >> experience
    >>     > because I think when you hit breakpoints the screen updates.  All
    >> of those
    >>     > things need testing before we try a LayoutManager based on
    >>     > requestAnimationFrame.  And then, as I think you mentioned, we have
    >> to be
    >>     > concerned about how much code is going to run if we start running
    >> all of
    >>     > the validation methods.
    >>     >
    >>     > On the other hand, I think Royale runs layout too often still
    >> because two
    >>     > property changes can trigger two layout passes.  I looked at
    >> BoxLayout
    >>     > which extends LayoutBase which does already watch for
    >>     > widthChanged/heightChanged/sizeChanged so whatever is the root
    >> cause of
    >>     > your problem may not be triggering the layout pass you want,
    >> although the
    >>     > code paths in LayoutBase.childResizeHandler are there to prevent
    >> layout
    >>     > loops.
    >>     >
    >>     > Usually, in Flex, a component didn't change its size in response to
    >> user
    >>     > interaction or data loading, it changed its measured size and 
called
    >>     > invalidateSize on itself and its parent.  The LayoutManager 
measured
    >>     > children before parents, then layed out parents before children.
    >>     >
    >>     > Yeah, that's the vague notion I had, your explanation has helped
    >> cement my
    >>     understanding.
    >>
    >>
    >>     > In Royale, there is little to no measurement subsystem.  That's
    >> because we
    >>     > rely on the browser to "immediately" measure by setting
    >>     > offsetWidth/offsetHeight saving us the impossible task of writing
    >> code to
    >>     > guess at how the browser measures.  For PAYG reasons in Basic,
    >> there is no
    >>     > code looking for changes that should trigger a layout other than
    >> possibly
    >>     > child size changes.  Everything else is supposed to use
    >>     > LayoutChangeNotifier to wire the one event that signals a change to
    >> the
    >>     > container/layout that cares.
    >>
    >>     In MXRoyale, there are complex components that can't rely on
    >>     > offsetWidth/Height since MXRoyale cannot rely on browser layout
    >> because of
    >>     > things like overriding the meaning of width=100%.   MXRoyale has
    >> measure()
    >>     > methods from Flex, but they don't always get run because there is 
no
    >>     > LayoutManager measuring the children before the parents and 
existing
    >>     > measure() methods expect the children to have been measured.  It
    >> might be
    >>     > that is the root cause here.  That some or all invalidateSize()
    >> calls need
    >>     > to call measure() and then instead of calling layoutNeeded on the
    >> parent,
    >>     > call the parent's invalidateSize until somehow we know we've gone
    >> far
    >>     > enough up the chain to start laying out again.
    >>     >
    >>     > After the changes I made I do still need to make changes in some
    >> specific
    >>     areas, but usually this type of thing does the trick:
    >>
    >>                 var layout:BoxLayout =
    >>     containerContents.getBeadByType(BoxLayout) as BoxLayout;
    >>                 if (layout) {
    >>                     layout.measure();
    >>                 }
    >>                 containerContents.layoutNeeded();
    >>
    >>     Note: calling measure() explicitly like that with BoxLayout seems to
    >> be
    >>     necessary sometimes before an explicit layout request. It might only
    >> work
    >>     more after the changes I made, not sure whether it makes a difference
    >>     before or not.
    >>
    >>
    >>     > HTH,
    >>     > -Alex
    >>     >
    >>     >
    >>     > On 6/4/20, 1:51 PM, "Greg Dove" <greg.d...@gmail.com> wrote:
    >>     >
    >>     >     'I don’t think we’ve dealt with a lot of children changing
    >> sizes (other
    >>     >     than Images loading late and a few other things) so it may be
    >> time to
    >>     >     listen to widthChanged/heightChanged/sizeChanged as children
    >> get added
    >>     > if
    >>     >     there isn’t already code doing that.'
    >>     >
    >>     >     That would be another way of doing it. There is already this
    >> code [1]
    >>     > that
    >>     >     is swf-only but seems to only be relevant before
    >> sawInitComplete.
    >>     >
    >>     >     But if the children run their layouts when their own size
    >> changes, then
    >>     >     they can notify their parent as well if the size changed either
    >> before
    >>     > or
    >>     >     during layout. That's sort of what I was trying to do with the
    >>     >     ContainerView change I mentioned earlier. It checks size for
    >> change in
    >>     >     beforeLayout and again in afterLayout and then requests parent
    >> layout
    >>     > if it
    >>     >     thinks the parent needs to do something that could affect 
parent
    >>     > layout or
    >>     >     even re-apply its own rules to the current target. In this way
    >> there
    >>     > is not
    >>     >     a need to add listeners to every child. But I expect there are
    >> some
    >>     >     downsides or things I cannot see with what I did so far because
    >> I have
    >>     > not
    >>     >     spent a lot of time in this code, as you have. I'll post more
    >> details
    >>     > in
    >>     >     the github issue at my EOD.
    >>     >
    >>     >     1.
    >>     >
    >>     >
    >> 
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fapache%2Froyale-asjs%2Fblob%2F9c70b052a6fef3ebe7c6a07ca887af4f7381d46f%2Fframeworks%2Fprojects%2FCore%2Fsrc%2Fmain%2Froyale%2Forg%2Fapache%2Froyale%2Fcore%2FLayoutBase.as%23L131&amp;data=02%7C01%7Caharui%40adobe.com%7C8a6459c6e39047dd9d4608d809e97d92%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637270245738238954&amp;sdata=DtytJwdH1LB91GBcUzPsMGrDRL2jIHAONtVX%2FojUFXA%3D&amp;reserved=0
    >>     >
    >>     >     On Fri, Jun 5, 2020 at 3:32 AM Alex Harui
    >> <aha...@adobe.com.invalid>
    >>     > wrote:
    >>     >
    >>     >     > Serkan, is there a bug tracking your layout issue?
    >>     >     >
    >>     >     > There should be a difference between first layout if all
    >> children
    >>     > have
    >>     >     > known sizes and what Greg is describing which is responding 
to
    >>     > children
    >>     >     > changing sizes.  I don’t think we’ve dealt with a lot of
    >> children
    >>     > changing
    >>     >     > sizes (other than Images loading late and a few other things)
    >> so it
    >>     > may be
    >>     >     > time to listen to widthChanged/heightChanged/sizeChanged as
    >> children
    >>     > get
    >>     >     > added if there isn’t already code doing that.
    >>     >     >
    >>     >     > There might be other issues with containers having an inner
    >>     > contentArea
    >>     >     > that might be getting in the way too.
    >>     >     >
    >>     >     > HTH,
    >>     >     > -Alex
    >>     >     >
    >>     >     > From: Yishay Weiss <yishayj...@hotmail.com>
    >>     >     > Reply-To: "dev@royale.apache.org" <dev@royale.apache.org>
    >>     >     > Date: Thursday, June 4, 2020 at 4:30 AM
    >>     >     > To: "dev@royale.apache.org" <dev@royale.apache.org>
    >>     >     > Subject: RE: MXRoyale layout issues - questions/discussion
    >>     >     >
    >>     >     > Call me lazy but this is a bit difficult to parse. If you can
    >> spare
    >>     > some
    >>     >     > time, maybe come up with a GitHub issue that describes a
    >> concrete
    >>     > case so
    >>     >     > we can discuss this.
    >>     >     >
    >>     >     > > I think the layouts work downward for this, but changes in
    >> the
    >>     > children
    >>     >     > don't seem to trigger the parent layout.
    >>     >     >
    >>     >     > Yes, I’ve seen that as well. Alex’s advice when I pointed it
    >> out to
    >>     > him
    >>     >     > was to just add a parent.dispatchEvent(new
    >> Event(‘layoutNeeded’)) if
    >>     > it
    >>     >     > solves a concrete bug. It’s true that this could result in a
    >>     > performance
    >>     >     > hit. If that’s your issue then I guess we can discuss
    >> emulation of
    >>     > the
    >>     >     > layout manager or some other optimization.
    >>     >     >
    >>     >     >
    >>     >     > From: Greg Dove <greg.d...@gmail.com>
    >>     >     > Sent: Thursday, June 4, 2020 11:12:08 AM
    >>     >     > To: Apache Royale Development <dev@royale.apache.org>
    >>     >     > Subject: MXRoyale layout issues - questions/discussion
    >>     >     >
    >>     >     > Hi,
    >>     >     >
    >>     >     > Just wondered if anyone else is dealing with layout issues in
    >> Flex
    >>     >     > emulation. I have some layout issues that are slowing my
    >> progress on
    >>     > a
    >>     >     > project, and I'd like to resolve them as quickly as I can.
    >>     >     >
    >>     >     > In particular, I see issues with BoxLayout-based containers
    >> which
    >>     > have
    >>     >     > percentWidth or percentHeight set. These don't get determined
    >> as
    >>     > having
    >>     >     > width or height 'SizedToContent' when performing layout, but
    >> in many
    >>     >     > situations they behave in a similar way (they can change
    >> their size
    >>     > based
    >>     >     > on their content in terms of layout rules applied by the
    >> parent
    >>     > container).
    >>     >     > This is because in Flex, percentages are not simply a
    >> percentage of
    >>     > their
    >>     >     > parent, but they follow something perhaps a little closer to
    >> flexbox
    >>     > layout
    >>     >     > rules for all the percentWidth or percentHeight siblings
    >> (managed by
    >>     > their
    >>     >     > parent's layout). In other words, they are also related to 
the
    >>     > measured
    >>     >     > size of their content if the parent needs to manage them (I'm
    >> not
    >>     > sure how
    >>     >     > best to describe this, but I think that sort of captures it).
    >> They
    >>     > can
    >>     >     > expand beyond their percent allocation or contract below it
    >>     > depending on
    >>     >     > their measured sizes.
    >>     >     > I think the layouts work downward for this, but changes in 
the
    >>     > children
    >>     >     > don't seem to trigger the parent layout.
    >>     >     >
    >>     >     > An example might be
    >>     >     > <mx:HBox id='addThingsToMe' width='50%' />
    >>     >     >
    >>     >     > If you have the above at the application level (where the
    >>     > application has
    >>     >     > vertical layout) and keep adding buttons (for example) to the
    >> HBox
    >>     > via a UI
    >>     >     > test button that adds a new Button to that on each click,
    >> then it
    >>     > should
    >>     >     > expand horizontally greater than 50% width when the volume of
    >> buttons
    >>     >     > exceeds its nominal 50% width. It is definitely easier to see
    >> this
    >>     > if you
    >>     >     > add a border to the container.
    >>     >     >
    >>     >     > I have been working on this, and made progress, but the
    >> approach I
    >>     > am using
    >>     >     > feels a bit patchwork, and just wondered whether others are
    >> seeing
    >>     > anything
    >>     >     > like this, and/or how it has been addressed elsewhere....
    >>     >     >
    >>     >     > Here's a summary of some of the things I have been trying,
    >> which do
    >>     > yield
    >>     >     > improvements, but don't really solve the problem completely:
    >>     >     >
    >>     >     > 1. added extra listener for 'childrenRemoved' in BoxLayout
    >> strand
    >>     > setter.
    >>     >     >
    >>     >     > 2. Created a new mx 'ContainerView' class
    >>     >     > (mx.containers.beads.ContainerView extends
    >>     >     > org.apache.royale.html.beads.ContainerView)
    >>     >     > This has the following in it:
    >>     >     >
    >>     >     > private var widthBefore:Number = -1
    >>     >     > private var heightBefore:Number = -1;
    >>     >     > private var sizeChangedBeforeLayout:Boolean;
    >>     >     >
    >>     >     > COMPILE::JS
    >>     >     > override public function beforeLayout():Boolean
    >>     >     > {
    >>     >     > var container:Container = host as Container;
    >>     >     >
    >>     >     > sizeChangedBeforeLayout = (widthBefore != container.width ||
    >>     > heightBefore
    >>     >     > != container.height);
    >>     >     > widthBefore = container.width;
    >>     >     > heightBefore = container.height;
    >>     >     > return super.beforeLayout();
    >>     >     > }
    >>     >     >
    >>     >     >     COMPILE::JS
    >>     >     >     override public function afterLayout():void
    >>     >     >     {
    >>     >     >         var container:Container = host as Container;
    >>     >     > //size might change during layout
    >>     >     > var sizeChangedDuringLayout:Boolean =
    >> !sizeChangedBeforeLayout &&
    >>     >     > (widthBefore != container.width || heightBefore !=
    >> container.height);
    >>     >     > if (sizeChangedDuringLayout) {
    >>     >     > //prepare for next time
    >>     >     > widthBefore = container.width;
    >>     >     > heightBefore = container.height;
    >>     >     > }
    >>     >     > var requestParentLayout:Boolean = sizeChangedBeforeLayout
    >>     >     > || sizeChangedDuringLayout
    >>     >     >           || (!isNaN(container.percentWidth) &&
    >> container.width <
    >>     >     > container.measuredWidth) || (!isNaN(container.percentHeight)
    >> &&
    >>     >     > container.height < container.measuredHeight);
    >>     >     >         if (requestParentLayout && container.parent is
    >> Container) {
    >>     >     > trace('requesting parent layout of ',(container as
    >>     >     > Object).ROYALE_CLASS_INFO.names[0].qName );
    >>     >     >             (container.parent as Container).layoutNeeded();
    >>     >     >         }
    >>     >     >     }
    >>     >     >
    >>     >     > That is pretty much it, and it is being used as a replacement
    >> in my
    >>     > local
    >>     >     > MXRoyale css for Container:
    >>     >     >
    >>     >     >  /*IBeadView:
    >>     >     >
    >> ClassReference("org.apache.royale.html.beads.ContainerView");*/
    >>     >     > IBeadView:
    >> ClassReference("mx.containers.beads.ContainerView");
    >>     >     >
    >>     >     > I'm not saying this is right, but it does help quite a bit
    >> with what
    >>     > I am
    >>     >     > facing.
    >>     >     >
    >>     >     > In addition to BoxLayout in general, I have been working on
    >> the
    >>     >     > Grid/GridRow/GridItem layouts which are more specific in
    >> terms of
    >>     > layout
    >>     >     > changes needed, but also can have similar problems.
    >>     >     >
    >>     >     >
    >>     >     > Although I am seeing improvements with what I have done so
    >> far, I'm
    >>     > not
    >>     >     > really satisfied with it, and I am keen for input/discussion
    >> (or
    >>     >     > collaboration). I have been pursuing what I would mostly
    >> describe as
    >>     > a
    >>     >     > 'workaround' approach, so would welcome any thoughts on how
    >> best to
    >>     > tackle
    >>     >     > this.
    >>     >     > I think there is something missing because of the way Flex
    >> does
    >>     > layouts vs.
    >>     >     > the way Royale does it, but I can't describe it fully yet.
    >> Perhaps
    >>     > things
    >>     >     > are only currently envisaged to work with mxml declarative
    >> content
    >>     > onto
    >>     >     > display and not so much with dynamic updates. But I think
    >> state-based
    >>     >     > changes could have similar effects for some of these things
    >> if they
    >>     > happen
    >>     >     > inside containers that have their own percent dimensions.
    >>     >     >
    >>     >     >
    >>     >     > Thanks,
    >>     >     > Greg
    >>     >     > From: Greg Dove<mailto:greg.d...@gmail.com>
    >>     >     > Sent: Thursday, June 4, 2020 11:12 AM
    >>     >     > To: Apache Royale Development<mailto:dev@royale.apache.org>
    >>     >     > Subject: MXRoyale layout issues - questions/discussion
    >>     >     >
    >>     >     > Hi,
    >>     >     >
    >>     >     > Just wondered if anyone else is dealing with layout issues in
    >> Flex
    >>     >     > emulation. I have some layout issues that are slowing my
    >> progress on
    >>     > a
    >>     >     > project, and I'd like to resolve them as quickly as I can.
    >>     >     >
    >>     >     > In particular, I see issues with BoxLayout-based containers
    >> which
    >>     > have
    >>     >     > percentWidth or percentHeight set. These don't get determined
    >> as
    >>     > having
    >>     >     > width or height 'SizedToContent' when performing layout, but
    >> in many
    >>     >     > situations they behave in a similar way (they can change
    >> their size
    >>     > based
    >>     >     > on their content in terms of layout rules applied by the
    >> parent
    >>     > container).
    >>     >     > This is because in Flex, percentages are not simply a
    >> percentage of
    >>     > their
    >>     >     > parent, but they follow something perhaps a little closer to
    >> flexbox
    >>     > layout
    >>     >     > rules for all the percentWidth or percentHeight siblings
    >> (managed by
    >>     > their
    >>     >     > parent's layout). In other words, they are also related to 
the
    >>     > measured
    >>     >     > size of their content if the parent needs to manage them (I'm
    >> not
    >>     > sure how
    >>     >     > best to describe this, but I think that sort of captures it).
    >> They
    >>     > can
    >>     >     > expand beyond their percent allocation or contract below it
    >>     > depending on
    >>     >     > their measured sizes.
    >>     >     > I think the layouts work downward for this, but changes in 
the
    >>     > children
    >>     >     > don't seem to trigger the parent layout.
    >>     >     >
    >>     >     > An example might be
    >>     >     > <mx:HBox id='addThingsToMe' width='50%' />
    >>     >     >
    >>     >     > If you have the above at the application level (where the
    >>     > application has
    >>     >     > vertical layout) and keep adding buttons (for example) to the
    >> HBox
    >>     > via a UI
    >>     >     > test button that adds a new Button to that on each click,
    >> then it
    >>     > should
    >>     >     > expand horizontally greater than 50% width when the volume of
    >> buttons
    >>     >     > exceeds its nominal 50% width. It is definitely easier to see
    >> this
    >>     > if you
    >>     >     > add a border to the container.
    >>     >     >
    >>     >     > I have been working on this, and made progress, but the
    >> approach I
    >>     > am using
    >>     >     > feels a bit patchwork, and just wondered whether others are
    >> seeing
    >>     > anything
    >>     >     > like this, and/or how it has been addressed elsewhere....
    >>     >     >
    >>     >     > Here's a summary of some of the things I have been trying,
    >> which do
    >>     > yield
    >>     >     > improvements, but don't really solve the problem completely:
    >>     >     >
    >>     >     > 1. added extra listener for 'childrenRemoved' in BoxLayout
    >> strand
    >>     > setter.
    >>     >     >
    >>     >     > 2. Created a new mx 'ContainerView' class
    >>     >     > (mx.containers.beads.ContainerView extends
    >>     >     > org.apache.royale.html.beads.ContainerView)
    >>     >     > This has the following in it:
    >>     >     >
    >>     >     > private var widthBefore:Number = -1
    >>     >     > private var heightBefore:Number = -1;
    >>     >     > private var sizeChangedBeforeLayout:Boolean;
    >>     >     >
    >>     >     > COMPILE::JS
    >>     >     > override public function beforeLayout():Boolean
    >>     >     > {
    >>     >     > var container:Container = host as Container;
    >>     >     >
    >>     >     > sizeChangedBeforeLayout = (widthBefore != container.width ||
    >>     > heightBefore
    >>     >     > != container.height);
    >>     >     > widthBefore = container.width;
    >>     >     > heightBefore = container.height;
    >>     >     > return super.beforeLayout();
    >>     >     > }
    >>     >     >
    >>     >     >     COMPILE::JS
    >>     >     >     override public function afterLayout():void
    >>     >     >     {
    >>     >     >         var container:Container = host as Container;
    >>     >     > //size might change during layout
    >>     >     > var sizeChangedDuringLayout:Boolean =
    >> !sizeChangedBeforeLayout &&
    >>     >     > (widthBefore != container.width || heightBefore !=
    >> container.height);
    >>     >     > if (sizeChangedDuringLayout) {
    >>     >     > //prepare for next time
    >>     >     > widthBefore = container.width;
    >>     >     > heightBefore = container.height;
    >>     >     > }
    >>     >     > var requestParentLayout:Boolean = sizeChangedBeforeLayout
    >>     >     > || sizeChangedDuringLayout
    >>     >     >           || (!isNaN(container.percentWidth) &&
    >> container.width <
    >>     >     > container.measuredWidth) || (!isNaN(container.percentHeight)
    >> &&
    >>     >     > container.height < container.measuredHeight);
    >>     >     >         if (requestParentLayout && container.parent is
    >> Container) {
    >>     >     > trace('requesting parent layout of ',(container as
    >>     >     > Object).ROYALE_CLASS_INFO.names[0].qName );
    >>     >     >             (container.parent as Container).layoutNeeded();
    >>     >     >         }
    >>     >     >     }
    >>     >     >
    >>     >     > That is pretty much it, and it is being used as a replacement
    >> in my
    >>     > local
    >>     >     > MXRoyale css for Container:
    >>     >     >
    >>     >     >  /*IBeadView:
    >>     >     >
    >> ClassReference("org.apache.royale.html.beads.ContainerView");*/
    >>     >     > IBeadView:
    >> ClassReference("mx.containers.beads.ContainerView");
    >>     >     >
    >>     >     > I'm not saying this is right, but it does help quite a bit
    >> with what
    >>     > I am
    >>     >     > facing.
    >>     >     >
    >>     >     > In addition to BoxLayout in general, I have been working on
    >> the
    >>     >     > Grid/GridRow/GridItem layouts which are more specific in
    >> terms of
    >>     > layout
    >>     >     > changes needed, but also can have similar problems.
    >>     >     >
    >>     >     >
    >>     >     > Although I am seeing improvements with what I have done so
    >> far, I'm
    >>     > not
    >>     >     > really satisfied with it, and I am keen for input/discussion
    >> (or
    >>     >     > collaboration). I have been pursuing what I would mostly
    >> describe as
    >>     > a
    >>     >     > 'workaround' approach, so would welcome any thoughts on how
    >> best to
    >>     > tackle
    >>     >     > this.
    >>     >     > I think there is something missing because of the way Flex
    >> does
    >>     > layouts vs.
    >>     >     > the way Royale does it, but I can't describe it fully yet.
    >> Perhaps
    >>     > things
    >>     >     > are only currently envisaged to work with mxml declarative
    >> content
    >>     > onto
    >>     >     > display and not so much with dynamic updates. But I think
    >> state-based
    >>     >     > changes could have similar effects for some of these things
    >> if they
    >>     > happen
    >>     >     > inside containers that have their own percent dimensions.
    >>     >     >
    >>     >     >
    >>     >     > Thanks,
    >>     >     > Greg
    >>     >     >
    >>     >     >
    >>     >
    >>     >
    >>     >
    >>
    >>
    >>
    

Reply via email to