[Laszlo-user] [Laszlo-dev] How should states _really_ work?
David Temkin
temkin at laszlosystems.com
Thu Feb 21 08:16:34 PST 2008
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-user/attachments/20080221/14f787c0/attachment.html
More information about the Laszlo-user
mailing list