Hi Cosma, Thanks for presenting this possible approach.
-Alex On 6/3/13 12:45 AM, "Cosma Colanicchia" <cosma...@gmail.com> wrote: >Just trying to throw a quick thinking at it, in particular about the MXML >declaration mess - to avoid cartesian multiplication of states, couldn't >we >just normalize them? I mean, grouping them in mutually exclusive groups, >which is the typical scenario: > ><s:states> > <s:ExclusiveStateGruop> > <s:State name="up"/> > <s:State name="down"/> > <s:State name="over"/> > </s:ExclusiveStateGruop> > <s:ExclusiveStateGruop> > <s:State name="nonFocused"/> > <s:State name="focused"/> > </s:ExclusiveStateGruop> > <s:ExclusiveStateGruop> > <s:State name="nonDefault"/> > <s:State name="default"/> > </s:ExclusiveStateGruop> ></s:states> > >This is different from the current freely assignable state groups, in that >they define the mixing rules of the various base states - thus we >implicitly expressed all the possible (and valid) combinations of the >various base state (in this case, 3*2*2 = 12 possible valid states), >instead of manually declaring a lot of states with long and unreadable >names (like "overAndFocusedAndDefault"). > > >The API should let specify multiple current states, as long as two >mutually >exclusive state are not specified, for example with a sintax like this: > >myComp.currentState = "up-focused-nonDefault" // VALID >myComp.currentState = "up-down-nonDefault" // INVALID > >(to avoid confusion with current syntax, I think we should pick another >separator different from "," to express these "state trails") We may also >agree that the first state declared of each exclusive group is the default >value of its group, so that we can write: > >myComp.currentState = "up" // same as "up-nonFocused-nonDefault" > > >Then, current state groups and MXML syntax would kick in, it should just >recognize the state trails: > ><s:Rect includeIn="focused" alpha="0.5" alpha.default="0.7"> >... ><s:Rect includeIn="focused-nonDefault"> > > >Or, we could also supports additional MXML like: > ><s:Rect alpha.up="0" alpha.over="0.5" alpha.over-focused="1.0"> ... > >In which more specific value assignment should win over more generic ones >(something like that is already implemented, when you write alpha="0" >alpha.over="1"). > > >Finally, from a compatibility point of view, a component using an >"old-style" states set could be just translated to a single mutually >exclusive state group (in fact, it is one) - the compiler should just >prevent mixing the two approaches. > > > >2013/6/3 Alex Harui <aha...@adobe.com> > >> Hi Max, >> >> Thanks for detailing it out. >> >> In the relatively few minutes I've spent thinking about the problem, I >> pondered whether the answer is to expand on how s:State is used, or >>simply >> allow you to have conditional attributes based on things other than >> States. IMO, along with this set of States is code you have to write to >> set currentState appropriately, and in many cases, it seems like you're >> just going to wire it to some other property. For this Button example, >>we >> don't really have a "isFocused" property, but we certainly could add >>one, >> and the "Default" states are all tied to what is currently called the >> 'emphasized' property. So why not some syntax that just lets you set a >> property based on some other property? For sure there can be >>collisions, >> or maybe it won't handle complex situations, but it seems like when I >>look >> at the AS that we write when we give up on States, they are generally >> simple expressions. So, while property.state implies the value of that >> property when currentState is that State, maybe some other delimiter >> besides '.' can be used to dictate the value of a property when some >>other >> property is true or false or some simple expression. I'm going to use >>"(" >> in this example, which may not be legal XML, but should give you an >>idea) >> >> Then the states are simply: >> >> <s:states> >> <s:State name="up"/> >> <s:State name="down"/> >> <s:State name="over"/> >> </s:states> >> >> And some widgets in the skin look like: >> >> >> <s:Rect id="focusBorder" includeIn(isFocused)="" >> left(emphasized)=-2 left=-1 /> >> <s:Rect id="background" color.up="..." color.down="..." >> color(currentState=="up"&&emphasized) >> >> Now, when I look at that, I wonder: why not just use binding? >> >> <s:Rect id="focusBorder" includeIn="{isFocused}" >> left="{emphasized ? -1 : -2}" /> >> <s:Rect id="background" color.up="..." color.down="..." >> color="{(currentState=="up"&&emphasized) ? "red" : "blue"}" >> >> Yes, I know we told you not to use binding in skins for performance >> reasons, but I am hoping to find ways to make databinding much faster in >> FlexJS. >> >> >> >> And one final thought: In FlexJS, we may end up saying that you >>shouldn't >> specify these visual aspects in the "skin". Instead, you might want to >> use more CSS, and then we could implement attribute selectors on the AS >> side since that CSS is going to work on the JS side. >> >> Then you just have: >> >> <s:Rect id="focusBorder" className="buttonFocusBorder" >> <s:Rect id="background" className="buttonBackground" >> >> >> And CSS like: >> >> .buttonFocusBorder#focusBorder[emphasized] { >> left: -2; >> } >> .buttonFocusBorder#focusBorder { >> left: -1; >> } >> >> .buttonBackground#background[emphasize] { >> color: "blue"; >> } >> >> .buttonBackground#background { >> color: "red"; >> } >> >> I'm not sure we can extend the set of attributes or not, but we can also >> specify multiple class selector names, so we might be able to handle >> custom properties that way. >> >> >> -Alex >> >> On 6/2/13 10:45 AM, "Maxime Cowez" <maxime.co...@gmail.com> wrote: >> >> >I'd like to make this more concrete. Let's take Alex' Button example >>and >> >compare the 'stateGroups' way to the 'multidimensional states' way. >> >Here's what that Button's States might look like with 'stateGroups'. >> > >> > <s:states> >> > <s:State name="up" stateGroups="upStates,normal"/> >> > <s:State name="down" stateGroups="downStates,normal"/> >> > <s:State name="over" stateGroups="overStates,normal"/> >> > <s:State name="upAndDefault" stateGroups="upStates,default"/> >> > <s:State name="downAndDefault" >>stateGroups="downStates,default"/> >> > <s:State name="overAndDefault" >>stateGroups="overStates,default"/> >> > <s:State name="upAndFocused" stateGroups="upStates,focused"/> >> > <s:State name="downAndFocused" >>stateGroups="downStates,focused"/> >> > <s:State name="overAndFocused" >>stateGroups="overStates,focused"/> >> > <s:State name="upAndDefaultAndFocused" >> >stateGroups="upStates,default,focused"/> >> > <s:State name="downAndDefaultAndFocused" >> >stateGroups="downStates,default,focused"/> >> > <s:State name="overAndDefaultAndFocused" >> >stateGroups="overStates,default,focused"/> >> > </s:states> >> > >> >The states declaration looks heavy and is rather hard to decipher: -1 >> > >> >The actual component would look something like: >> > >> > <s:Rect id="focusBorder" includeIn="focused"/> >> > <s:Rect id="background" color.upStates="..." color.downStates="..." >> >color.overStates="..."/> >> > >> >Easy to read, easy to use: +1 (I know Rect doesn't have a color >>attribute, >> >but you get what I mean). >> >But I haven't been entirely fair: what if I want a different background >> >color scheme for the default states? I can't do: >> > >> > <s:Rect id="background" color.upStates="..." color.downStates="..." >> >color.overStates="..." >> > color.upAndDefault="..." >> >color.downAndDefault="..." color.overAndDefault="..."/> >> > >> >That will throw a compiler exception (because 'upAndDefault' is part of >> >'upStates' group and thus I have a duplicate color declaration). I can >>fix >> >this, but it would require even more stateGroups, e.g. normalUpStates, >> >defaultUpstates, normalDownStates, etc.: -1 >> >Or I could declare a color for every single base state, but that would >>be >> >extremely verbose and have duplicate declarations of the same color. >> > >> >Conclusion: anything can be done, but it can become overly complex. >> > >> > >> >Here's what the same Button's States would look like with >> >'multidimensional >> >states': >> > >> > <s:states> >> > <s:State name="up"/> >> > <s:State name="down"/> >> > <s:State name="over"/> >> > <s:State name="focused"/> >> > <s:State name="default"/> >> > </s:states> >> > >> >Well that's extremely terse and clear: +2 >> > >> >The actual component would look something like: >> > >> > <s:Rect id="focusBorder" includeIn="focused"/> >> > <s:Rect id="background" color.up="..." color.down="..." >> >color.over="..."/> >> > >> >I'm assuming a pressed default button that has focus would have its >> >`currenState` set to ["default", "focused", "down"]. >> >That's still better than the 'stateGroups' way: +1 >> > >> >But let's see what happens with the dual color scheme. Well it can't be >> >done: -100 >> >Unless we come up with something like this: >> > >> > <s:Rect id="background" color.up="..." color.down="..." >> >color.over="..." >> > color.up.default="..." >> >color.down.default="..." >> >color.over.default="..."/> >> > >> >The more precise the state selector, the more precedence it takes. >>Doesn't >> >look half bad. If it can be done technically, that is. >> >A possible downside is that you can create situations where the >>developer >> >doesn't provide a 'required' state. For instance with this Button >>example, >> >if neither 'up', 'down' or 'over' are present in the 'currentState', >>the >> >'background' would have no color. This can be remedied, but takes >>careful >> >coding. >> > >> >Conclusion: with a new syntax this approach sure looks cleaner. >> > >> >I've been writing this as I was thinking about the subject, so I hope >>you >> >can make heads and tails of it ;) >> > >> >Max >> > >> > >> >On Sun, Jun 2, 2013 at 1:54 PM, Arnoud Bos >> ><arn...@artim-interactive.nl>wrote: >> > >> >> >> >> Hi, >> >> >> >> I figure you can use some input from the community for this. I >> >>personally >> >> never use stategroups as i find them a bit confusing. >> >> So I tend to structure my components the way that it's not needed and >> >>use >> >> the normal straightforward states. >> >> >> >> IMHO states are one of the key features of Flex, stateGroups we can >>live >> >> without. >> >> >> >> just my 2 cents, >> >> >> >> Arnoud >> >> >> >> On 02-06-2013, at 08:49, Alex Harui <aha...@adobe.com> wrote: >> >> >> >> >> I've been coming across more and more cases where it would be >>great >> >>to >> >> >> have >> >> >> support for multidimensional states. What this looks like and how >> >>it's >> >> >> used >> >> >> I'm not sure. Maybe we can discuss ideas. >> >> > Yes, let's discuss. I'm actually finishing up getting simple >>states >> >>to >> >> > work in FlexJS. I haven't started work on StateGroup because I >>wasn't >> >> sure >> >> > how often they are used and whether they are considered the "right" >> >> > solution by folks. >> >> > >> >> >> >> Met vriendelijke groet, >> >> >> >> Arnoud Bos >> >> Artim interactive >> >> >> >> E arn...@artim-interactive.nl >> >> W www.artim-interactive.nl >> >> T +31 6 246 40 216 >> >> A Elisabeth Wolffstraat 77-3 >> >> 1053TT Amsterdam >> >> >> >> >> >> >> >> >> >> >> >> >> >>