Oops... some bad copy - paste... But the problem is still there.
var tree = new qx.ui.tree.Tree();
tree.controller = new qx.data.controller.Tree(null, tree, "kids", "name");
var store = new qx.data.store.Json();
store.addListener("loaded", function(ev)
{
var sel = this.controller.getSelection();
if (sel.getLength()==0)
{
this.controller.setModel(ev.getData().getTree());
var root = this.getRoot();
if (root)
{
this.addToSelection(root);
root.setOpen(true);
}
}
else
{
var currentNode = this.controller.getSelection().getItem(0);
currentNode.setKids(ev.getData().getTree().getKids());
// forces update
this.controller.__updateTreeChildren(this.getSelection()[0],currentNode);
}
},tree);
benco wrote:
>
> Thanks for your help, Martin!
>
> I tried to follow your idea but it didn't work either. So, I investigated
> further and I just noticed a problem with my tree controller.
>
> I don't know if it comes from my code (or if it's a bug from the
> TreeController class). When I update my tree model by populating with the
> new kids, the tree widget isn't refreshed correctly and I have to specify
> an additional call to a private method of the tree controller
> "__updateTreeChildren" to make it happen.
>
> I verified that I wasn't mistaken: the content of the kids after updating
> the model and the new kids were hence present but the tree didn't reload.
>
> As a reminder, my code is like this one:
>
> var tree = new qx.ui.tree.Tree();
> var tree.controller = new qx.data.controller.Tree(null, tree, "kids",
> "name");
>
> var store = new qx.data.store.Json();
>
> store.addListener("loaded", function(ev)
> {
> var sel = this.controller.getSelection();
>
> if (sel.getLength()==0)
> {
> this.controller.setModel(ev.getData().getTree());
> var root = this.getRoot();
> if (root)
> {
> tree.addToSelection(root);
> root.setOpen(true);
> }
> }
> else
> {
> var currentNode =
> this.tree.controller.getSelection().getItem(0);
> currentNode.setKids(ev.getData().getTree().getKids());
>
> // forces update
>
> tree.controller.__updateTreeChildren(tree.getSelection()[0],currentNode);
> }
> });
>
>
> Am I wrong or the extra function call is mandatory in my case (not a bug)
> ?
>
> Regards,
>
> Benoît.
>
> PS: In fact, I just realised my store is nearly unnecessary as I manage
> all by the loaded event (a simple remote.request is good enough).
>
>
> Martin Wittemann wrote:
>>
>> Good morning Benoît,
>>
>> no i get what you are planing to do. Thanks for the detailed
>> description. I guess the best way to load the tree structure on demand
>> is to always keep the binding to the initial model and just add the
>> models loaded after the initial model to the initial model:
>>
>> initial model (m1):
>> a
>> - a1
>> - a2
>>
>> now you click on a1 and load that (m2):
>>
>> a1
>> - a11
>> - a12
>>
>> You have two different models but you can just grab the kids of the
>> second model and set them in the first model.
>>
>> m1.getKids()[0].setKids(m2.getKids());
>>
>> That should keep the whole structure and just add the kids.
>>
>> The list binding could always take the kids of the current selection.
>>
>> treeController.bind("selection.kids", listController, "model");
>>
>> Have you seen the qooxdoo feed reader example? This is based on the
>> data binding features as well. Perhaps you can get some ideas from
>> that code.
>>
>> Best,
>> Martin
>>
>>
>> Am 25.07.2009 um 12:06 schrieb benco:
>>
>>>
>>> Hello Martin,
>>>
>>> Sorry for the lack of precise informations. OK, I explain :). I work
>>> on a
>>> sort of file manager. It has two parts : a tree and a list (like any
>>> file
>>> manager window). In order to manage and retreive all the relevant
>>> datas, I
>>> use a store and link the model to the two widget controllers (the
>>> tree and
>>> the list).
>>>
>>> My model definition (could evolve but it follows mainly the examples
>>> on the
>>> demo page):
>>>
>>> {tree:{name:"",kids:[]},currentfolder:[{name:"",type:"folder|
>>> file"},...]}
>>>
>>> In an initialisation step, the tree must load the first and second
>>> level. In
>>> the following steps, I delete this behaviour because the goal is to
>>> display
>>> the currentfolder in the list and populate the tree with additional
>>> sub-folders when we select a tree node.
>>>
>>> But I don't know how to add the new sub-folders in the tree (except
>>> if I
>>> worked without the new binding features). When I select a treenode,
>>> the json
>>> store is reloaded with additional parameters. The result is in the
>>> same kind
>>> of the above described model except that {tree:{name:"",kids:[]}} only
>>> concerns the selected folder in the tree. So, as the name doesn't
>>> change (I
>>> don't plan to manage concurrence yet), I only need to bind the kids
>>> of the
>>> model store to the kids of the selection in the tree controller.
>>>
>>> But "this.store.bind('model.tree.kids', this.tree.controller,
>>> 'selection[0].kids'))" seems not to work. Anyway, the content isn't
>>> refreshed (I don't notice any add). And furthermore, the previous
>>> selected
>>> treenode isn't anymore selected after the bind assignment.
>>>
>>> Regarding my second question, I already noticed that it was
>>> qx.data.Array
>>> based. In fact you can consider it as a complement to my first
>>> question. I
>>> tried to do this kind of operation as the
>>> "this.store.bind('model.tree.kids', this.tree.controller,
>>> 'selection[0].kids'))" seemed not work:
>>>
>>> this.store.addListener("loaded", function(ev)
>>> {
>>>
>>> ...
>>>
>>> ...
>>>
>>> var target = this.tree.controller.getSelection();
>>> target.splice(0,1,ev.getTree());
>>>
>>> (or)
>>>
>>> var target = this.tree.controller.getSelection();
>>> target.setName(ev.getTree().getName());
>>> target.setKids(ev.getTree().getKids());
>>>
>>> ...
>>>
>>> }, this);
>>>
>>>
>>> I hope it's more clear for you :). Have a nice weekend!
>>>
>>> Best,
>>>
>>> Benoît.
>>>
>>>
>>> Martin Wittemann wrote:
>>>>
>>>> Hello Benoît,
>>>>
>>>> I have to admit that I don't get your use case right. You want to use
>>>> "model.tree" on the first load as model for the tree controller and
>>>> on
>>>> the second load, you want to use "model.tree.kids"? Do you want to
>>>> set
>>>> the selection with the second bind? :
>>>>> this.store.bind('model.tree.kids', this.tree.controller,
>>>>> 'selection[0].kids')); // this would'nt work
>>>>
>>>> Because thats what the code tries to do.
>>>>
>>>> Perhaps you could tell me what you want to achieve with the code?
>>>> Maybe i can help you more if I know what you want to do.
>>>>
>>>> To your second question: You can just change the model and the data
>>>> binding will populate the the tree. As the model is a set of qooxdoo
>>>> objects with data arrays, you can just manipulate these model objects
>>>> and that should do the job. :)
>>>>
>>>> Best,
>>>> Martin
>>>>
>>>>
>>>> Am 24.07.2009 um 16:08 schrieb benco:
>>>>
>>>>>
>>>>> Hello,
>>>>>
>>>>> I'm a bit stuck and I really need some help here.
>>>>>
>>>>> I'm working on a Tree that can be loaded progressively on deploy and
>>>>> selection events. I also would like using the new binding features
>>>>> with that
>>>>> tree (namely the Tree Controller and the Json Store).
>>>>>
>>>>> The problem is I don't know how to manage the bindings correctly.
>>>>>
>>>>> In the first step (first launch), I bind the store with the tree
>>>>> controller.
>>>>> Then, the behaviour changes. The store should be binded to the tree
>>>>> controller "selection[0]". I really don't know how to do this in a
>>>>> simple
>>>>> way.
>>>>>
>>>>> If it's not possible ... never mind (I'll use the default tree
>>>>> behaviours
>>>>> and functions). But It would be useful and cool.
>>>>>
>>>>> Here's a code example:
>>>>>
>>>>> this.tree.controller = new qx.data.controller.Tree(null,
>>>>> this.browser.tree,
>>>>> "kids", "name");
>>>>>
>>>>> this.store = new qx.data.store.Json();
>>>>>
>>>>> this.tree.bindId =
>>>>> store.bind('model.tree',this.tree.controller,'model');
>>>>>
>>>>> this.store.addListener("loaded", function(ev)
>>>>> {
>>>>> // first loading
>>>>> if (this.tree.bindId)
>>>>> {
>>>>> this.store.removeBinding(this.tree.bindId);
>>>>> this.tree.bindId=null;
>>>>>
>>>>> var root = this.tree.getRoot();
>>>>> if (root)
>>>>> {
>>>>> this.tree.addToSelection(root);
>>>>> root.setOpen(true);
>>>>> }
>>>>> }
>>>>> else
>>>>> {
>>>>> this.store.bind('model.tree.kids',this.tree.controller,
>>>>> 'selection[0].kids')); // this would'nt work
>>>>> }
>>>>> }, this.browser);
>>>>>
>>>>> Furthermore, I'd like to know how I can complete/populate a partial
>>>>> zone of
>>>>> a model in the tree controller by new additional datas without
>>>>> resetting it
>>>>> completely... Any Ideas ?
>>>>>
>>>>> Thanks in advance,
>>>>>
>>>>> Best,
>>>>>
>>>>> Benoît.
>>>>> --
>>>>> View this message in context:
>>>>> http://www.nabble.com/Progressive-Tree-on-selection-and-or-deployement-%2B-the-new-binding-features-tp24645160p24645160.html
>>>>> Sent from the qooxdoo-devel mailing list archive at Nabble.com.
>>>>>
>>>>>
>>>>> ------------------------------------------------------------------------------
>>>>> _______________________________________________
>>>>> qooxdoo-devel mailing list
>>>>> [email protected]
>>>>> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
>>>>
>>>>
>>>> ------------------------------------------------------------------------------
>>>> _______________________________________________
>>>> qooxdoo-devel mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
>>>>
>>>>
>>>
>>> --
>>> View this message in context:
>>> http://www.nabble.com/Progressive-Tree-on-selection-and-or-deployement-%2B-the-new-binding-features-tp24645160p24656522.html
>>> Sent from the qooxdoo-devel mailing list archive at Nabble.com.
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> _______________________________________________
>>> qooxdoo-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
>>
>>
>> ------------------------------------------------------------------------------
>> _______________________________________________
>> qooxdoo-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/Progressive-Tree-on-selection-and-or-deployement-%2B-the-new-binding-features-tp24645160p24685079.html
Sent from the qooxdoo-devel mailing list archive at Nabble.com.
------------------------------------------------------------------------------
_______________________________________________
qooxdoo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel