Thanks Alex, that was quick! I will try to find time during my Tuesday-Friday to work on this. Otherwise, if I can't get to it then, I can definitely spend time on it during my next weekend.
On Mon, Jun 8, 2020 at 8:07 PM Alex Harui <aha...@adobe.com.invalid> wrote: > I pushed a branch called ChildResize. It seemed to make the example work > much better, without even getting into measure() changes, possibly because > the example doesn't really test measurement changes. > > IMO, to handle measurement changes, the measure() logic would dispatch > some new event if the measureWidth/Height change. The BoxLayout would be > listening, run its measure(), and dispatch that same event to its parent if > it changes, and if it doesn't change, then run layout. That event would be > listened for in the listenToChildren() method I added to BoxLayout. > > There should be a difference between measurement changes and setting > width/height. If you set width/height on a child, then the child's layout > should run. Assuming layout only runs if width/height change, then I think > it shouldn't really matter that much if it runs before or after notifying > the parent. The parent should honor the width/height so the child's layout > shouldn't run again. The child can check isWidthSizedToContent() to > determine if the parent needs notification. > > If you want to modify the test case to introduce a measurement change then > we can try handling that. Feel free to try adding the measure() handling > to the test case and to BoxLayout. Otherwise I will try to code it up > sometime this week. > > HTH, > -Alex > > On 6/7/20, 4:26 PM, "Greg Dove" <greg.d...@gmail.com> wrote: > > > > > That's my goal in the changes I'm playing with: to mimic the 2 > passes. > > We'll see how it goes. > > > Ok, that's good to know. I hadn't picked up on it being that > extensive. If > there's anything I can help with, please let me know. > > On Mon, Jun 8, 2020 at 11:07 AM Alex Harui <aha...@adobe.com.invalid> > wrote: > > > Responses inline. > > > > On 6/7/20, 2:49 PM, "Greg Dove" <greg.d...@gmail.com> wrote: > > > > > > > > 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. > > > > Yeah, I mentioned that earlier. Not only was it swf-only, it was > only > > prior > > to 'sawInitCompleted' (or whatever the exact name for that flag > is, > > going > > from memory). > > > > I thought I'd read that in one of your posts but couldn't find it > when I > > looked for it. Anyway, the parent needs to listen to each child for > some > > event. > > > > For the 'handleChildrenAdded' thing it also needs to cover > > 'handleChildrenRemoved'. Doing things this way would mean adding > the 3 > > size-related listeners on 'add' child and then removing them on > > 'remove' > > child. But I still think that could be avoidable. > > Why? Because the children are already listening to these events > for > > their own layouts. Their own layouts respond to their size > changes. So > > the > > question is : when does the parent need to know about the > child's size > > change: is it before it does it's own layout, or after (and > could that > > requirement be different for some 'parent' layouts)? The child's > own > > layout > > process can inform the parent in either case via beforeLayout > (where > > the > > parent could even signal to the child not to continue its own > layout, > > in > > which case presumably the parent will simply 'take over') or > > afterLayout(), > > which could trigger a re-flow downwards from the parent - I > definitely > > did > > not do all this with the 'workaround' I already added, but maybe > there > > is > > something to this approach? On the other hand, if as you > suggest, the > > parent layouts are also adding their own listeners to each > child, then > > assuming the execution order of the size change listeners on the > > children > > will be deterministic in terms of when the parent layout runs its > > listener > > versus when the child's own layout runs its listener, it seems > to me > > that > > adding individual listeners to each of the children could be > doubling > > up on > > something that is already possible without doing that (just by > thinking > > about it in a different way : 'the children layouts are already > > listening > > to those events, and it is possible for them to talk to their > parent > > layouts'). > > If all the MXRoyale layouts were doing something like the > 'measure if > > needed' before the layout, then maybe it could actually mimic > the 2 > > passes > > of the Flex approach, using beforeLayout() and afterLayout() to > advise > > the > > parent layouts... just pondering this, not at all sure yet. > > > > I have concerns about using beforeLayout/afterLayout to trigger > another > > layout such as the "layout loop" I wrote about earlier. I would > rather > > mimic the 2 Flex passes where the measuring would happen separately > from > > layout. > > > > > > Also UIComponent's setActualSize() should set the noEvent flag on > > > setWidthAndHeight. > > > > I assume that could work if the layout flow is always from the > root of > > the > > display tree downwards, same as Flex. But if it is signaling up > to let > > parents know that a child's own layout caused some change that > should > > be > > interesting to the parent, I am not so sure how that would work. > > > > IMO, in Flex, if non-layout code set the width/height of some > component, > > that would fire a change event to trigger a layout. But when layout > code > > set the width/height (via setActualSize), it would not fire events > and > > re-trigger another layout pass. It maybe be that instead of setting > > noEvent on setWidthAndHeight that we set some flag in the handler to > ignore > > change events from children. > > > > 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. > > > > Yeah I get that. But unless we actually do the 'measure from > > bottom-up'. > > 'layout from top-down' flow as Flex, I think we might be stuck > with > > some > > sort of workarounds that are not the same as Flex in any case > because > > we > > are already not 'close' enough to how Flex does things (I really > hope > > I am > > wrong, definitely keen to see your solution). > > > > That's my goal in the changes I'm playing with: to mimic the 2 > passes. > > We'll see how it goes. > > > > -Alex > > > > On Sun, Jun 7, 2020 at 7:23 PM Alex Harui > <aha...@adobe.com.invalid> > > wrote: > > > > > 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&data=02%7C01%7Caharui%40adobe.com%7C1aa5a190e8644dd33de108d80b3a37da%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637271691963494100&sdata=Cg4h62rBo8yUCCBqJIYZh9iI2L5lRL2ET6SgUVbWdBQ%3D&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 > > > >> > > > > > >> > > > > > >> > > > > >> > > > > >> > > > > >> > > > >> > > > >> > > > > > > > > > > > > > > > > > >