[cells-devel] Something like a def-family-observer?

Peter Hildebrandt peter.hildebrandt at gmail.com
Tue Dec 11 13:57:04 UTC 2007


Here's a question for you cells wizards out there (and Kenny in  
particular):

Say, I have a model M that depends on the structure of a family tree.  One  
of M's slots is therefore depending on the root of the family tree: (c?  
root).  However, I want M to know about changes in the family tree, like,  
say, when a child or grandchild is added.  Apparently cells (at least the  
cells_2.0 branch required by cells-gtk) does not broadcast change messages  
to the parents of a node (which I guess is the right thing in 99% of the  
cases).

What's the best way to deal with that?

(i) Is there some mechanism for this purpose present in cells? Or
(ii) Do I roll my own special case solution? Or
(iii) Is it worthwhile to build some general purpose solution to this  
problem?

My approach towards (ii) (I haven't coded anything yet, waiting for you  
comments) would be something like building an observer tree each node of  
which observes one node in the family tree.  Something like this:
- Design a tiny tree observer model ("tto"?), suited to observing one  
family node
(defmodel tty (family) (observed observed-kids reports-to))

- Every tto knows about the parent model (M from above) and does the right  
thing when it sees a change (say, call a closure)
- If the observed nodes has kids, it instantiates tto kids of its own to  
match the kids of the observed tree
    (def-c-output observed ((self tto))
      (make-tto :observed (c? new-value) :observed-kids (c? (kids  
new-value)))
      (setf (kids self) (mapcar (lambda (kid) (make-tto :observed (c? kid)  
:observed-kids (c? (kids kid)))) (kids new-value)
    ...)
    (def-c-output observed-kids ((self tto))
    ...)

- Changing the root slot in M results in the instantiation of a tto for  
the root

I guess that would work ... but I feel there must be a more elegant  
solution.  I'm eager to hear your suggestions.

Thanks,
Peter


Background:

If you have seen my ton of mails on the cells-gtk-devel list, you know I'm  
doing some GUI work with cells-gtk at the moment.  I ran into the  
following issue:  cells-gtk can use a family tree as a natural  
representation of the contents of a tree-view.  However, when I change the  
items in that family tree, cells-gtk currently has no way of updating the  
C data structure correspondingly.

The tree-model data type GTK uses internally is nasty to deal with, and  
therefore I really want to capsulate everything away.  I have already  
figured out how to add/remove rows and children in the model, so I'd be  
ready to modify the C data type to reflect changes in the family tree.   
I'm just looking for the Right Way to do it.




More information about the cells-devel mailing list