[Laszlo-user] [Laszlo-dev] How should states _really_ work?
David Temkin
temkin at laszlosystems.com
Thu Feb 21 10:02:40 PST 2008
Wouldn't this work on a dynamic class as opposed to a sealed class?
Not good if this can't be made to work at all.
On Feb 21, 2008, at 8:45 AM, Henry Minsky wrote:
> Going forward, we cannot really be messing with methods in the same
> dynamic way we have been up to this point,
> because we're not free to define or delete them at runtime in swf9,
> nor many other runtimes we might want to
> target.
>
> We should assume that methods are things that only can be defined at
> compile time, and cannot be deleted.
> If you define a method inside a state, that will have to be
> equivalent to defining it outside of the state.
>
> I suppose if we were masochistic we could make the compiler merge
> methods at compile time with some kind
> of dispatch flag to say which method body code to run depending on
> if a state is applied, but that doesn't
> seem maintainable to me.
>
>
>
>
>
>
> On Thu, Feb 21, 2008 at 11:16 AM, David Temkin <temkin at laszlosystems.com
> > 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?
>>
>
>
>
>
> --
> Henry Minsky
> Software Architect
> hminsky at laszlosystems.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.openlaszlo.org/pipermail/laszlo-user/attachments/20080221/96789e6d/attachment-0001.html
More information about the Laszlo-user
mailing list