#lang racket/base (require racket/class xml "wv-element.rkt" "racket-webview.rkt" ) (provide wv-input/text% wv-input/number% wv-input/boolean% wv-input/date% wv-input/time% wv-input/datetime% wv-input/range% wv-input/check% wv-input/radio% wv-input/color% wv-input/select%) (define-syntax mk-cl (syntax-rules (wv-element%) ((_ cl-name setter getter) (define cl-name (class wv-element% (inherit-field window element-id) (super-new) (define wv (hash-ref (send window info) 'wv)) (define/public (get) (getter wv element-id)) (define/public (set! v) (setter wv element-id v)) (define/public (on-change! callback-func) (send window bind! element-id 'input (λ (el evt data) (callback-func (send this get))))) ) ) ) ) ) (mk-cl wv-input/text% webview-set-value! webview-value) (mk-cl wv-input/number% webview-set-value! webview-value/number) (mk-cl wv-input/boolean% webview-set-value! webview-value/boolean) (mk-cl wv-input/date% webview-set-value! webview-value/date) (mk-cl wv-input/time% webview-set-value! webview-value/time) (mk-cl wv-input/datetime% webview-set-value! webview-value/datetime) (mk-cl wv-input/range% webview-set-value! webview-value/number) (mk-cl wv-input/check% webview-set-value! webview-value/boolean) (mk-cl wv-input/radio% webview-set-value! webview-value/boolean) (mk-cl wv-input/color% webview-set-value! webview-value/color) (define wv-input/select% (class wv-element% (inherit-field window element-id) (super-new) (define wv (hash-ref (send window info) 'wv)) (define/public (get) (webview-value wv element-id)) (define/public (set! value) (webview-set-value! wv element-id value)) (define/public (set-options! options [selected #f]) (send this set-innerHTML! (apply string-append (for/list ((option (in-list options))) (let ((value (car option)) (label (cadr option))) (xexpr->string (list 'option (list (list 'value (format "~a" value))) (format "~a" label))))))) (when selected (send this set! selected))) (define/public (on-change! callback-func) (send window bind! element-id 'change (λ (element event data) (callback-func (send this get))))) ))