Am 12.04.2006 um 22:26 schrieb Ken Tilton:
(setf (pb-state (fm^ :oper-mode-pb)) ;; FRGO:
HERE !!! (on-off-toggle (fm^v :oper-mode-pb)))))) ;; FRGO: HERE !!!
(mk-menu-entry-command :label "Action: Push the OPER MODE button" :command (c? (tk-callback .tkw 'push-oper- mode-pb (lambda () (setf (fm^v :oper-mode-pb) ;; FRGO: HERE !!! (on-off-toggle (fm^v :oper-mode-pb)))))) ;; FRGO: HERE !!! )
We have three slots in play now: .md-value, enabled, and pb- state. .md-value because fm^v expands to (md-value (fm^ ...))
As the ltktest-cells-inside doc says, I like to use the slot md- value of an instance the same way TK treats the name of an instance as a variable, namely to hold the key value that instance represents in the application.
It is not clear to me that enabled is that slot, even tho you have the pb-state initarg associated with it. I would think that pb- state is currently playing the key role of holding the key on/off value. This is confirmed by you setting the toggle result into pb- state.
On the other hand, I see pb-state is ephemeral. I also see:
(defmacro push-the-button (button-id) `(setf (fm^v ,button-id) :pressed))
Now there you are setting the md-value to :pressed, but since I see toggle intentions, I am guessing this is a button that gets pressed and then released then pressed again, and the second time produces the opposite value as the first. So, putting it all together (and throwing out altogether enabled since I see that is not yet implemented):
(defmodel pushbutton (application-object) ((.md-value :cell t :accessor pb-state :initform (c-in :off))))
(mk-menu-entry-command :label "Action: Push the OPER MODE button" :command (c? (tk-callback .tkw 'push-oper-mode-pb (lambda () (setf (fm^v :oper-mode-pb) (on-off-toggle (fm^v :oper-mode-pb)))))))
If you want to get a little fancier:
(defmodel pushbutton (application-object) ((.md-value :cell t :accessor pb-state :initform (c? (if (^pressed) (on-off-toggle .cache) (initial-pb-state self)))) (pressed :cell :ephemeral :intiform (c-in nil) ... etc) (initial-pb-state :cell nil ....etc )))
(mk-menu-entry-command :label "Action: Push the OPER MODE button" :command (c? (tk-callback .tkw 'push-oper-mode-pb (lambda () (setf (pressed (fm^ :oper-mode-pb)) t)))))
The latter can be good for doing things like associating a click sound with the button press, because then you just have other cells watching (^pressed). Otherwise you end up loading more and more code into the menu callback.
hth, ken
You wonder if this helps? You just not only discovered some bugs but also explained to me .cache and real use of .md-value ...
It certainly helps!!
Thanks so much.
Frank