Hi Peter, What about DataProviderItemsChangeNotifier - It exactly doing what you are saying and what that restoration bead needs. What do you think ?
Thanks, Piotr 2018-01-03 18:05 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: > I've spent this morning wrestling with this. > > Right now when a model (eg, ArraySelectionModel, ArrayListSelectionModel) > has its dataProvider replaced, it will set the selectedIndex to -1 (and > selectedItem to null) if the dataProvider is being set to null; otherwise > it leaves the values unchanged unless the current value exceeds the size > of the new dataProvider. > > A typical way to change things is to update the dataProvider and then set > the list.dataProvider to null (selectedIndex becomes -1, dispatches > "selectedIndexChanged") followed setting list.dataProvider back to the > original dataProvider. This is done because we did not have a dynamic > system. Reseting the selection in this cause falls on the application > writer. > > For dynamic data, I think we also need a dynamic model (eg, > DynamicCollectionViewSelectionModel) which is tuned into the needs of a > dynamic system. > > Before changing a dataProvider, the DyanmicCollectionViewSelectionModel > will dispatch a "dataProviderChanging" event. This would give a selection > restoration bead the opportunity to store the current selection. Then upon > receiving the "dataProviderChanged" event, restore the selection. > > Unfortunately, the selection restoration bead still does not know when an > item will be added or removed. While the model can listen for a complete > replacement of the dataProvider and warning with a "dataProviderChanging" > event, then is no "itemAdding" or "itemRemoving" event prior to an item > being added or removed. To do this, we will need to having a new > collection view that extends ArrayList and dispatches those extra events. > Then the selection restoration bead can operate correctly. > > This is my current thinking. > > —peter > > > On 1/2/18, 4:43 PM, "Alex Harui" <aha...@adobe.com.INVALID> wrote: > > >And this one reason we have beads as a pattern. There is no one right way > >to preserve selection and selection should not always be preserved for > >certain kinds of data provider changes. So, create a bead that performs > >the selection preservation you need and give it a name that makes it clear > >what it does. Then others can create similar beads for other strategies. > > > >My 2 cents, > >-Alex > > > >On 1/2/18, 1:26 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> wrote: > > > >>Peter, > >> > >>You didn't misread, but my thoughts probably didn't far away into problem > >>resolution. That's why I was surprise why I haven't thought about > >>preserving selection. :) > >> > >>Thanks, Piotr > >> > >> > >>2018-01-02 22:10 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: > >> > >>> I thought because you mentioned that rollover and selection were messed > >>> up, that was the thing needing attention. I must have misread your > >>>email; > >>> I'll go back. > >>> > >>> In the meantime, I have a Button that inserts an item into the > >>> dataProvider. Before doing this I am: > >>> > >>> var oldSelection:Object = list.selectedItem; // or selectedIndex?? > >>> > >>> > >>> then update the dataProvider by inserting an item into it. For a List > >>>with > >>> the standard bead set, I have to: > >>> > >>> list.dataProvider = null; > >>> list.dataProvider = applicationModel.dataProvider; > >>> > >>> After that, I just restore the selection: list.dataProvider = > >>>oldSelection > >>> > >>> Need to figure out if the dataProvider will change, save the selection, > >>> allow the change, then restore it. > >>> > >>> —peter > >>> > >>> On 1/2/18, 3:58 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> > wrote: > >>> > >>> >How are you doing that preservation, by simply saving item somewhere > >>> >before > >>> >remove/add operation ? > >>> > > >>> >I'm not following the part where we you wanted some opinion. Actually > >>>in > >>> >case of refreshing I didn't even thing about saving selection, but > >>>it's > >>> >true that it should happen! It's surprises me that in my app I forgot > >>> >about > >>> >that. :) > >>> > > >>> >Thanks, Piotr > >>> > > >>> > > >>> >2018-01-02 21:44 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: > >>> > > >>> >> The first task is to determine if a list's selectedIndex or > >>>selectedItem > >>> >> should be preserved. > >>> >> > >>> >> For selectedIndex, adding or removing an item will get the same row > >>> >> selected until that row no longer exists. > >>> >> > >>> >> For selectedItem, adding or removing an item will keep the same item > >>> >> selected until that item no longer exists. For example, if the 4th > >>>item > >>> >>is > >>> >> "red" and you insert an item at position 2, "red" remains selected > >>>by > >>> >> shifts down a row. > >>> >> > >>> >> I can see this working both ways. > >>> >> > >>> >> In either case, first preserving the selection (index or item) > >>>before > >>> >>the > >>> >> add or remove and then restoring it works fine - I did this in > >>> >>application > >>> >> code, not in framework code. Works very nicely, as a matter of fact. > >>> >>Works > >>> >> for both traditional lists and dynamic lists with the new beads > >>>(yours, > >>> >> Piotr, or my new collection ones). Its *very simple* code. > >>> >> > >>> >> So once we decide which selection is preserved, we need to decide > >>>where > >>> >> that goes. Even though this code is just a couple of lines, in the > >>>PAYG > >>> >> world, not every app needs this so it must go into additional beads > >>> >>since > >>> >> it is added functionality. > >>> >> > >>> >> —peter > >>> >> > >>> >> > >>> >> > >>> >> > >>> >> > >>> >> On 1/2/18, 1:31 PM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> > >>>wrote: > >>> >> > >>> >> >Hi Peter, > >>> >> > > >>> >> >Welcome after vacation! I sense all ideas when I'm working with > >>>that > >>> >> >stuff. > >>> >> >I think you will see the issue with indexes, even if it's not the > >>>case > >>> >> >with > >>> >> >removing from the list. I will wait for your review with that index > >>> >> >refresh. > >>> >> > > >>> >> >Thank you so much! :) > >>> >> > > >>> >> > > >>> >> >2018-01-02 19:10 GMT+01:00 Peter Ent <p...@adobe.com.invalid>: > >>> >> > > >>> >> >> Hi, > >>> >> >> > >>> >> >> Catching up and building stuff. I'm going to repeat some things > >>>for > >>> >>the > >>> >> >> befit of anyone joining Royale for 2018 (and to refresh my own > >>> >>thoughts > >>> >> >> coming off of holiday!). > >>> >> >> > >>> >> >> The initial idea of List and related classes was their beads were > >>>to > >>> >>be > >>> >> >> almost static. You'd have data that you would use to create the > >>> >> >> dataProvider to the list and when set, would cause the > >>>itemRenderers > >>> >>to > >>> >> >>be > >>> >> >> deleted and replaced. Even something as simple as adding new data > >>>to > >>> >>the > >>> >> >> end of the dataProvider would require this reset: you'd have to > >>>clear > >>> >> >>the > >>> >> >> dataProvider (list.dataProver = null) and set it again or create > >>>a > >>> >> >> completely new dataProvider and set that to the list. > >>> >> >> > >>> >> >> The selected item and index should, in this case, be cleared. I'd > >>> >>have > >>> >> >>to > >>> >> >> run a test to see if that really happens as I don't remember. If > >>>you > >>> >> >>want > >>> >> >> to reset them back (assuming that index still existed) you would > >>> >>write a > >>> >> >> bead to do it. > >>> >> >> > >>> >> >> Now we are at the dynamic stage where we want to handle runtime > >>> >>updates > >>> >> >>to > >>> >> >> the dataProvider and create just new itemRenderers and insert > >>>them or > >>> >> >> remove itemRenderers when data is deleted from the dataProvider. > >>> >> >> > >>> >> >> Alex believes that the initial creation and insertions are the > >>>most > >>> >> >>common > >>> >> >> of the dynamic actions; removals being less common. As such in > >>>the > >>> >>PAYG > >>> >> >> world you would have a bead that handled a replacement of the > >>> >> >>dataProvider > >>> >> >> (which covers the initialization step) and a bead which handled > >>> >> >>additions > >>> >> >> and a bead to handle removals. There's a lot of duplication of > >>>code > >>> >>in > >>> >> >> these and under a non-PAYG system you'd just combine these into a > >>> >>single > >>> >> >> bead to do initialize, add, and removal. > >>> >> >> > >>> >> >> In the dynamic beads, the selection should be preserved. That > >>> >> >>information > >>> >> >> is stored in the model. The model doesn't do much else accept > >>>keep > >>> >>the > >>> >> >> data. The standard view bead would not know about these extra > >>>events > >>> >>so > >>> >> >> yes, we'd need another view bead to intercept those events and > >>> >>re-apply > >>> >> >>or > >>> >> >> adjust the selection. > >>> >> >> > >>> >> >> ‹peter > >>> >> >> > >>> >> >> On 12/30/17, 4:29 PM, "Piotr Zarzycki" > >>><piotrzarzyck...@gmail.com> > >>> >> >>wrote: > >>> >> >> > >>> >> >> >Peter, > >>> >> >> > > >>> >> >> >I have figure out what is wrong in case of List. I reported in > >>>the > >>> >> >> >previous > >>> >> >> >email that in the ListExample once you remove one item, > >>>something is > >>> >> >>wrong > >>> >> >> >with selection. Issue happened when you removing item in the > >>>middle > >>> >>of > >>> >> >> >collection. > >>> >> >> > > >>> >> >> >Let's say that you have 5 items and you are removing item with > >>> >>index = > >>> >> >>2. > >>> >> >> >Removing will work properly, but StringItemRenderer -> > >>> >> >> >DataItemRenderer -> UIItemRendererBase > >>> >> >> ><- has property "index" which is basically not being refreshed > >>>after > >>> >> >> >remove. In the result renderers has following indexes: > >>> >> >> > > >>> >> >> >0, > >>> >> >> >1, > >>> >> >> >3, > >>> >> >> >4 > >>> >> >> > > >>> >> >> >Which is messes up selection and roll over color changes. How > >>> >>actually > >>> >> >>fix > >>> >> >> >that ? My first thought was that ListView should listen for > >>> >> >>"layoutNeeded" > >>> >> >> >(we are dispatching that event after remove, add etc.) and > >>>refresh > >>> >> >>indexes > >>> >> >> >of all renderers. > >>> >> >> > > >>> >> >> >The second thought is that ListView should listen for remove > >>>event, > >>> >> >>where > >>> >> >> >we will have index of removed row, so we will be able loop > >>>through > >>> >> >>part of > >>> >> >> >the collection and refresh rest of the indexes. It is more > >>> >>efficient, > >>> >> >>but > >>> >> >> >maybe this is job for new type of View (bead) - ListRemoveView > >>>bead > >>> >>? > >>> >> >> > > >>> >> >> >Looking forward to your thought once you get back from Vacation. > >>>:) > >>> >> >> > > >>> >> >> >Thanks, Piotr > >>> >> >> > > >>> >> >> > > >>> >> >> > > >>> >> >> >2017-12-22 15:05 GMT+01:00 Piotr Zarzycki > >>> >><piotrzarzyck...@gmail.com>: > >>> >> >> > > >>> >> >> >> Hi Peter, > >>> >> >> >> > >>> >> >> >> I haven't checked your branch yet, but I just pushed couple of > >>> >> >>things to > >>> >> >> >> the develop which I needed for my examples. Here is the list > >>>of > >>> >>beads > >>> >> >> >>which > >>> >> >> >> we currently have and can be used for List. I think names are > >>>self > >>> >> >> >> explanatory. > >>> >> >> >> > >>> >> >> >> DynamicAddItemRendererForArrayListData > >>> >> >> >> > >>> >> >> >> DynamicUpdateItemRendererForArrayListData > >>> >> >> >> > >>> >> >> >> DynamicRemoveItemRendererForArrayListData > >>> >> >> >> > >>> >> >> >> DynamicRemoveAllItemRendererForArrayListData > >>> >> >> >> > >>> >> >> >> DynamicRemoveAllByNullItemRendererForArrayListData > >>> >> >> >> > >>> >> >> >> All beads above should be used once you set for your list: > >>> >> >> >>IDataProviderItemRendererMapper: > >>> >> >> >>ClassReference("org.apache.royale.html.beads. > >>> >> >> DataItemRendererFactoryForAr > >>> >> >> >>rayList") > >>> >> >> >> > >>> >> >> >> We have also DynamicItemsRendererFactoryForArrayListData - > >>>which > >>> >>is > >>> >> >> >>doing actually two things. Create all items once someone set > >>> >> >> >>dataProvider (the same logic as in > >>> >> >>DataItemRendererFactoryForArrayList) > >>> >> >> >>AND handle adding to > >>> >> >> >> > >>> >> >> >> ArrayList (the same logic as in > >>> >> >>DynamicAddItemRendererForArrayListData) > >>> >> >> >>- It duplicates logic from those both beads. > >>> >> >> >> > >>> >> >> >> > >>> >> >> >> Two Scenarios with > >>>DynamicItemsRendererFactoryForArrayListData: > >>> >> >> >> > >>> >> >> >> 1) If we use DynamicItemsRendererFactoryForArrayListData > >>>simply > >>> in > >>> >> >>the > >>> >> >> >>List as it is in our ListExample [1] we don't have to remember > >>>to > >>> >> >>setup: > >>> >> >> >> > >>> >> >> >> IDataProviderItemRendererMapper: > >>> >> >> >>ClassReference("org.apache.royale.html.beads. > >>> >> >> DataItemRendererFactoryForAr > >>> >> >> >>rayList"). > >>> >> >> >> > >>> >> >> >> However in that scenario we will have in List totally useless > >>>bead > >>> >> >> >>DataItemRendererFactoryForArray which is being added default > to > >>> the > >>> >> >> List. > >>> >> >> >> > >>> >> >> >> 2) If we use DynamicItemsRendererFactoryForArrayListData and > >>>we > >>> >>add > >>> >> >>in > >>> >> >> >>CSS IDataProviderItemRendererMapper: > >>> >> >> >>ClassReference("org.apache.royale.html.beads. > >>> >> >> DataItemRendererFactoryForAr > >>> >> >> >>rayList") > >>> >> >> >> > >>> >> >> >> I'm not sure what can happen actually, cause both beads are > >>>using > >>> >>the > >>> >> >> >>same logic to create item renderers. Can be situation when one > >>> >>bead is > >>> >> >> >>create renderers and second one re do this work again ? :) > >>> >> >> >> > >>> >> >> >> > >>> >> >> >> Thanks, Piotr > >>> >> >> >> > >>> >> >> >> > >>> >> >> >> > >>> >> >> >> [1] > >>> >> >> >>https://na01.safelinks.protection.outlook.com/?url= > >>> >> >> https%3A%2F%2Fgithub.c > >>> >> >> >>om%2Fapache%2Froyale-asjs%2Fblob% > 2F24b09c787fc1da2d0a19895a2b2d > >>> >> >> 4a440e26c5 > >>> >> >> >>97%2Fexamples%2Froyale%2FListExample%2Fsrc%2Fmain% > >>> >> >> 2Froyale%2FMyInitialVie > >>> >> >> >>w.mxml%23L69&data=02%7C01%7Cpent%40adobe.com% > >>> >> >> 7C94d879f8f6054e10c75508d54f > >>> >> >> >>cc6fe8%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% > >>> >> >> 7C636502661827506659&sd > >>> >> >> >>ata=W4Ih5Q0IGhGNvOX9jrmn580Qw4ljo%2BavjqABV4%2BJr%2Bc%3D& > >>> reserved=0 > >>> >> >> >> > >>> >> >> >> > >>> >> >> >> > >>> >> >> >> 2017-12-19 20:35 GMT+01:00 Olaf Krueger > >>><m...@olafkrueger.net>: > >>> >> >> >> > >>> >> >> >>> Peter, great to read something about these "Collections" and > >>> >> >> >>>"Hierarchical > >>> >> >> >>> data" stuff here! > >>> >> >> >>> Thanks for working on this, have a nice time and enjoy your > >>> >>break! > >>> >> >> >>> > >>> >> >> >>> Olaf > >>> >> >> >>> > >>> >> >> >>> > >>> >> >> >>> > >>> >> >> >>> -- > >>> >> >> >>> Sent from: > >>> >> >> >>>https://na01.safelinks.protection.outlook.com/?url= > >>> >> >> http%3A%2F%2Fapache-r > >>> >> >> >>>oyale-development.20373.n8.nabble.com%2F&data=02%7C01%7Cpent% > >>> >> >> 40adobe.com > >>> >> >> >>>%7C94d879f8f6054e10c75508d54fcc6fe8% > >>> 7Cfa7b1b5a7b34438794aed2c178de > >>> >> >> cee1%7 > >>> >> >> > >>>>>>C0%7C0%7C636502661827506659&sdata=Zb1nVaD5dUx1Y89Q1jj4LxqBhtlxoZ > >>> >> >> FlwDFJAq > >>> >> >> >>>ruTsY%3D&reserved=0 > >>> >> >> >>> > >>> >> >> >> > >>> >> >> >> > >>> >> >> >> > >>> >> >> >> -- > >>> >> >> >> > >>> >> >> >> Piotr Zarzycki > >>> >> >> >> > >>> >> >> >> Patreon: > >>> >> >> >>*https://na01.safelinks.protection.outlook.com/?url= > >>> >> >> https%3A%2F%2Fwww.pat > >>> >> >> >>reon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com > >>> >> >> %7C94d879f8f6054e > >>> >> >> >>10c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de > >>> >> >> cee1%7C0%7C0%7C636502661 > >>> >> >> >>827506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg > >>> >> >> FXtA%3D&reserv > >>> >> >> >>ed=0 > >>> >> >> >> > >>> >> >> >><https://na01.safelinks.protection.outlook.com/?url= > >>> >> >> https%3A%2F%2Fwww.pat > >>> >> >> >>reon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com > >>> >> >> %7C94d879f8f6054e > >>> >> >> >>10c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de > >>> >> >> cee1%7C0%7C0%7C636502661 > >>> >> >> >>827506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg > >>> >> >> FXtA%3D&reserv > >>> >> >> >>ed=0>* > >>> >> >> >> > >>> >> >> > > >>> >> >> > > >>> >> >> > > >>> >> >> >-- > >>> >> >> > > >>> >> >> >Piotr Zarzycki > >>> >> >> > > >>> >> >> >Patreon: > >>> >> >> >*https://na01.safelinks.protection.outlook.com/?url= > >>> >> >> https%3A%2F%2Fwww.patr > >>> >> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >>> >> >> 7C94d879f8f6054e10 > >>> >> >> >c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de > >>> >> >> cee1%7C0%7C0%7C636502661827 > >>> >> >> >506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg > >>> >> >> FXtA%3D&reserved=0 > >>> >> >> ><https://na01.safelinks.protection.outlook.com/?url= > >>> >> >> https%3A%2F%2Fwww.patr > >>> >> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >>> >> >> 7C94d879f8f6054e10 > >>> >> >> >c75508d54fcc6fe8%7Cfa7b1b5a7b34438794aed2c178de > >>> >> >> cee1%7C0%7C0%7C636502661827 > >>> >> >> >506659&sdata=sjS%2Fmydo1M%2FGkkREJsc5CRyA1uFXRUK76zEHFeg > >>> >> >> FXtA%3D&reserved=0 > >>> >> >> >>* > >>> >> >> > >>> >> >> > >>> >> > > >>> >> > > >>> >> >-- > >>> >> > > >>> >> >Piotr Zarzycki > >>> >> > > >>> >> >Patreon: > >>> >> >*https://na01.safelinks.protection.outlook.com/?url= > >>> >> https%3A%2F%2Fwww.patr > >>> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >>> >> 7C96bb80bb6fef4b94 > >>> >> >089008d5520f1a9f%7Cfa7b1b5a7b34438794aed2c178de > >>> >> cee1%7C0%7C0%7C636505147194 > >>> >> > >>> >>>474371&sdata=D3%2FGi2wtNJLEO716RK18TbD1VMFdB3V > >>> Kv3Br5KkZfFI%3D&reserved=0 > >>> >> ><https://na01.safelinks.protection.outlook.com/?url= > >>> >> https%3A%2F%2Fwww.patr > >>> >> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >>> >> 7C96bb80bb6fef4b94 > >>> >> >089008d5520f1a9f%7Cfa7b1b5a7b34438794aed2c178de > >>> >> cee1%7C0%7C0%7C636505147194 > >>> >> >474371&sdata=D3%2FGi2wtNJLEO716RK18TbD1VMFdB3V > >>> >> Kv3Br5KkZfFI%3D&reserved=0>* > >>> >> > >>> >> > >>> > > >>> > > >>> >-- > >>> > > >>> >Piotr Zarzycki > >>> > > >>> >Patreon: > >>> >*https://na01.safelinks.protection.outlook.com/?url= > >>> https%3A%2F%2Fwww.patr > >>> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >>> 7C61ec983f6a9747bd > >>> >cd7d08d552239493%7Cfa7b1b5a7b34438794aed2c178de > >>> cee1%7C0%7C0%7C636505235128 > >>> >887083&sdata=Y%2BHjYn%2BGj%2Bhb0VVVy7fSW%2BGEvQo2% > >>> 2FUjH2EhucTbxR8Q%3D&rese > >>> >rved=0 > >>> ><https://na01.safelinks.protection.outlook.com/?url= > >>> https%3A%2F%2Fwww.patr > >>> >eon.com%2Fpiotrzarzycki&data=02%7C01%7Cpent%40adobe.com% > >>> 7C61ec983f6a9747bd > >>> >cd7d08d552239493%7Cfa7b1b5a7b34438794aed2c178de > >>> cee1%7C0%7C0%7C636505235128 > >>> >887083&sdata=Y%2BHjYn%2BGj%2Bhb0VVVy7fSW%2BGEvQo2% > >>> 2FUjH2EhucTbxR8Q%3D&rese > >>> >rved=0>* > >>> > >>> > >> > >> > >>-- > >> > >>Piotr Zarzycki > >> > >>Patreon: > >>*https://na01.safelinks.protection.outlook.com/?url= > https%3A%2F%2Fwww.pat > >>r > >>eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com > %7C4ed02057c74e4 > >>5 > >>0da30908d552277e71%7Cfa7b1b5a7b34438794aed2c178de > cee1%7C0%7C0%7C636505251 > >>9 > >>40120787&sdata=aJzPBX5fyLQVXr21gO9aLOIIQhVMgf3QaT4qEcsnWE4%3D&reserved=0 > >><https://na01.safelinks.protection.outlook.com/?url= > https%3A%2F%2Fwww.pat > >>r > >>eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com > %7C4ed02057c74e4 > >>5 > >>0da30908d552277e71%7Cfa7b1b5a7b34438794aed2c178de > cee1%7C0%7C0%7C636505251 > >>9 > >>40120787&sdata=aJzPBX5fyLQVXr21gO9aLOIIQhVMgf > 3QaT4qEcsnWE4%3D&reserved=0> > >>* > > > > -- Piotr Zarzycki Patreon: *https://www.patreon.com/piotrzarzycki <https://www.patreon.com/piotrzarzycki>*