The docs now say:

When a state is removed, any children or constraints created when the state was applied are then removed, but attributes that were set by the application of the state are not restored.

It sounds like this isn't quite right. Are event handlers also restored to their previous value when the state is removed? And then it says that constraints are removed, which does not seem to be consistent with current behavior. If "children" means "child views" then methods are excluded.

We should be explicit about which elements of the <state> are applied, and which are removed or restored.

"Side effects" -- other attributes that have been changed by running application code, in the view that contains the state, or elsewhere -- are not part of the picture.

I am unclear on what this means specifically: "It is an error for the state to specify any other properties of the attribute that would conflict with the parent." Tucker?

- D.




On Feb 21, 2008, at 9:54 AM, P T Withington wrote:

Executive summary:  I propose amending the documentation as follows:

"When a state contains an attribute with the same name as in the parent node, the attribute will take on the value specified in the state when the state is applied. It is an error for the state to specify any other properties of the attribute that would conflict with the parent. When the state is removed, the value of the attribute will remain the value at the time the state is removed."

---

Gory details: if the parent value was a constraint, it will be removed when the state is applied and replaced with the state value. If the state value is a constraint, it will be removed when the state is removed.

If we need to support this feature for _method_ attributes going forward, we'll have some work to do. Does anyone feel this is necessary?

Note that (for better or worse) _handler_ attributes do not collide in this way, since it is perfectly legal to have many handlers with the same `name` -- the name in a handler attribute is the event that it handles, not the name of the handler.

More comments interspersed below...

On 2008-02-21, at 11:16 EST, 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.

The docs are silent on what happens when the state is removed?

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).

The question at hand is: what if the parent _and_ the state specify the same element? If you take your doc quote literally, this would be an error. You are not allowed to declare the same attribute twice. But everyone relies on this being permitted, usually to apply a constraint to an attribute with a state.

The bug I just fixed was if you had a constraint in the parent and applied a fixed value in the state. The state has to remove the parent constraint when applied or you don't get what you want.

I thought it would also be more correct to put those removed constraints back when the state is removed, but that breaks dragstate and resizestate (not just in the debugger -- Amazon broke too. There are probably others. So I am taking the re-applying of removed constraints back out).

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.

Her example is another case of the attribute (in this case a method attribute) being defined in both the parent and the state. When the state is applied, the method attribute gets a new 'value' (the method implementation), and when the state is removed, that new value sticks. You don't get two methods with the same name. If the method had a different name than any parent method, it would be added and removed. But ans Henry points out, adding and removing methods is problematic for JS2 runtimes.

Regarding the proximate issue mentioned by Tucker: Sounds like a bug in the SWF debugger, and not a general problem with dragstate.

Nope. Many things break if I restore constraints that were removed by the state.

The comment on LzState#remove says:

/**
* Removes the constraints and views made when the state was applied. This * method does not currently restore the previous values of any attributes that
 * were changed by the state
 */

'does not currently' made me think that was a shortcoming, but it appears it is a feature instead!


Reply via email to