;; Models for use with Zorphs (define-class () (listeners)) (define-method (initialize (model ) args) (initialize-slots model (list 'listeners '())) (call-next-method)) (define (model-listeners model) (slot-ref model 'listeners)) (define (model-listener-add! model listener) (slot-set-add! model 'listeners listener)) (define (model-listener-remove! model listener) (slot-set-remove! model 'listeners listener)) (define (model-changed model . args) (for-each (lambda (el) (handle-model-changed el model args)) (model-listeners model))) (define-class () (content)) (define (string-model-text model) (slot-ref model 'content)) (define (string-model-text-set! model newcontent) (slot-set! model 'content newcontent) (model-changed model 'text)) (define-class () (rect)) (define-method (initialize (model ) args) (initialize-slots model (list 'rect (bounds->rect 0 0 1 1))) ; x y w h (call-next-method)) ;; NB the asymmettry between this and the accessor (define (rect-model-set! model x y w h) (slot-set! model 'rect (bounds->rect x y w h)) (model-changed model 'rect)) (define (rect-model-rect model) (slot-ref model 'rect)) (define-class () (view-transform layers)) (define-method (initialize (model ) args) (initialize-slots model (list 'view-transform (make-transform) 'layers '())) (call-next-method)) (define (camera-model-lookat! model viewed) (slot-set-add! model 'layers viewed) (model-changed model 'layers)) (define (camera-model-lookaway! model viewed) (slot-set-remove! model 'layers viewed) (model-changed model 'layers)) (define (call/camera-view model receiver) (let ((res (receiver (camera-model-view-transform model)))) (model-changed model 'view-transform) res)) (define (camera-model-translate model dx dy) (call/camera-view model (cut transform-translate <> dx dy))) (define (camera-model-rotate model rads) (call/camera-view model (cut transform-rotate <> rads))) (define (camera-model-scale model sxy) (call/camera-view model (cut transform-scale <> sxy sxy))) ;; The camera view transform is mutable, but please don't ;; fool around with it .. use the translate/rotate/scale functions ;; instead. (define (camera-model-view-transform model) (slot-ref model 'view-transform)) (define (camera-model-layers model) (slot-ref model 'layers))