racket/collects/frtime/gui/mixin-macros.ss
Greg Cooper 33ec3576cc more cleanup
* fix a bug in initialization of FrTime widgets
* fix a bug in the pong demo
* allow needles and growing points to have larger grids
* purge the old GUI wrapper implementation
* fix a couple of bugs in the debugger
* add bitmap support to the animation library

svn: r9647
2008-05-05 02:50:46 +00:00

61 lines
2.5 KiB
Scheme

(module mixin-macros frtime
(require mzlib/class)
(define-syntax events->callbacks
(lambda (stx)
(syntax-case stx (carries-args-for)
[(_ field-name update-call)
#'(lambda (super-class)
(class ((events->callbacks field-name carries-args-for update-call)
super-class)
(init (field-name (event-receiver)))
(super-new (field-name (map-e list field-name)))))]
[(_ field-name carries-args-for update-call)
(let ([s-field-name (syntax field-name)])
(with-syntax ([the-cell-name (string->symbol
(format "~a-cell" (syntax-e s-field-name)))]
[getting-name (string->symbol
(format "get-~a-e" (syntax-e s-field-name)))]
[renamed-update (string->symbol
(format "renamed-~a" (syntax-e (syntax update-call))))])
(syntax
(lambda (super)
(class super
(init (field-name (event-receiver)))
(super-new)
(inherit (renamed-update update-call))
(define the-cell-name field-name)
(for-each-e! the-cell-name
(lambda (evt) (renamed-update . evt))
this)
(define/public (getting-name) the-cell-name))))))])))
;; overridden method can have >1 form
(define-syntax callbacks->args-evts
(lambda (stx)
(syntax-case stx ()
[(_ ev-name method-name)
(with-syntax ([name-e (string->symbol (format "~a-e" (syntax-e #'ev-name)))]
[g-name (string->symbol (format "get-~a" (syntax-e #'ev-name)))]
[processor (string->symbol (format "~a-event-processor" (syntax-e #'ev-name)))])
#'(lambda (default-proc super-class)
(class super-class
(init (processor default-proc))
(define name-e (event-receiver))
(define processed-events (processor name-e))
(super-new)
;what about when the super call returns an error?
(define/override method-name
(lambda args
(send-event name-e args)
(super method-name . args)))
(define/public (g-name) processed-events))))])))
(provide events->callbacks
callbacks->args-evts))