source: trunk/ccl/examples/cocoa/easygui/events.lisp @ 7499

Last change on this file since 7499 was 7499, checked in by af, 12 years ago

Implement mouse event methods for drawing views.

  • Print method for points
  • redisplay method
  • Update tiny.lisp to provide mouse handler example: drag up to increase Number of points, down to decrease it.
File size: 3.0 KB
Line 
1(in-package :easygui)
2
3;;; Event handling basics
4
5(defmacro define-chaining-responder-method (class-name
6                                            (objc-name lisp-name)
7                                            (self-arg event-arg)
8                                            &body arg-compute-forms)
9  `(objc:defmethod (,objc-name :void) ((,self-arg ,class-name)
10                                       ,event-arg)
11     (let ((ev-class (class-name
12                      (class-of (easygui-view-of ,self-arg)))))
13       (if (find-method #',lisp-name nil `(,ev-class) nil) ; TODO: doesn't consider subclasses.
14           (,lisp-name (easygui-view-of ,self-arg)
15                     ,@arg-compute-forms)
16           (,objc-name (#/nextResponder ,self-arg) ,event-arg)))))
17
18(defmacro define-useful-mouse-event-handling-routines (class-name)
19  `(progn
20     (define-chaining-responder-method ,class-name
21         (#/mouseDown: mouse-down) (self event)
22       :cocoa-event event
23       :location (let ((objc-pt (#/convertPoint:fromView:
24                                 self
25                                 (#/locationInWindow event)
26                                 nil)))
27                   (point (ns:ns-point-x objc-pt) (ns:ns-point-y objc-pt)))
28       :button (#/buttonNumber event)
29       :click-count (#/clickCount event)
30       :delta (point (#/deltaX event) (#/deltaY event)))
31     (define-chaining-responder-method ,class-name
32         (#/mouseUp: mouse-up) (self event)
33       :cocoa-event event
34       :location (let ((objc-pt (#/convertPoint:fromView:
35                                 self
36                                 (#/locationInWindow event)
37                                 nil)))
38                   (point (ns:ns-point-x objc-pt) (ns:ns-point-y objc-pt)))
39       :button (#/buttonNumber event)
40       :click-count (#/clickCount event)
41       :delta (point (#/deltaX event) (#/deltaY event)))
42     (define-chaining-responder-method ,class-name
43         (#/mouseDragged: mouse-dragged) (self event)
44       :cocoa-event event
45       :location (let ((objc-pt (#/convertPoint:fromView:
46                                 self
47                                 (#/locationInWindow event)
48                                 nil)))
49                   (point (ns:ns-point-x objc-pt) (ns:ns-point-y objc-pt))))))
50
51;;; Mouse:
52
53(defclass event-handler-mixin () ())
54
55(defclass mouse-event-handler-mixin () ())
56
57
58(macrolet ((defgeneric-and-empty-method (name (&rest args) &rest options)
59               `(defgeneric ,name ,args
60                  ,@options
61                  (:method ,args
62                    (declare (ignore ,@args))))))
63  ;; TODO: mouse-move
64  (defgeneric-and-empty-method mouse-down (view &key cocoa-event location button
65                                                click-count delta))
66  (defgeneric-and-empty-method mouse-up (view &key cocoa-event location button
67                                              click-count delta))
68  (defgeneric-and-empty-method mouse-dragged (view &key cocoa-event location
69                                                   delta)))
Note: See TracBrowser for help on using the repository browser.