Hi Alex, Forgot this for now, I must to rethink a bit. I'll be back when I have more clear something. Thanks in advance. Anyway, I think item renderers docs will be very helpful for me and others
Thanks! El mar., 10 mar. 2020 a las 5:51, Alex Harui (<[email protected]>) escribió: > FWIW, I built TDJ locally on Feb 19 when I pushed the has branch. If I go > to the ComboBox there is a demo with sliders and the sliders work for me. > Is that ComboBox virtual or no? > > -Alex > On 3/9/20, 4:54 PM, "Carlos Rovira" <[email protected]> wrote: > > Hi Alex, > > in Jewel ComboBox something is not working as expected for > ItemRenderers, > while in VirtualComboBox is working right. I mean rowCount/rowHeight. > If you check ComboBoxPlayGround in TDJ for an example where those > properties are set (the one with HSliders), you'll see those > properties are > not causing effect. Instead in the VirtualPlayGround a similar > VirtualComboBox is configured with that properties and works ok. > > I think the problem is in the mapper for List, that is different from > Basic. I can investigate if is a good time to remove jewel mappers now > that > renderers are more modular, but I'll need a bit of documentation, > since I'm > digging though all the code and is a bit cumbersome to imagine what's > all > about. > > So could you add some docs to the Itemrenderer royale doc page [1]? I > think > it will be of help to me, and others here, and for users too. > > Thanks in advance > > Carlos > > [1] > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapache.github.io%2Froyale-docs%2Ffeatures%2Fitem-renderers&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725599891&sdata=j9LG%2FW3EhKlHeWgMr%2FRcfkKFind4I1o3pnu2kGnFVGY%3D&reserved=0 > > > El lun., 2 mar. 2020 a las 9:28, Alex Harui (<[email protected] > >) > escribió: > > > > > > > On 3/1/20, 11:54 PM, "Harbs" <[email protected]> wrote: > > > > Sure. I think separating Selection from the Renderer was the > right > > thing to do, but we also need to figure out how to make it do the > “right > > thing” be default. > > > > I’m wondering if there should be a “selectionBead” property in > every > > item renderer which could be null. > > > > Maybe DataContainerBase should accept a selectionRenderer > property the > > same way it accepts an itemRenderer? > > > > > > I don't know what your scenario really is, so don't have an > opinion. The > > SelectableItemRendererClassFactory could look on the List's Strand > for an > > instance of a bead that it can use instead of getting the class > reference > > from CSS. It depends on where you want to control the configuration > and > > why. I'm not sure there will be "one way". > > > > An item renderer should probably only have a selectionBead settable > > property if you can assign different selection beads per renderer, > not per > > list, which is probably renderer-specific and not something for the > base > > classes. > > > > FWIW, DataContainerBase isn't intended to support selection, it is > just > > supposed to crank out a bunch of children for a container. The > Lists are > > generally where selection becomes optional/required. > > > > -Alex > > > > > > > On Mar 2, 2020, at 9:47 AM, Alex Harui > <[email protected]> > > wrote: > > > > > > More loosely-coupled pieces often results in head-scratching. > But > > it also results in PAYG and flexibility. > > > > > > Our job is to find the common patterns, and pre-compose as > needed, > > such as the Express component set. This "has" pattern is a new > pattern so > > we'll have to figure out new best practices. And there are probably > more > > than one. You might want to override what Selection bead is used > > > > > > 1) from some List-level config/attribute/css > > > 2) in the renderer itself > > > 3) by some renderer-level config/attribute/css > > > > > > IMO, it depends on where you want to control the composition. > > > > > > My 2 cents, > > > -Alex > > > > > > On 3/1/20, 11:36 PM, "Harbs" <[email protected]> wrote: > > > > > > Yes. If I replace the default > SelectableItemRendererClassFactory > > > > > > My work-around was to use: > > > > > > js|List{ > > > IItemRendererClassFactory: > > > ClassReference("org.apache.royale.core.OverridableSelectableItemRendererClassFactory"); > > > } > > > > > > The average user will be scratching their heads on how to > solve > > this problem. > > > > > >> On Mar 2, 2020, at 1:19 AM, Alex Harui > <[email protected]> > > wrote: > > >> > > >> > > >> > > >> On 3/1/20, 12:33 AM, "Harbs" <[email protected] <mailto: > > [email protected]>> wrote: > > >> > > >> I’ve also discovered that setting the selection bead is more > > difficult than I would hope it to be. > > >> > > >> For example there should be an easy way to specify the > selection > > bead in a situation like this: > > >> > > >> I may not be understanding the problem. The > SpreadIconRenderer > > could have the SelectionBead in its bead list. > > >> > > >> -Alex > > >> > > >> <js:List > > >> > > itemRenderer="com.printui.view.renderers.SpreadIconRenderer" > > >> height="100%" width="100%" > > >> > > > >> <js:beads> > > >> <js:ArrayListSelectionModel/> > > >> <js:DataItemRendererFactoryForArrayList/> > > >> <js:EasyDataProviderChangeNotifier/> > > >> <js:VScrollViewport id="scrollView"/> > > >> </js:beads> > > >> > > >> </js:List> > > >> > > >>> On Mar 1, 2020, at 1:43 AM, Alex Harui > <[email protected]> > > wrote: > > >>> > > >>> I've tried two different patterns: > > >>> > > >>> 1) ItemRendererOwnerVIew via "has": See > > > Core/src/main/royale/org/apache/royale/core/ItemRendererOwnerViewBead.as. > > Then the ItemRendererClassFactory or the initializer can set it > > >>> > > >>> 2) Baking it in where needed and implementing > > IItemRendererOwnerView and setting it in the initializer. > > >>> > > >>> The main "benefit" of this part of the refactor is that not > all > > item renderers need to be assigned a host since many don't need it, > so it > > is PAYG for those who do. The advantage of the "has" approach is > that > > custom item renderers don't add an itemRendererOwnerView property, > but if > > the component doesn't allow custom item renderers, might be simpler > to use > > approach #2. > > >>> > > >>> HTH, > > >>> -Alex > > >>> > > >>> On 2/29/20, 12:17 PM, "Harbs" <[email protected]> wrote: > > >>> > > >>> What’s the recommended pattern for getting the “data host” > from > > an itemRenderer now that itemRendererParent/itemRendererOwnerView is > no > > longer a “thing”? > > >>> > > >>> I have the following code in an itemRenderer which inherits > from > > DataItemRenderer: > > >>> > > >>> (itemRendererParent.host.parent as > > PagePalette).showMenuHandler(myValueEvent); > > >>> > > >>>> On Feb 24, 2020, at 7:02 PM, Alex Harui > <[email protected]> > > wrote: > > >>>> > > >>>> It seemed like a separate concern. Right now there are two > > highly used ItemRendererClassFactory, but several Initializers. > > >>>> > > >>>> -Alex > > >>>> > > >>>> On 2/24/20, 3:06 AM, "Harbs" <[email protected] > <mailto: > > [email protected]>> wrote: > > >>>> > > >>>> Why is IItemRendererInitializer separate from > > IItemRendererClassFactory? > > >>>> > > >>>>> On Feb 21, 2020, at 12:03 AM, Alex Harui > > <[email protected]> wrote: > > >>>>> > > >>>>> I pushed changes that I think has everything working in > Jewel by > > using the same "has" pattern that is used in other component sets. > > >>>>> > > >>>>> The Lists in the ToDo examples use a regular > > ItemRendererClassFactory instead of > SelectableItemRendererClassFactory that > > is now used in most other places (List/DataGrid/Table) > > >>>>> > > >>>>> The recommended pattern for disabling selection in a list > is > > whether you choose a ClassFactory that attaches a Selection Bead to > each > > renderer. There was an exception to that rule in one of the Table > examples > > because it wanted only certain renderers to not have selection. I > added a > > bead that turns off the selection for that case. IMO, how to deal > with > > such an exception will be based more on what percentage of the > renderers > > need selection. If most do, then add a Selection Bead to all > renderers but > > disable selection where you don't want it. If most do not want > selection, > > then add the bead where you need it. > > >>>>> > > >>>>> Thanks, > > >>>>> -Alex > > >>>>> > > >>>>> On 2/20/20, 11:28 AM, "Carlos Rovira" < > [email protected] > > <mailto:[email protected]> <mailto:[email protected] > <mailto: > > [email protected]>>> wrote: > > >>>>> > > >>>>> yes, Jewel has the "structure" and is organized in SASS > files, > > then > > >>>>> JewelTheme has the "styling" part and is as well SASS. > > >>>>> so Jewel should not need to change, and people should only > need > > to change > > >>>>> JewelTheme or create a new theme one using it as a > template. > > >>>>> > > >>>>> I'll add examples to ant tomorrow > > >>>>> > > >>>>> thanks > > >>>>> > > >>>>> > > >>>>> El jue., 20 feb. 2020 a las 20:17, Alex Harui > > (<[email protected] <mailto:[email protected]>>) > > >>>>> escribió: > > >>>>> > > >>>>>> > > >>>>>> > > >>>>>> On 2/20/20, 11:04 AM, "Carlos Rovira" < > [email protected] > > <mailto:[email protected]>> wrote: > > >>>>>> > > >>>>>> forgot to say. Can you add missing examples to ANT? don't > know > > where > > >>>>>> to do > > >>>>>> that > > >>>>>> and checking Jewel don't see the use of > > >>>>>> SelectableItemRendererClassFactory. > > >>>>>> all times ItemRendererClassFactory is used > > >>>>>> > > >>>>>> I could fix the Ant side, but I don't have time. It > think all > > you need to > > >>>>>> do is add it to the examples/build.xml > > >>>>>> > > >>>>>> I didn't use SelectableItemRendererClassFactory in Jewel > > because I wasn't > > >>>>>> sure if the selection was supposed to be changeable at > > runtime. I think > > >>>>>> you've confirmed that it isn't so we can change to use > > >>>>>> SelectableItemRendererClassFactory > > >>>>>> > > >>>>>> I knew the themes were generated by SASS, but I didn't > realize > > the Jewel > > >>>>>> one was as well. > > >>>>>> > > >>>>>> -Alex > > >>>>>> > > >>>>>> El jue., 20 feb. 2020 a las 20:00, Carlos Rovira (< > > >>>>>> [email protected] <mailto:[email protected] > >>) > > >>>>>> escribió: > > >>>>>> > > >>>>>>> Hi Alex, > > >>>>>>> > > >>>>>>> remember that Jewel uses SASS to create the CSS. I > already > > pushed a > > >>>>>> commit > > >>>>>>> with ["warning"]. It's not the first time I warn about > it ;) > > >>>>>>> You must to change SASS file. The css is just generated > (like > > other > > >>>>>>> generations in compiler), and is committed since no body > added > > SASS > > >>>>>> to ANT. > > >>>>>>> Maven has a sass plugin to compile SASS. > > >>>>>>> > > >>>>>>> I saw you response and commented there > > >>>>>>> > > >>>>>>> Thanks > > >>>>>>> > > >>>>>>> Carlos > > >>>>>>> > > >>>>>>> > > >>>>>>> El jue., 20 feb. 2020 a las 19:55, Alex Harui > > >>>>>> (<[email protected] <mailto: > [email protected]>>) > > >>>>>>> escribió: > > >>>>>>> > > >>>>>>>> I replied on this topic on your commit email. > > >>>>>>>> > > >>>>>>>> So I don't have to copy that into this thread, read > what I > > said in > > >>>>>> that > > >>>>>>>> email and reply on that thread and let's figure out the > right > > thing > > >>>>>> to do. > > >>>>>>>> I am having some weird problem with my Maven build where > > every time > > >>>>>> I try > > >>>>>>>> to change Jewel's defaults.css something overwrites > it. I'm > > trying > > >>>>>> to > > >>>>>>>> figure out what is going on there. > > >>>>>>>> > > >>>>>>>> -Alex > > >>>>>>>> > > >>>>>>>> On 2/20/20, 10:47 AM, "Carlos Rovira" < > > [email protected] <mailto:[email protected]>> > > >>>>>> wrote: > > >>>>>>>> > > >>>>>>>> Hi Alex, > > >>>>>>>> > > >>>>>>>> I found that TodoMVC examples was not working, so I > fixed it > > >>>>>> removing > > >>>>>>>> the > > >>>>>>>> non existing properties (hoverable and selectable). > > >>>>>>>> But I found Jewel ListItemRenderer has all baked, so I > > created a > > >>>>>>>> SimpleListItemRenderer (in Jewel Simple in the normal > prefix > > >>>>>> for a > > >>>>>>>> "base", > > >>>>>>>> "basic" or "simple" option) that hast the minimum > required. > > >>>>>>>> > > >>>>>>>> So at least in Jewel if people wants hoverable and > selectable > > >>>>>>>> renderers use > > >>>>>>>> the normal ListItemRenderer. > > >>>>>>>> If don't want that indicators, use > SimpleListItemRenderer. If > > >>>>>> you > > >>>>>>>> want just > > >>>>>>>> show hover, but not selected state, then extend Simple > version > > >>>>>> and > > >>>>>>>> add " > > >>>>>>>> ClassSelectorListRuntimeSelectableItemRendererBead" and > > >>>>>> configure to > > >>>>>>>> have > > >>>>>>>> just "hoverable" to true ¿ok? > > >>>>>>>> > > >>>>>>>> Hope I understand ok how it works. Let me know if > something is > > >>>>>> not as > > >>>>>>>> expected. > > >>>>>>>> > > >>>>>>>> Thanks > > >>>>>>>> > > >>>>>>>> Carlos > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> El jue., 20 feb. 2020 a las 18:06, Alex Harui > > >>>>>>>> (<[email protected] <mailto: > [email protected] > > >>) > > >>>>>>>> escribió: > > >>>>>>>> > > >>>>>>>>> I'm not sure I understand what you mean by "control". > > >>>>>>>>> > > >>>>>>>>> Before the "has" changes, every ItemRenderer contained > or > > >>>>>> inherited > > >>>>>>>> code > > >>>>>>>>> that had hovered/selected APIs that drew visuals, and > the > > >>>>>>>> ItemRenderer also > > >>>>>>>>> "had" a bead like ItemRendererMouseController that set > the > > >>>>>> hovered > > >>>>>>>> property > > >>>>>>>>> on that item renderer, and the List's controller would > set > > the > > >>>>>>>> selected > > >>>>>>>>> property. > > >>>>>>>>> > > >>>>>>>>> Now, every ItemRenderer "has" a bead that has the > > >>>>>> hovered/selected > > >>>>>>>>> properties, and the ItemRendererMouseController and the > > >>>>>> Lists's > > >>>>>>>> controllers > > >>>>>>>>> get that bead instead of talking to the ItemRenderer > > >>>>>> directly. I > > >>>>>>>> guess > > >>>>>>>>> that's the new way of thinking for has/composition vs > > >>>>>>>> is/inheritance: a > > >>>>>>>>> component doesn't have to have all of its APIs glued > to its > > >>>>>> API > > >>>>>>>> surface. > > >>>>>>>>> We mainly do that for convenience in MXML, but for more > > >>>>>> internal > > >>>>>>>> stuff like > > >>>>>>>>> this, loose-coupling via has/composition shared more > code and > > >>>>>>>> increases > > >>>>>>>>> configurability, but does add some runtime overhead in > its > > >>>>>> raw form. > > >>>>>>>>> Hopefully we can optimize that away. > > >>>>>>>>> > > >>>>>>>>> HTH, > > >>>>>>>>> -Alex > > >>>>>>>>> > > >>>>>>>>> On 2/20/20, 5:01 AM, "Piotr Zarzycki" < > > >>>>>> [email protected] <mailto: > [email protected]>> > > >>>>>>>> wrote: > > >>>>>>>>> > > >>>>>>>>> Hi Alex, > > >>>>>>>>> > > >>>>>>>>> Could you provide an example how would I control > > >>>>>>>> hovering/selecting in > > >>>>>>>>> item > > >>>>>>>>> renderer when I don't have build in hover property > etc. ? > > >>>>>> How > > >>>>>>>> should I > > >>>>>>>>> compose such item renderer ? > > >>>>>>>>> > > >>>>>>>>> Thanks, > > >>>>>>>>> Piotr > > >>>>>>>>> > > >>>>>>>>> czw., 20 lut 2020 o 03:20 Alex Harui > > >>>>>> <[email protected] <mailto: > [email protected]>> > > >>>>>>>>> napisał(a): > > >>>>>>>>> > > >>>>>>>>>> I pushed the "has" changes. TourDeJewel seems to be > > >>>>>> working > > >>>>>>>>> correctly for > > >>>>>>>>>> me. > > >>>>>>>>>> > > >>>>>>>>>> The principle of "has" is similar to inheritance vs > > >>>>>>>> composition. > > >>>>>>>>> Just > > >>>>>>>>>> like top-level components like List are composed of > many > > >>>>>>>> beads, the > > >>>>>>>>> item > > >>>>>>>>>> renderers are now composed of more beads as well. > That > > >>>>>>>> reduces the > > >>>>>>>>>> requirement to add code to a class in order to "be/is" > > >>>>>>>> something. > > >>>>>>>>>> > > >>>>>>>>>> There used to be copies of code that drew hover and > > >>>>>> selected > > >>>>>>>> states > > >>>>>>>>> on > > >>>>>>>>>> the item renderers in each new kind of item renderer > > >>>>>> that > > >>>>>>>> couldn't > > >>>>>>>>> inherit > > >>>>>>>>>> from an item renderer that could draw selected and > > >>>>>> hovered > > >>>>>>>> states. > > >>>>>>>>> Now, > > >>>>>>>>>> the itemrenderers compose their selection visuals. A > > >>>>>> single > > >>>>>>>> item > > >>>>>>>>> renderer > > >>>>>>>>>> like StringItemRenderer can be composed with no > > >>>>>> selection > > >>>>>>>> drawing at > > >>>>>>>>> all, > > >>>>>>>>>> or with solid color selection drawing or with > alternate > > >>>>>> color > > >>>>>>>>> selection > > >>>>>>>>>> drawing or something new. And that means that some > > >>>>>> new > > >>>>>>>> kind of > > >>>>>>>>> item > > >>>>>>>>>> renderer, like a TextInput can become an item renderer > > >>>>>> more > > >>>>>>>> easily, > > >>>>>>>>> by > > >>>>>>>>>> composing a selection visuals bead instead of having > to > > >>>>>> add > > >>>>>>>> all of > > >>>>>>>>> that > > >>>>>>>>>> code. > > >>>>>>>>>> > > >>>>>>>>>> Another place I started using "has" but didn't fully > > >>>>>> replace > > >>>>>>>> the old > > >>>>>>>>> code > > >>>>>>>>>> was in handling itemRendererParent, which is now > called > > >>>>>>>>>> itemRendererOwnerView (to try to make it more clear > > >>>>>> that isn't > > >>>>>>>>> always the > > >>>>>>>>>> parent of the item renderer and is sometimes an > internal > > >>>>>>>>>> datagroup/container). Turns out a lot of our > renderers > > >>>>>>>> didn't need > > >>>>>>>>> to know > > >>>>>>>>>> the itemRendererParent, so in many cases we no longer > > >>>>>> figure > > >>>>>>>> it out > > >>>>>>>>> and > > >>>>>>>>>> assign it. But in cases where it is needed, the > > >>>>>> property is > > >>>>>>>>> currently left > > >>>>>>>>>> baked into the renderer, but in some new cases, it is > > >>>>>>>> composed. An > > >>>>>>>>>> ItemRendererOwnerViewBead is added to the strand > > >>>>>> instead of > > >>>>>>>> added to > > >>>>>>>>> a > > >>>>>>>>>> class and contains the reference to the ownerView. > > >>>>>> Maybe > > >>>>>>>> someday > > >>>>>>>>> we'll > > >>>>>>>>>> fully remove the old pattern, not sure. > > >>>>>>>>>> > > >>>>>>>>>> Ideally we would do more "has" than "is". It could > > >>>>>> allow us > > >>>>>>>> to > > >>>>>>>>> eliminate > > >>>>>>>>>> much of the required code to be a top tag in an MXML > > >>>>>> document. > > >>>>>>>>>> > > >>>>>>>>>> Other changes in this branch were to add > "Initializers" > > >>>>>> so the > > >>>>>>>>>> RendererFactories didn't bake in code for specific > item > > >>>>>>>> renderers, > > >>>>>>>>> and to > > >>>>>>>>>> create a few base classes with overrides so there is > > >>>>>> less > > >>>>>>>> code to > > >>>>>>>>> maintain. > > >>>>>>>>>> > > >>>>>>>>>> There should be little if any impact to application > > >>>>>> code. It > > >>>>>>>> should > > >>>>>>>>>> mainly affect the internals of how item renderer-based > > >>>>>> things > > >>>>>>>> are > > >>>>>>>>> created. > > >>>>>>>>>> > > >>>>>>>>>> Thanks, > > >>>>>>>>>> -Alex > > >>>>>>>>>> > > >>>>>>>>>> On 2/17/20, 4:33 PM, "Carlos Rovira" < > > >>>>>> [email protected] <mailto:[email protected]> > > >>>>>>>>> > > >>>>>>>>> wrote: > > >>>>>>>>>> > > >>>>>>>>>> Hi Alex, > > >>>>>>>>>> > > >>>>>>>>>> if will be of help if you point us to different > > >>>>>> links > > >>>>>>>> where we > > >>>>>>>>> can > > >>>>>>>>>> learn > > >>>>>>>>>> about this modifications, since I at least can just > > >>>>>>>> imagine what > > >>>>>>>>> is all > > >>>>>>>>>> about, but will need to get deeper in the concepts > > >>>>>> to > > >>>>>>>> understand > > >>>>>>>>> the > > >>>>>>>>>> changes and to apply this patterns. > > >>>>>>>>>> > > >>>>>>>>>> In Jewel each "list component has its own type of > > >>>>>>>> renderer, so > > >>>>>>>>> for > > >>>>>>>>>> example > > >>>>>>>>>> List uses ListItemRenderer and DataGrid has > > >>>>>>>>> DataGridItemRenderer, since > > >>>>>>>>>> usually at that component level the user needs > > >>>>>> similar > > >>>>>>>>> infrastructure > > >>>>>>>>>> like > > >>>>>>>>>> hoverable, selectable...and some (not much) more, > > >>>>>> don't > > >>>>>>>> know > > >>>>>>>>> right now > > >>>>>>>>>> how > > >>>>>>>>>> all this will fit with the "has" new > > >>>>>> pattern....I'll try > > >>>>>>>> it. > > >>>>>>>>>> > > >>>>>>>>>> Just one important thing. There's actual users and > > >>>>>>>> clients using > > >>>>>>>>> Jewel > > >>>>>>>>>> and > > >>>>>>>>>> other UI sets and are with very short times for > > >>>>>> their > > >>>>>>>>> migrations, so > > >>>>>>>>>> just > > >>>>>>>>>> want to ask you to test as much as possible, since > > >>>>>> TDJ > > >>>>>>>> has many > > >>>>>>>>>> examples > > >>>>>>>>>> now. Other thing you can test is new TodoMVC to see > > >>>>>> how it > > >>>>>>>>> behaves, > > >>>>>>>>>> since > > >>>>>>>>>> it uses a List with IRs. So we can ensure (as much > > >>>>>> as we > > >>>>>>>> can) > > >>>>>>>>> the merge > > >>>>>>>>>> left things working (as much as we can) > > >>>>>>>>>> > > >>>>>>>>>> Thanks for working on this, will try all of this > > >>>>>> tomorrow > > >>>>>>>>>> > > >>>>>>>>>> Carlos > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> El lun., 17 feb. 2020 a las 22:35, Alex Harui > > >>>>>>>>>> (<[email protected] <mailto: > [email protected] > > >>) > > >>>>>>>>>> escribió: > > >>>>>>>>>> > > >>>>>>>>>>> I've pushed the "has" branch that contains a > > >>>>>>>> refactoring of > > >>>>>>>>> the item > > >>>>>>>>>>> renderers. Tour De Jewel and MDL Example seem to > > >>>>>> be > > >>>>>>>> working > > >>>>>>>>> as is > > >>>>>>>>>> Basic > > >>>>>>>>>>> List Example and MX AdvancedDataGrid. > > >>>>>>>>>>> > > >>>>>>>>>>> "has" is really just calls to getBeadByType. If > > >>>>>> we > > >>>>>>>> start to > > >>>>>>>>> see > > >>>>>>>>>>> performance issues, then we'll look into > > >>>>>> optimizing. > > >>>>>>>> The > > >>>>>>>>> motivation > > >>>>>>>>>> to > > >>>>>>>>>>> switch to "has" came from several bugs about > > >>>>>> using MX > > >>>>>>>>> Label/CheckBox > > >>>>>>>>>> as > > >>>>>>>>>>> item renderers. In Royale, the ItemRenderers > > >>>>>> were in > > >>>>>>>> control > > >>>>>>>>> of the > > >>>>>>>>>>> visuals of their rollover and selected state. > > >>>>>> That is > > >>>>>>>> a more > > >>>>>>>>> proper > > >>>>>>>>>>> encapsulation than the way it was in Flex where > > >>>>>> the > > >>>>>>>> lists drew > > >>>>>>>>> the > > >>>>>>>>>> rollover > > >>>>>>>>>>> and selected states and it was hard to override > > >>>>>> the > > >>>>>>>> visuals > > >>>>>>>>> for a > > >>>>>>>>>> custom > > >>>>>>>>>>> item renderer. But in the develop branch Royale > > >>>>>> code, > > >>>>>>>> it would > > >>>>>>>>>> require > > >>>>>>>>>>> that custom itemrenderers implement a lot of APIs > > >>>>>>>> related to > > >>>>>>>>>> rollover and > > >>>>>>>>>>> selected visuals. Instead we can now reuse/share > > >>>>>> code > > >>>>>>>> for > > >>>>>>>>> visuals > > >>>>>>>>>> between > > >>>>>>>>>>> different renderers because a renderer now can > > >>>>>> "has" a > > >>>>>>>>>> rollover/selection > > >>>>>>>>>>> implementation instead of being one. > > >>>>>>>>>>> > > >>>>>>>>>>> There are more pieces involved, but there is more > > >>>>>>>> sharing of > > >>>>>>>>> code. > > >>>>>>>>>> Along > > >>>>>>>>>>> the way I found that there were some not-so-PAYG > > >>>>>>>> patterns > > >>>>>>>>> being used > > >>>>>>>>>> in MDL > > >>>>>>>>>>> and Jewel renderers that might deserve further > > >>>>>>>> modification. > > >>>>>>>>> There > > >>>>>>>>>> are > > >>>>>>>>>>> "hoverable" and "selectable" APIs that appear to > > >>>>>> be > > >>>>>>>> used to > > >>>>>>>>>> permanently > > >>>>>>>>>>> turn off selection and hover visuals. In > > >>>>>> general, I > > >>>>>>>> think > > >>>>>>>>> there is > > >>>>>>>>>> better > > >>>>>>>>>>> use of PAYG and composition when functionality is > > >>>>>>>> "built up" > > >>>>>>>>> and not > > >>>>>>>>>>> "turned off", so with the "has" pattern the > > >>>>>> renderers > > >>>>>>>> can be > > >>>>>>>>> added > > >>>>>>>>>> to a > > >>>>>>>>>>> list without any selection visuals at all (for a > > >>>>>>>> non-selectable > > >>>>>>>>>> list) or > > >>>>>>>>>>> re-composed with custom visuals that only support > > >>>>>>>> hoverable, > > >>>>>>>>> for > > >>>>>>>>>> example. > > >>>>>>>>>>> I left it "hoverable/selectable" in the API > > >>>>>> surface for > > >>>>>>>> now, > > >>>>>>>>> but > > >>>>>>>>>> something > > >>>>>>>>>>> to think about going forward. > > >>>>>>>>>>> > > >>>>>>>>>>> I’m going to run a few more tests before merging > > >>>>>> and > > >>>>>>>> pushing to > > >>>>>>>>>> develop. > > >>>>>>>>>>> > > >>>>>>>>>>> -Alex > > >>>>>>>>>>> > > >>>>>>>>>>> On 1/15/20, 10:44 PM, "Alex Harui" > > >>>>>>>> <[email protected] <mailto: > [email protected]>> > > >>>>>>>>> wrote: > > >>>>>>>>>>> > > >>>>>>>>>>> You are welcome to try and see how many cache > > >>>>>> hits > > >>>>>>>> it > > >>>>>>>>> gets. I > > >>>>>>>>>> think > > >>>>>>>>>>> in renderers, we ask once per renderer. I'm not > > >>>>>> sure > > >>>>>>>> there is > > >>>>>>>>> a > > >>>>>>>>>> faster way > > >>>>>>>>>>> to do the first lookup of "is", but for "has" we > > >>>>>> could > > >>>>>>>> change > > >>>>>>>>> the > > >>>>>>>>>> lookup > > >>>>>>>>>>> and save time. > > >>>>>>>>>>> > > >>>>>>>>>>> On 1/15/20, 10:38 PM, "Greg Dove" < > > >>>>>>>> [email protected] <mailto:[email protected]>> > > >>>>>>>>> wrote: > > >>>>>>>>>>> > > >>>>>>>>>>> For the 'something is ISomeInterface' > > >>>>>>>>>>> I had wondered in the past if these types > > >>>>>> of > > >>>>>>>> lookups > > >>>>>>>>> could be > > >>>>>>>>>>> incrementally > > >>>>>>>>>>> cached on the 'is' target (after first > > >>>>>> lookup), > > >>>>>>>> that > > >>>>>>>>> might > > >>>>>>>>>> make > > >>>>>>>>>>> sense for > > >>>>>>>>>>> interfaces, which are the deepest checks I > > >>>>>>>> think? > > >>>>>>>>>>> caching result (could optionally create > > >>>>>> the Map) > > >>>>>>>>>>> > > >>>>>>>> ISomeInterface['implMap'].set(something.constructor, > > >>>>>>>>>> isResult ) > > >>>>>>>>>>> > > >>>>>>>>>>> then earlier in the interface checks, it > > >>>>>> could > > >>>>>>>> do > > >>>>>>>>> something > > >>>>>>>>>> like: > > >>>>>>>>>>> if (ISomeInterface['implMap'] && > > >>>>>>>>>>> > > >>>>>>>> ISomeInterface['implMap'].has(something.constructor) ) > > >>>>>>>>> return > > >>>>>>>>>>> > > >>>>>>>> ISomeInterface['implMap'].get(something.constructor) > > >>>>>>>>>>> > > >>>>>>>>>>> I realize its extra code, but it should be > > >>>>>>>> quite a bit > > >>>>>>>>>> faster over > > >>>>>>>>>>> time I > > >>>>>>>>>>> think. > > >>>>>>>>>>> > > >>>>>>>>>>> On Thu, Jan 16, 2020 at 7:20 PM Alex Harui > > >>>>>>>>>>> <[email protected] <mailto: > [email protected]>> > > wrote: > > >>>>>>>>>>> > > >>>>>>>>>>>> Hi, > > >>>>>>>>>>>> > > >>>>>>>>>>>> Several different threads have brought > > >>>>>> up > > >>>>>>>> issues with > > >>>>>>>>>> sharing > > >>>>>>>>>>> code between > > >>>>>>>>>>>> component sets. Other threads have > > >>>>>> offered > > >>>>>>>>> different and > > >>>>>>>>>> clever > > >>>>>>>>>>> ways to > > >>>>>>>>>>>> do various things like how MXML is > > >>>>>> applied to > > >>>>>>>> a > > >>>>>>>>> component. > > >>>>>>>>>>> Meanwhile, over > > >>>>>>>>>>>> in MX emulation, I was starting to copy > > >>>>>> some > > >>>>>>>> code > > >>>>>>>>> from > > >>>>>>>>>> Basic to > > >>>>>>>>>>> MXRoyale to > > >>>>>>>>>>>> get the various MX components to be > > >>>>>> valid item > > >>>>>>>>> renderers. > > >>>>>>>>>>> MXRoyale is > > >>>>>>>>>>>> using Basic's item renderer architecture > > >>>>>>>> which is > > >>>>>>>>> better > > >>>>>>>>>>> encapsulated: the > > >>>>>>>>>>>> renderer draws its hovered and selected > > >>>>>>>> state. In > > >>>>>>>>> Flex, > > >>>>>>>>>> the > > >>>>>>>>>>> List draws > > >>>>>>>>>>>> over the renderer, which makes it hard > > >>>>>> to > > >>>>>>>> customize > > >>>>>>>>> the > > >>>>>>>>>> way the > > >>>>>>>>>>> renderer > > >>>>>>>>>>>> will look when hovered and selected. > > >>>>>>>>>>>> > > >>>>>>>>>>>> It finally occurred to me that one of > > >>>>>> the > > >>>>>>>> reasons we > > >>>>>>>>> end up > > >>>>>>>>>>> copying code > > >>>>>>>>>>>> is because we are still using too many > > >>>>>> "is" > > >>>>>>>> checks > > >>>>>>>>> instead > > >>>>>>>>>> of > > >>>>>>>>>>> "has" > > >>>>>>>>>>>> checks. I'm not even sure we have any > > >>>>>> "has" > > >>>>>>>> checks > > >>>>>>>>> in the > > >>>>>>>>>> Royale > > >>>>>>>>>>>> framework. I was afraid of the > > >>>>>> overhead of a > > >>>>>>>> "has" > > >>>>>>>>> check, > > >>>>>>>>>> but > > >>>>>>>>>>> I'm starting > > >>>>>>>>>>>> to change my mind because: > > >>>>>>>>>>>> > > >>>>>>>>>>>> 1) The "is" check actually runs a fair > > >>>>>> amount > > >>>>>>>> of > > >>>>>>>>> code, > > >>>>>>>>>>> especially for > > >>>>>>>>>>>> (comp is ISomeInterface) > > >>>>>>>>>>>> 2) The length of bead arrays don't seem > > >>>>>> too > > >>>>>>>> long. > > >>>>>>>>>>>> > > >>>>>>>>>>>> A "has" check calls > > >>>>>>>> getBeadByType(ISomeInterface), > > >>>>>>>>> so it > > >>>>>>>>>>> actually will run > > >>>>>>>>>>>> the (bead is ISomeInterface) on > > >>>>>> potentially > > >>>>>>>> the > > >>>>>>>>> entire > > >>>>>>>>>> strand > > >>>>>>>>>>> array/vector, > > >>>>>>>>>>>> although we could speed that up by > > >>>>>> annotating > > >>>>>>>> beads > > >>>>>>>>> or > > >>>>>>>>>> keeping > > >>>>>>>>>>> track of > > >>>>>>>>>>>> what is on the strand. But the code > > >>>>>>>> sharing/reuse > > >>>>>>>>>> potential of > > >>>>>>>>>>> this > > >>>>>>>>>>>> pattern seems significant to me. > > >>>>>>>>>>>> > > >>>>>>>>>>>> For example, it could change how hard > > >>>>>> it is > > >>>>>>>> to make a > > >>>>>>>>>> component > > >>>>>>>>>>> usable as > > >>>>>>>>>>>> a top tag in MXML. Instead of the > > >>>>>> component > > >>>>>>>> having > > >>>>>>>>> to > > >>>>>>>>>> implement > > >>>>>>>>>>> certain > > >>>>>>>>>>>> methods, the component could have a bead > > >>>>>>>> installed > > >>>>>>>>> and the > > >>>>>>>>>>>> MXMLDataInterpreter could talk to that > > >>>>>> bead > > >>>>>>>> instead > > >>>>>>>>> of the > > >>>>>>>>>>> component. > > >>>>>>>>>>>> > > >>>>>>>>>>>> In the case of the item renderers, > > >>>>>> instead of > > >>>>>>>>> testing if > > >>>>>>>>>> the > > >>>>>>>>>>> renderer "is" > > >>>>>>>>>>>> ISelectableLIstItemRenderer, it could > > >>>>>> ask if > > >>>>>>>> the > > >>>>>>>>> created > > >>>>>>>>>> widget > > >>>>>>>>>>> "has" an > > >>>>>>>>>>>> ISelectableLIstItemRenderer bead and the > > >>>>>>>> logic in > > >>>>>>>>> that > > >>>>>>>>>> bead can > > >>>>>>>>>>> be reused > > >>>>>>>>>>>> in both Basic and MXRoyale without being > > >>>>>>>> copied. > > >>>>>>>>>>>> > > >>>>>>>>>>>> Some code, like Container overrides of > > >>>>>>>> addElement > > >>>>>>>>> probably > > >>>>>>>>>> can't > > >>>>>>>>>>> be > > >>>>>>>>>>>> refactored into a "has". But I wonder > > >>>>>> how > > >>>>>>>> many other > > >>>>>>>>>> things > > >>>>>>>>>>> could. I'm > > >>>>>>>>>>>> not sure I would move everything that > > >>>>>> could > > >>>>>>>> be moved > > >>>>>>>>> into a > > >>>>>>>>>>> shared bead. > > >>>>>>>>>>>> We'd have to think about the overhead > > >>>>>> on small > > >>>>>>>>> components > > >>>>>>>>>> and > > >>>>>>>>>>> apps. But > > >>>>>>>>>>>> for MXML support and Item Renderer > > >>>>>> support, > > >>>>>>>> it seems > > >>>>>>>>> to > > >>>>>>>>>> make > > >>>>>>>>>>> sense. > > >>>>>>>>>>>> > > >>>>>>>>>>>> Anyway, I will look into refactoring > > >>>>>> the item > > >>>>>>>>> renderer > > >>>>>>>>>> code in > > >>>>>>>>>>> a few days > > >>>>>>>>>>>> unless feedback indicates otherwise. > > >>>>>> Bugs > > >>>>>>>> like #676 > > >>>>>>>>> and > > >>>>>>>>>> #681 > > >>>>>>>>>>> inspired this > > >>>>>>>>>>>> post. > > >>>>>>>>>>>> > > >>>>>>>>>>>> Of course, I could be wrong... > > >>>>>>>>>>>> -Alex > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> -- > > >>>>>>>>>> Carlos Rovira > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>> > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725599891&sdata=z5Qw0OvSwtILm%2B3e%2Bw9aKu02Hu4uLzIb540OehTuiro%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725599891&sdata=z5Qw0OvSwtILm%2B3e%2Bw9aKu02Hu4uLzIb540OehTuiro%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725599891&sdata=z5Qw0OvSwtILm%2B3e%2Bw9aKu02Hu4uLzIb540OehTuiro%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=ud9Eva2B84DoW%2B8d0xjB5cBX29PFyW8qKNvxihEoBNM%3D&reserved=0 > >> > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=ud9Eva2B84DoW%2B8d0xjB5cBX29PFyW8qKNvxihEoBNM%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=ud9Eva2B84DoW%2B8d0xjB5cBX29PFyW8qKNvxihEoBNM%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=ud9Eva2B84DoW%2B8d0xjB5cBX29PFyW8qKNvxihEoBNM%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=ud9Eva2B84DoW%2B8d0xjB5cBX29PFyW8qKNvxihEoBNM%3D&reserved=0 > > >>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> -- > > >>>>>>>>> > > >>>>>>>>> Piotr Zarzycki > > >>>>>>>>> > > >>>>>>>>> Patreon: * > > >>>>>>>>> > > >>>>>>>> > > >>>>>> > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=sor6yeinm63kwuhkq8y0xWnNSlhC6E80lmT8wk5QRMU%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=sor6yeinm63kwuhkq8y0xWnNSlhC6E80lmT8wk5QRMU%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=sor6yeinm63kwuhkq8y0xWnNSlhC6E80lmT8wk5QRMU%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=sor6yeinm63kwuhkq8y0xWnNSlhC6E80lmT8wk5QRMU%3D&reserved=0 > >> > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=sor6yeinm63kwuhkq8y0xWnNSlhC6E80lmT8wk5QRMU%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=sor6yeinm63kwuhkq8y0xWnNSlhC6E80lmT8wk5QRMU%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725609846&sdata=sor6yeinm63kwuhkq8y0xWnNSlhC6E80lmT8wk5QRMU%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=Kp9gcZ0f6ITkdFQAvOD2vWVACpJkgSuuNEYrYX884io%3D&reserved=0 > > >>> > > >>>>>>>>> < > > >>>>>>>>> > > >>>>>>>> > > >>>>>> > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=Kp9gcZ0f6ITkdFQAvOD2vWVACpJkgSuuNEYrYX884io%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=Kp9gcZ0f6ITkdFQAvOD2vWVACpJkgSuuNEYrYX884io%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=Kp9gcZ0f6ITkdFQAvOD2vWVACpJkgSuuNEYrYX884io%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=Kp9gcZ0f6ITkdFQAvOD2vWVACpJkgSuuNEYrYX884io%3D&reserved=0 > >> > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=Kp9gcZ0f6ITkdFQAvOD2vWVACpJkgSuuNEYrYX884io%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=Kp9gcZ0f6ITkdFQAvOD2vWVACpJkgSuuNEYrYX884io%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=Kp9gcZ0f6ITkdFQAvOD2vWVACpJkgSuuNEYrYX884io%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=Kp9gcZ0f6ITkdFQAvOD2vWVACpJkgSuuNEYrYX884io%3D&reserved=0 > > >>> > > >>>>>>>>>> * > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>>>> -- > > >>>>>>>> Carlos Rovira > > >>>>>>>> > > >>>>>>>> > > >>>>>> > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=CoGkfcg2u0cnM34NilDnAhNPLc71sHZw1mDXva5JNcU%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=CoGkfcg2u0cnM34NilDnAhNPLc71sHZw1mDXva5JNcU%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=CoGkfcg2u0cnM34NilDnAhNPLc71sHZw1mDXva5JNcU%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725619797&sdata=CoGkfcg2u0cnM34NilDnAhNPLc71sHZw1mDXva5JNcU%3D&reserved=0 > >> > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > >>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>>> -- > > >>>>>>> Carlos Rovira > > >>>>>>> > > >>>>>> > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > >> > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > >>> > > >>>>>>> > > >>>>>>> > > >>>>>> > > >>>>>> -- > > >>>>>> Carlos Rovira > > >>>>>> > > >>>>>> > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725629751&sdata=tQd7vkCt3B1QOiiu5XWXMzzUDSsKceMWDh1PegZKdgs%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > >> > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > >>> > > >>>>>> > > >>>>>> > > >>>>>> > > >>>>> > > >>>>> -- > > >>>>> Carlos Rovira > > >>>>> > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > >> > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725639714&sdata=9c1Ko4euWufPYt%2Bq0zhrzDezWY77%2FM92FO2LBDac6QE%3D&reserved=0 > > < > > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725649667&sdata=z4NUk9PMRcAxzHa6RY%2FYvfFUXIgt9xVL3RZyV9oRFjY%3D&reserved=0 > > >>> > > > > > > > > > > > > > > > > > > > > > -- > Carlos Rovira > > https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7Cb3e2d89dd1f54315e55708d7c48535c8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637193948725649667&sdata=z4NUk9PMRcAxzHa6RY%2FYvfFUXIgt9xVL3RZyV9oRFjY%3D&reserved=0 > > > -- Carlos Rovira http://about.me/carlosrovira
