(module face-demo mzscheme (require (lib "mred.ss" "mred") (lib "class.ss") (lib "utils.ss" "texpict") (lib "mrpict.ss" "texpict") (lib "face.ss" "texpict")) (define f (new frame% (label "frame"))) (define canvas-scale 1) (define c (new canvas% (parent f) (paint-callback (lambda (x dc) (send dc set-scale canvas-scale canvas-scale) (cb dc))))) (define moods '(unhappiest unhappier unhappy sortof-unhappy sortof-happy happy happier happiest embarassed badly-embarassed mad mean)) (new button% (label "Face Color...") (parent f) (callback (lambda (b e) (let ([c (get-color-from-user "Face Color" f face-color)]) (when c (set! face-color c) (new-face-callback)))))) (new choice% (label #f) (choices (append (map symbol->string moods) (list "Custom"))) (parent f) (callback (lambda (c e) (let ([v (send c get-selection)]) (set! face-mood (and (v . < . (length moods)) (list-ref moods v))) (new-face-callback))))) (define custom-panel (new group-box-panel% (label "Custom") (parent f))) (let ([choices '(none normal worried angry raised)]) (new choice% (label "Eyebrows") (choices (map symbol->string choices)) (parent custom-panel) (callback (lambda (c e) (set! face-eyebrow-kind (list-ref choices (send c get-selection))) (new-face-callback))))) (let ([choices '(plain narrow medium large huge grimace)]) (new choice% (label "Mouth") (choices (map symbol->string choices)) (parent custom-panel) (callback (lambda (c e) (set! face-mouth-kind (list-ref choices (send c get-selection))) (new-face-callback))))) (new check-box% (label "Frown") (parent custom-panel) (callback (lambda (c e) (set! face-frown? (send c get-value)) (new-face-callback)))) (new slider% (label "Eye Inset") (parent custom-panel) (min-value 0) (max-value 10) (callback (lambda (s e) (set! face-eye-inset (send s get-value)) (new-face-callback)))) (new slider% (label "Eyebrow Y") (parent custom-panel) (min-value -5) (max-value 5) (init-value 0) (callback (lambda (s e) (set! face-eyebrow-dy (send s get-value)) (new-face-callback)))) (let ([pupils (lambda (label setter hi) (new slider% (label label) (parent custom-panel) (min-value (- hi)) (max-value hi) (init-value 0) (callback (lambda (s e) (setter (send s get-value)) (new-face-callback)))))]) (pupils "Pupil X" (lambda (v) (set! face-pupils-dx v)) 10) (pupils "Pupil Y" (lambda (v) (set! face-pupils-dy v)) 15)) (send custom-panel enable #f) (dc-for-text-size (send c get-dc)) (define face-color default-face-color) (define face-mood (car moods)) (define face-eyebrow-kind 'none) (define face-mouth-kind 'plain) (define face-frown? #f) (define face-eye-inset 0) (define face-eyebrow-dy 0) (define face-pupils-dx 0) (define face-pupils-dy 0) (define the-pict (face face-mood face-color)) (define (new-face-callback) (send custom-panel enable (not face-mood)) (set! the-pict (if face-mood (face face-mood face-color) (face* face-eyebrow-kind face-mouth-kind face-frown? face-color face-eye-inset face-eyebrow-dy face-pupils-dx face-pupils-dy))) (send c on-paint)) (define (cb dc) (draw-pict the-pict dc 0 0)) (send c min-width (inexact->exact (floor (* canvas-scale (pict-width the-pict))))) (send c min-height (inexact->exact (floor (* canvas-scale (pict-height the-pict))))) (send f show #t))