98 lines
2.7 KiB
Racket
98 lines
2.7 KiB
Racket
#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)))))
|
|
))
|