X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fviews.scm;h=8e2c21cf47c6f7b6a366ad272bb37bf39f8aa49e;hb=bdc03bcc2da4d01745fb542d7a7d642b888b691e;hp=2fc44a873e5ce1394e6236f5ac28880e697b58b3;hpb=c2473ff3eec8feb96efd299b0d1fc7f11e348362;p=gacela.git diff --git a/src/views.scm b/src/views.scm index 2fc44a8..8e2c21c 100644 --- a/src/views.scm +++ b/src/views.scm @@ -28,18 +28,44 @@ (make-record-type "view" '(id controllers meshes priority) (lambda (record port) - (format port "#" - (length (hash-map->list (lambda x x) (view-controllers record))) - (length (hash-map->list (lambda x x) (view-meshes record))))))) + (format port "#" + (length (view-meshes record)))))) -(define* (make-view #:optional (priority 0)) ((record-constructor view-type) (gensym) (make-hash-table) (make-hash-table) priority)) +(define (make-view controllers meshes priority) ((record-constructor view-type) (gensym) controllers meshes priority)) (define view? (record-predicate view-type)) (define view-id (record-accessor view-type 'id)) -(define view-controllers (record-accessor view-type 'controllers)) (define view-meshes (record-accessor view-type 'meshes)) +(define view-meshes-set! (record-modifier view-type 'meshes)) +(define view-controllers (record-accessor view-type 'controllers)) +(define view-controllers-set! (record-modifier view-type 'controllers)) (define view-priority (record-accessor view-type 'priority)) +(defmacro* view (#:key (priority 0) . elements) + `(let ((e (view-elements ,@elements))) + (make-view (car e) (cadr e) ,priority))) + +(define-macro (view-elements . elements) + (cond ((null? elements) `'(() ())) + (else + `(let ((l (view-elements ,@(cdr elements)))) + ,(let ((e (car elements))) + `(cond ((mesh? ,e) + (list (car l) (cons ,e (cadr l)))) + ((procedure? ,e) + (list (cons ,(if (list? e) e `(lambda () (,e))) (car l)) + (cadr l))) + (else l))))))) + +(define (controllers-list list controllers) + (cond ((null? controllers) + list) + ((list? (car controllers)) + (assoc-set! (controllers-list list (cdr controllers)) (caar controllers) (cadar controllers))) + (else + (assoc-set! (controllers-list list (cdr controllers)) (gensym) (car controllers))))) + (define activated-views '()) + (define (sort-views views-alist) (sort views-alist (lambda (v1 v2) @@ -55,23 +81,27 @@ (define (view-priority-set! view priority) ((record-modifier view-type 'priority) view priority) - (set! activated-views (sort-views activated-views))) + (if (view-actived? view) + (set! activated-views (sort-views activated-views)))) + +(define current-view #f) (define* (run-views #:optional (views activated-views)) (cond ((not (null? views)) - ; controllers go here - (draw-meshes (hash-map->list (lambda (k v) v) (view-meshes (cdar views)))) + (set! current-view (cdar views)) + ;((view-body current-view)) + (draw-meshes (view-meshes current-view)) (run-views (cdr views))))) (define (draw-meshes meshes) (cond ((not (null? meshes)) (catch #t - (lambda () (mesh-draw (car meshes))) + (lambda () (mesh-draw (cdar meshes))) (lambda (key . args) #f)) (draw-meshes (cdr meshes))))) -(define default-view (activate-view (make-view))) +;(define default-view (activate-view (make-view (lambda () #f)))) ;;; Meshes @@ -86,7 +116,6 @@ (format port " ~a" x)))) (mesh-properties record)) (display ">" port)))) - (define mesh? (record-predicate mesh-type)) @@ -164,15 +193,19 @@ (define (mesh-property-set! mesh prop-name value) (((record-accessor mesh-type 'property-set!) mesh) prop-name value)) -(define* (show mesh #:optional (view default-view)) +(define* (show mesh #:optional (view current-view)) (let ((id (mesh-inner-property mesh 'id)) (table (view-meshes view))) - (if (not (hash-ref table id)) - (hash-set! table id mesh)))) + (if (not (assoc-ref table id)) + (view-meshes-set! view (assoc-set! table id mesh)))) + mesh) -(define* (hide mesh #:optional (view default-view)) - (let ((table (view-meshes view))) - (hash-remove! table (mesh-inner-property mesh 'id)))) +(define* (hide mesh #:optional (view current-view)) + (let ((id (mesh-inner-property mesh 'id)) + (table (view-meshes view))) + (if (assoc-ref table id) + (view-meshes-set! view (assoc-remove! table id)))) + mesh) (define* (translate mesh x y #:optional (z 0)) (((record-accessor mesh-type 'translate) mesh) x y z) @@ -216,11 +249,11 @@ (square video:draw-square)) +;;; Adding extensions to the main loop +(add-extension! run-views 10) + + (module-map (lambda (sym var) (if (not (eq? sym '%module-public-interface)) (module-export! (current-module) (list sym)))) (current-module)) - - -;;; Adding extensions to the main loop -(add-extension! run-views 10)