Hi Charley,

On 07/11/2010, at 5:45 AM, ext Charley Bay wrote:

> Using QML/Javascript, quite a few options exist to *either* be declarative 
> (e.g., "myAnimation.paused = true") or imperative (e.g., 
> "myAnimation.pause();")
> 
> IMHO, when possible, one should be declarative (long discussion for a 
> different thread).  However, we all probably agree that we *sometimes* must 
> do both.  I'm now scratching-my-head a little to understand how to handle 
> this marriage as it relates to order-of-operations.
> 
> For example, I'm writing a "MyLayout" element that contains "MyBucket" for 
> transient children:
> 
> //MyBucket.qml
> Item {
>   onChildrenChanged: {
>      // ...do stuff with children, including set properties
>   }
> };
> 
> //MyLayout.qml
> Item {
>   id: myLayout
> 
>   MyBucket {
>     id: myBucket
>   }
> 
>   onChildrenChanged: {
>     // Push "transient" children to our bucket.
>     var i = myLayout.children.length;
>     while(i--) {
>       if( ...<test-if-"myLayout.children[i]"-is-transient-child>...) {
>         myLayout.children[i].parent = myBucket;
>       }
>     }     
>   }
> };
> 
> The above works fine.  HOWEVER, there is TONS of "supporting" code that both 
> declarative and imperative that triggers "behind-the-scenes" (for example, 
> Javascript functions get called when properties like "parent" changed, and 
> similarly Javascript handlers get triggered when "children" change.)
> 
> I've been using "console.log()" to trace what's going on, but it's triggered 
> some questions:
> 
> (1) Does console.log("My message") *guarantee* the displayed order is the 
> order the calls are made?  (I assume "yes" -- this is very important).

Yes, it should.

> (2) Does console.log() "flush" after each message, or is there an option to 
> trigger flushing?  (Would be nice to have an option, but I can live without 
> it.)

Internally console.log() just calls  qDebug("%s",msg.constData()), which I 
believe should flush.

> (3) I'm getting some seriously weird order-of-operations that may possibly 
> force me to re-think my design.  However, since we are "declarative", by 
> definition I suppose there's no such thing as a "weird" order of operation.  
> Is there any "general guidance" on understanding order-of-operations within 
> the QML engine?  (For example, I'd *assume* a general preference would be 
> made to perform "Declarative First!", but I concede that it's probably often 
> quite indeterminate.)
> 
> In short, I have bound properties that are changing, that are reflected in 
> other bound properties.  Then, these bound properties are "used" in 
> imperative code (e.g., computing placement for items).  In my particular 
> case, the "layout" logic is being executed *before* the bound properties are 
> updated (so the layout incorrectly reflects the "old" values before the 
> properties are updated).  (The properties correctly get updated later.)
> 
> Of course, I have *tons* of design options, including manually forcing 
> updates, setting up hooks like "onLoadCompleted()", etc.
> 
> However, I'm now wondering if I'm thinking about the problem wrong, and I'm 
> interested in opinions:  How do you balance declarative and imperative?  For 
> example, if you have a problem where much of it *must* be imperative, my 
> current assumption is that it is *?best practice?* if you do one of the 
> following:
> 
> (a) When significant portions of your implementation must be imperative, you 
> should consider implementing (as much logic as possible) that couples to that 
> imperative implementation as *also* imperative (so order-of-operations is 
> deterministic).
> 
> (b) When significant portions of your implementation must be imperative, you 
> should consider *forcing* that to a single "clean execution point" that is 
> fired ONLY at discrete times where you can "trust" the property inputs (e.g., 
> onLoadCompleted(), at specific well-understood call points) (so you have no 
> coupling to "unknown/stale" property values).
> 
> My problem is that until I do either of the two, I think I can't trust my 
> properties from within my imperative calls.  This is an interesting design 
> challenge which is new to me.

This reminds me a bit of http://bugreports.qt.nokia.com/browse/QTBUG-11712 -- 
do you think this may be related to what you are seeing? Do you have any small 
examples of strange out-of-order behaviors you could share (I'd like to 
understand the problem better)?

Regards,
Michael


_______________________________________________
Qt-qml mailing list
Qt-qml@trolltech.com
http://lists.trolltech.com/mailman/listinfo/qt-qml

Reply via email to