;; ctl-view.scm - (c) rohan drape, 2003-2007 (module ctl-view scheme/base (require (prefix-in s: srfi/13) rsc3/rsc3 rsc3-interface/rsc3-interface "../ctl/ctl.scm") (provide (all-defined-out)) ;; p = parent, c = ctl, i = index, f = frame, n = name, d = dial, v = ;; value (define-structure ctl-view p c i f n d v) (define (make-ctl-view* p c i) (let ((f (make-frame p #t))) (make-ctl-view p c i f (make-button f 40 15 "" (lambda () (ctl-increment c 1))) (make-dial f 40 40 (lambda (z) (edit-ctl-internal c z))) (make-button f 40 15 "" (lambda () (ctl-update c)))))) ;; Use 'number->string' to make `n' into a string and then truncate to ;; `limit' decimal places. Allows for exponential notation. (define (real->string n limit) (let* ((s (number->string (exact->inexact n))) (l (string-length s)) (dot-index (s:string-index s #\.)) (e-index (s:string-index s #\e))) (if (and dot-index (> (- (if e-index e-index l) dot-index) limit)) (if e-index (string-append (s:string-take s (+ 1 dot-index limit)) (s:string-take-right s (- l e-index))) (s:string-take s (+ 1 dot-index limit))) s))) (define (update-ctl-view view) (let ((c (ctl-view-c view))) (edit-button-text (ctl-view-n view) (ctl-display-name c)) (edit-dial-value (ctl-view-d view) (ctl-internal c)) (edit-button-text (ctl-view-v view) (real->string (ctl-value c) 6)))) )