[cells-cvs] CVS Celtk

fgoenninger fgoenninger at common-lisp.net
Sun Jul 12 11:34:49 UTC 2009


Update of /project/cells/cvsroot/Celtk
In directory cl-net:/tmp/cvs-serv29747

Modified Files:
	widget.lisp 
Log Message:
Added: ON-HOVER functionality provided by Andy Chambers:

The usage would be...

(defmd my-window (window)
 :kids (c? (the-kids
	     (mk-stack (:packing (c?pack-self))
	       (mk-label :text "hi"
                :on-hover (lambda ()
			     (trc "hovering...")))))))

The on-hover function only gets called after the mouse has been sitting in the
widget for 1 1/2 seconds.  

Thanks again, Andy!


Thanks again, Andy!



--- /project/cells/cvsroot/Celtk/widget.lisp	2008/03/17 20:33:57	1.22
+++ /project/cells/cvsroot/Celtk/widget.lisp	2009/07/12 11:34:49	1.23
@@ -51,6 +51,7 @@
                (return-from xwin-widget self))
           finally (trc "xwin-widget > no widget for xwin " xwin)))))
 
+widget-event-handle
 ;;; --- widget -----------------------------------------
 
 (defmodel widget (family tk-object)
@@ -138,7 +139,7 @@
   (bif (self (tkwin-widget client-data))
         (widget-event-handle self xe)
         ;; sometimes I hit the next branch restarting after crash....
-        (trc nil "widget-event-handler > no widget for tkwin ~a" client-data))
+        (trc "widget-event-handler > no widget for tkwin" (tkwin-widget client-data)))
   #+nahhh(handler-case
       (bif (self (tkwin-widget client-data))
         (widget-event-handle self xe)
@@ -176,24 +177,43 @@
 (export! widget-event-handle)
 
 (defmethod widget-event-handle ((self widget) xe) ;; override for class-specific handling
-  (trc nil "bingo widget-event-handle" (xevent-type xe))
+  (trc "bingo >>>>>>> widget-event-handle" (xevent-type xe))
   (bif (h (^event-handler)) ;; support instance-specific handlers
     (funcall h self xe)
     (case (xevent-type xe)
-      (:buttonpress (trc "button pressed:" (xbe button xe)(xbe x xe)(xbe y xe)(xbe x-root xe)(xbe y-root xe)))
-      (:buttonrelease (trc "button released:" (xbe button xe)(xbe x xe)(xbe y xe)(xbe x-root xe)(xbe y-root xe)))(:MotionNotify
-       (xevent-dump xe))
+      (:buttonpress
+       (trc "button pressed:" (xbe button xe)(xbe x xe)(xbe y xe)(xbe x-root xe)(xbe y-root xe)))
+      (:buttonrelease
+       (trc "button released:" (xbe button xe)(xbe x xe)(xbe y xe)(xbe x-root xe)(xbe y-root xe)))
+      (:MotionNotify (xevent-dump xe))
+      (:EnterNotify (initiate-hover-event self))
+      (:LeaveNotify (cancel-hover-event self))
       (:virtualevent))))
 
+(defun initiate-hover-event (self)
+  (setf (hover-timer self)
+    (make-instance 'timer
+      :delay 1500
+      :repeat (c-in 1)
+      :action (lambda (timer)
+                (declare (ignore timer)
+                (bif (fn (on-hover self))
+                  (funcall fn)))))))
+
+(defun cancel-hover-event (self)
+  (cancel-timer (hover-timer self)))
+
 (defmethod tk-configure ((self widget) option value)
   (tk-format `(:configure ,self ,option) "~a configure ~(~a~) ~a" (path self) option (tk-send-value value)))
 
-
 (defmethod not-to-be :after ((self widget))
-  (when (or (and (eql self .tkw) (not (find .tkw *windows-destroyed*)))
-          (not (find .tkw *windows-being-destroyed*)))
-    (trc "not-to-be destroying widget" (^path))
-    (break "not to be")
+  (trc nil "NOT-TO-BE :AFTER (self widget): .tkw | self -> " .tkw self)
+  (trc nil "NOT-TO-BE :AFTER (self widget): *windows-destroyed* -> " *windows-destroyed*)
+  (trc nil "NOT-TO-BE :AFTER (self widget): *windows-being-destroyed* -> " *windows-being-destroyed*)
+  (when (or (and (eql self .tkw)
+                 (not (find .tkw *windows-destroyed*)))
+            (not (find .tkw *windows-being-destroyed*)))
+    (trc nil "not-to-be destroying widget" (^path))
     (tk-format `(:forget ,self) "pack forget ~a" (^path))
     (tk-format `(:destroy ,self) "destroy ~a" (^path))))
 
@@ -310,9 +330,6 @@
         (tcl-set-var *tki* (tk-variable self) v$ (var-flags :tcl-namespace-only))))))
 
 
-
-
-
 ;;; --- menus ---------------------------------
 
 (defun pop-up (menu x y)





More information about the Cells-cvs mailing list