[cells-devel] Re: celtk expander

Ken Tilton kennytilton at optonline.net
Tue Nov 6 00:23:42 UTC 2007


Andy Chambers wrote:
> On 11/2/07, Andy Chambers <achambers.home at googlemail.com> wrote:
> 
> 
>>(defmacro mk-expander ((&rest initargs) &rest kids)
>>  `(make-instance 'expander , at initargs
>>    :fm-parent *parent*
>>    :expansion (c? (the-kids , at kids))
>>    :expanded (c-in nil)
>>    :kids (c? (the-kids
>>              (mk-button-ex ((^label) (setf
>>                                       (expanded (upper self expander))
>>                                       (not (expanded (upper self expander))))))
>>              (when (^expanded)
>>                (^expansion))))))
> 
> 
> (defmacro mk-expander ((&rest initargs) &rest kids)
>   `(make-instance 'expander , at initargs
>     :fm-parent *parent*
>     :expansion (c? (lambda ()
> 		     (the-kids , at kids)))
>     :expanded (c-in nil)
>     :kids (c? (the-kids
> 	      (mk-button-ex ((^label) (setf
> 				       (expanded (upper self expander))
> 				       (not (expanded (upper self expander))))))
> 	      (when (^expanded)
> 		(funcall (^expansion)))))))
> 
> wrapping the expansion rule inside a lambda works.  This creates a new
> set of widgets each time the rule runs though.  Is there some way of
> doing it without that?

There are two things you can do here. One is to look at the 
family-values class, which has a fancy mechanism for maintaining a list 
of kids based on the md-value slot, which would go back and forth 
between '(:expander) and '(:expander :expandee). Then the kids rule 
avoids forever generating the expander widget because it basically pairs 
widget kids against the md-value list and sees it can keep a kid (a big 
issue being that rules can see the last value calculated most 
supportedly via the .cache symbol macro).

The other approach makes the expandee simply /visible/ based on the 
parnets expanded value. This avoids creating/destroying/recreating what 
is often an expensive widget. My GUI classes also have a 'collapsed' 
slot which can be set to mirror the visible slot of an expandee, so you 
get the treeview effect where the expansion closes up and everything 
scrunches back over to conserve space.

I usually go with the latter.

Your second post came thru pretty fast after the first (seems like maybe 
the lists started working again?) so I did not get a chance to meditate 
on why the expander only worked thru one cycle. I did see some things I 
would do differently, but the above pretty much moves us a couple of 
squares ahead so let's stay where we are.

ken



More information about the cells-devel mailing list