On 5/20/06, Frank Goenninger <fgoenninger@prion.de> wrote:
Am 20.05.2006 um 20:16 schrieb Frank Goenninger:
> Am 20.05.2006 um 18:24 schrieb Ken Tilton:
>
>> Frank Goenninger wrote:
>>
>>> Hi Kenny, hi all:
>>>
>>> I do have a text widget which is created using mk-text-widget:
>>>
>>> (mk-text-widget :id :receive-window
>>> :state 'disabled
>>> :md-value (c?n "...")
>>> :height 10
>>> :width 80
>>> :borderwidth 2
>>> :relief 'sunken
>>> :pady 5))
>>>
>>> No matter what I do (even setting :state to 'enabled) I do get
>>> anything printed in the text widget.
>>>
>>> I actually execute a setf on md-value of the text widget:
>>>
>>> (setf (md-value (fm-other :receive-window)) data)
>>>
>>>
>>> Any idea? Thx!
>>
>>
>> Hmmm, looks like I did not finish implementing text widgets.
>
> Yep, meanwhile I recognized that an observer is missing in file
> entry.lisp.
Well, actually I had to do (in file entry.lisp):
;; Method CLEAR: clears a text widget to zero content
(defmethod clear ((self text-widget))
(tk-format `(:variable ,self) "~a delete
1.0 end" (^path)))
;; This observer puts text to the widget if md-value has been set
;; Also takes care of edge cases like initialization time and setting
;; strings of length 0...
(defobserver .md-value ((self text-widget))
(trc "md-value output" self new-value)
(if (or (and (not old-value)
(string= new-value ""))
(not new-value))
(tk-format `(:variable ,self) "~a delete
1.0 end" (^path))
(if (> (length new-value) 0)
(tk-format `(:variable ,self) "~a insert end ~a" (^path) new-
value))))
I took your stuff and whittled it down to:
(defobserver .md-value ((self text-widget))
(trc "md-value output" self new-value)
(with-integrity (:client `(:variable ,self))
(tk-format-now "~a delete 1.0 end" (^path))
(when (plusp (length new-value))
(tk-format-now "~a insert end ~s" (^path) new-value))))
That way two (setf (md-value self) "Hi mom") calls do not produce "Hi momHi mom".
I was not sure the API entry point CLEAR was needed elsewhere. I can see that it would be, though. Really, the more I look at the text widget the more I think it needs imperative processing by application code that has a clear idea of what it wants to do with all the capabilities of the widget.
I also brought both commands within the same integrity bundle by skipping the tk-format syntactic sugar and open-coding with-integrity. That just saves one enqueue, no big deal. A bigger deal is that the sort done by tk-user-queue-handler was not (until just now <g>) a stable sort, so the delete could have been executed after the insert. Bringing both operations into the single integrity bundle also fixes that.
Now, whenever I do a
$ echo "Heya this is a test" > /Users/frgo/tmp/frgo-test
the text gets displayed in the window.
Isn't great when we get stuff like that working? Is there a universal law: any time the effect produced by your own code surprises you, you are probably onto something good. Programming never gets old.
Fileevent to be put to Celtk CVS in a few days ... watch out.
Thx. I am switching all my code to LLGPL now, btw. I think we settled on that for your stuff, yes?
kt