...
original commit: f45ea9f4d70537f95da889b86c010630c83d9cf7
This commit is contained in:
parent
cce2a50202
commit
f116aaf571
155
collects/framework/guiutils.ss
Normal file
155
collects/framework/guiutils.ss
Normal file
|
@ -0,0 +1,155 @@
|
|||
|
||||
(unit/sig framework:gui-utils^
|
||||
(import)
|
||||
|
||||
(define cursor-delay
|
||||
(let ([x 0.25])
|
||||
(case-lambda
|
||||
[() x]
|
||||
[(v) (set! x v) x])))
|
||||
|
||||
(define show-busy-cursor
|
||||
(lambda (thunk)
|
||||
(local-busy-cursor #f thunk)))
|
||||
|
||||
(define delay-action
|
||||
(lambda (delay-time open close)
|
||||
(let ([semaphore (make-semaphore 1)]
|
||||
[open? #f]
|
||||
[skip-it? #f])
|
||||
(thread
|
||||
(lambda ()
|
||||
(sleep delay-time)
|
||||
(semaphore-wait semaphore)
|
||||
(unless skip-it?
|
||||
(set! open? #t)
|
||||
(open))
|
||||
(semaphore-post semaphore)))
|
||||
(lambda ()
|
||||
(semaphore-wait semaphore)
|
||||
(set! skip-it? #t)
|
||||
(when open?
|
||||
(close))
|
||||
(semaphore-post semaphore)))))
|
||||
|
||||
(define local-busy-cursor
|
||||
(let ([watch (make-object wx:cursor% wx:const-cursor-watch)])
|
||||
(opt-lambda (win thunk [delay (cursor-delay)])
|
||||
(let* ([old-cursor #f]
|
||||
[cursor-off void])
|
||||
(dynamic-wind
|
||||
(lambda ()
|
||||
(set! cursor-off
|
||||
(delay-action
|
||||
delay
|
||||
(lambda ()
|
||||
(if win
|
||||
(set! old-cursor (send win set-cursor watch))
|
||||
(wx:begin-busy-cursor)))
|
||||
(lambda ()
|
||||
(if win
|
||||
(send win set-cursor old-cursor)
|
||||
(wx:end-busy-cursor))))))
|
||||
(lambda () (thunk))
|
||||
(lambda () (cursor-off)))))))
|
||||
|
||||
(define unsaved-warning
|
||||
(opt-lambda (filename action [can-save-now? #f])
|
||||
(let* ([result (void)]
|
||||
[dialog%
|
||||
(class dialog-box% ()
|
||||
(inherit show new-line fit tab center set-size)
|
||||
(private
|
||||
[on-dont-save
|
||||
(lambda args
|
||||
(set! result 'continue)
|
||||
(show #f))]
|
||||
[on-save-now
|
||||
(lambda rags
|
||||
(set! result 'save)
|
||||
(show #f))]
|
||||
[on-cancel
|
||||
(lambda args
|
||||
(set! result 'cancel)
|
||||
(show #f))])
|
||||
(sequence
|
||||
(super-init "Warning")
|
||||
(let* ([panel (make-object vertical-panel% this)]
|
||||
[msg
|
||||
(make-object message%
|
||||
(string-append "The file \""
|
||||
filename
|
||||
"\" is not saved.")
|
||||
panel)]
|
||||
[button-panel
|
||||
(make-object horizontal-panel% panel)])
|
||||
(make-object button%
|
||||
(string-append action " Anyway")
|
||||
button-panel
|
||||
on-dont-save)
|
||||
(let ([now (make-object button%
|
||||
"Save"
|
||||
button-panel
|
||||
on-save-now)]
|
||||
[cancel (make-object button%
|
||||
"Cancel"
|
||||
button-panel
|
||||
on-cancel)])
|
||||
(if (not can-save-now?)
|
||||
(begin (send cancel set-focus)
|
||||
(send now show #f))
|
||||
(send now set-focus)))
|
||||
(send msg center wx:const-horizontal))
|
||||
|
||||
(set-size -1 -1 10 10)
|
||||
(center wx:const-both)
|
||||
|
||||
(show #t)))])
|
||||
(make-object dialog%)
|
||||
result)))
|
||||
|
||||
(define read-snips/chars-from-buffer
|
||||
(opt-lambda (edit [start 0] [end (send edit last-position)])
|
||||
(let ([pos start]
|
||||
[box (box 0)])
|
||||
(lambda ()
|
||||
(let* ([snip (send edit find-snip pos
|
||||
wx:const-snip-after-or-null box)]
|
||||
[ans
|
||||
(cond
|
||||
[(<= end pos) eof]
|
||||
[(null? snip) eof]
|
||||
[(is-a? snip wx:text-snip%)
|
||||
(let ([t (send snip get-text (- pos (unbox box)) 1)])
|
||||
(unless (= (string-length t) 1)
|
||||
(error 'read-snips/chars-from-buffer
|
||||
"unexpected string, t: ~s; pos: ~a box: ~a"
|
||||
t pos box))
|
||||
(string-ref t 0))]
|
||||
[else snip])])
|
||||
(set! pos (add1 pos))
|
||||
ans)))))
|
||||
|
||||
(define open-input-buffer
|
||||
(lambda (buffer)
|
||||
(let ([pos 0])
|
||||
(make-input-port
|
||||
(lambda ()
|
||||
(let ([c (send buffer get-character pos)])
|
||||
(if (char=? c #\null)
|
||||
eof
|
||||
(begin
|
||||
(set! pos (add1 pos))
|
||||
c))))
|
||||
(lambda ()
|
||||
#t)
|
||||
(lambda ()
|
||||
(void))))))
|
||||
|
||||
; For use with wx:set-print-paper-name
|
||||
(define print-paper-names
|
||||
(list
|
||||
"A4 210 x 297 mm"
|
||||
"A3 297 x 420 mm"
|
||||
"Letter 8 1/2 x 11 in"
|
||||
"Legal 8 1/2 x 14 in")))
|
Loading…
Reference in New Issue
Block a user