[Laszlo-dev] How should states _really_ work?

Sarah Allen sallen at laszlosystems.com
Thu Feb 21 08:30:04 PST 2008


Those docs don't make it clear what happens when there is a collision, 
and then what happens when the state is removed.  Under discussion is 
the behavior when an attribute is defined in the state AND in the parent 
of the state -- in this case, states currently may have a "side effect," 
as I discussed in my note. If states never had side effects, when you 
removed a dragstate then the window or whatever would zap immediately 
back to where it came from.  The application of a state should never 
affect anything that is not defined within the state.

Sarah

David Temkin wrote:
> The docs say:
>
>> Everything within a |<state>| tag acts as if it were written inside 
>> the parent when the state is applied. States can contain attributes, 
>> methods, and other nodes.
>
> This is a clean conceptual model, IMHO. No exceptions.
>
> I would expect elements within the state to be added/removed when the 
> state is applied/removed. I would not expect elements that are not 
> specified within in the state (e.g., other attributes, other methods, 
> other views) to be affected by apply/remove of the state. (That's what 
> enables what Sarah calls "side effects" below).
>
> I *am* surprised that methods added when a state is applied aren't 
> removed when the state is removed -- if that is in fact what Sarah is 
> saying below. That sounds like a bug. 
>
> Regarding the proximate issue mentioned by Tucker: Sounds like a bug 
> in the SWF debugger, and not a general problem with dragstate. 
>
>
>
>
>
> On Feb 21, 2008, at 7:21 AM, Sarah Allen wrote:
>
>> Interesting question! cc'ing Laszlo-user list, since LZX coders on 
>> there might have some thoughts on this, or at least be interested in 
>> the details of how states  work and whether that should be changed in 
>> the future.  I did a little experimentation (see below) to remind 
>> myself how states work, and recall a little history of how we got to 
>> where we are.  I do like the current behavior (the convenience of 
>> implementing dragstate and friends), but I do admit that some of the 
>> nuances of states can be confusing and I don't know if they are 
>> clearly documented.
>>
>> The question is: should contraints that are overridden when a state 
>> is applies be "put back" when a state is removed?
>>
>> Conceptually when you apply a state, a bunch of stuff is added, and 
>> when you remove it that stuff is removed; however, states are allowed 
>> to have side effects, when attributes are modified by a state they 
>> stay modified.  So, attributes and methods when applied remain as 
>> side effects; however, views and events are temporal and get removed. 
>>  Way back in LPS v1, Adam Wolff and I decided that constraints are 
>> conceptually like attribute values, even if their implementation is 
>> more like an event; which is why we have the behavior we do today.
>>
>> In an abstract sense, it feels like a bug that when a state is 
>> removed, you don't just put everything back the way it was.  If you 
>> look at this simple example, that might be your expectation:
>> <canvas>
>> <checkbox id="cbox"  text="Show"
>>           x="10" y="10" />
>> <state apply="${cbox.value}">
>>    <view bgcolor="blue" x="5" y="30"
>>         width="150" height="150" />
>> </state>
>> </canvas>
>>
>> However, it is a powerful feature of states that you are allowed to 
>> leave a side-effect behind (which is really what enables the 
>> simplicity of dragstate and related coding patterns.)  If you change 
>> the value of an attribute, it stays that way.  In the following 
>> example, after clicking on the checkbox twice to turn it on and off 
>> again, the value of the attribute "t" is 10, not it's original value "4"
>>
>> <canvas>
>> <simplelayout/>
>> <attribute name="t" value="4"/>
>> <text text="${canvas.t}"/>
>> <checkbox id="cbox"  text="Show"
>>           x="10" y="10" />
>> <state apply="${cbox.value}">
>>    <attribute name="t" value="10"/>
>>    <view bgcolor="blue" x="5" y="30"
>>         width="150" height="150" />
>> </state>
>> </canvas>
>>
>> Now, I wonder what happens with a method.  In the example below, you 
>> will see that if I toggle the checkbox on and back off, the state's 
>> method remains, just like an attribute.
>>
>> <canvas debug="true">
>> <simplelayout/>
>> <attribute name="t" value="4"/>
>> <text text="${canvas.t}"/>
>> <checkbox id="cbox"  text="Show"
>>           x="10" y="10" />
>> <state apply="${cbox.value}">
>>    <attribute name="t" value="10"/>
>>    <view bgcolor="blue" x="5" y="30"
>>         width="150" height="150" />
>>      <method name="doSomething">
>>         Debug.write('new');
>>     </method>
>> </state>
>>
>> <button onclick="canvas.doSomething()">doSomething</button>
>> <method name="doSomething">
>>   Debug.write('orginal');
>> </method>
>> </canvas>
>>
>> Events, get added and removed like views.  In the example below, you 
>> end up with two events when the state is applied, then just the 
>> original event when the state is removed.
>>
>> <canvas debug="true">
>> <simplelayout/>
>> <attribute name="t" value="4"/>
>> <text text="${canvas.t}"/>
>> <checkbox id="cbox"  text="Show"
>>           x="10" y="10" />
>> <state apply="${cbox.value}">
>>    <attribute name="t" value="10"/>
>>    <view bgcolor="blue" x="5" y="30"
>>         width="150" height="150" />
>>      <handler name="onmousedown" reference="LzGlobalMouse">
>>         Debug.write('new');
>>     </handler>
>> </state>
>>
>> <button onclick="canvas.doSomething()">doSomething</button>
>> <handler name="onmousedown" reference="LzGlobalMouse">
>>         Debug.write('original');
>> </handler>
>> </canvas>
>>
>>
>> P T Withington wrote:
>>> As part of fixing LPP-631 in r8032, states now remove constraints 
>>> that they override when applied, and they _restore_ those 
>>> constraints when removed.  This breaks dragging and resizing of the 
>>> swf debugger window!
>>>
>>> The swf debugger starts out with its dimensions defaulted to a 
>>> percentage of the canvas.  Percentage values are constraints.  This 
>>> is nifty, because if you resize your browser window, the debugger 
>>> window nicely resizes too.
>>>
>>> But if you try to drag or resize the window, the drag or resize 
>>> state gets applied, the window tracks the mouse, but when you let go 
>>> of the mouse, the state gets removed and the previous percentage 
>>> constraints are reinstalled, snapping the window back to its 
>>> starting position.
>>>
>>> My question:  Is this a bug in states?  Should they _not_ restore 
>>> constraints they removed?  Is this a bug in drag/resize states? 
>>>  Should they be overriding the base state behavior of restoring 
>>> constraints?  Or, is this just a bug in the swf debugger?  Should it 
>>> only size to the canvas initially and not respond to canvas changes? 
>>>  Or should it be improved to track the canvas until it is resized or 
>>> dragged?
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.openlaszlo.org/pipermail/laszlo-dev/attachments/20080221/3b083e9f/attachment.html


More information about the Laszlo-dev mailing list