You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pollen/pollen/app/app.rkt

181 lines
6.1 KiB
Racket

#lang debug racket/gui
(require pollen/private/log
pollen/private/command
pollen/setup
pollen/private/project-server
net/sendurl)
(define app-mono-fam
(for*/first ([preferred
'("Triplicate T4" "Menlo" "Consolas" "Andale Mono" "Courier")]
[mono-fam (in-list (get-face-list 'mono))]
#:when (equal? preferred mono-fam))
preferred))
(define app-font-size 14)
(define app-font (make-font #:face (send normal-control-font get-face) #:size app-font-size))
(define window (new frame% [label "Pollen Helper"]
[width 700]
[height 500]
[x 40]
[y 40]
[alignment '(left top)]
[spacing 6]
[border 6]))
(define (make-hpanel) (new horizontal-panel%
[parent window]
[alignment '(left top)]
[stretchable-height #false]))
(define hpanel-select (make-hpanel))
(define current-manager-directory (make-parameter #f))
(define current-server-stopper (make-parameter #f))
(define (set-current-manager-directory val)
(current-manager-directory val)
(send directory-msg set-label (if val (path->string val) "")))
(module+ main
(set-current-manager-directory (expand-user-path "~/git/bpt/")))
(define button-directory
(let ([str "Select project directory"])
(new button%
[label str]
[parent hpanel-select]
[callback (λ (button evt)
(define dir (get-directory str))
(when dir
(set-current-manager-directory dir)
(set-server-port (setup:project-server-port dir))))])))
(define directory-msg
(new message%
[label ""]
[parent hpanel-select]
[auto-resize #true]))
(define hpanel-server-options (make-hpanel))
(define server-option-port
(new text-field%
[parent hpanel-server-options]
[label "server port"]
[min-width 150]
[stretchable-width #false]
[init-value (number->string (setup:project-server-port))]
[callback (λ (tf evt)
(set-server-port (string->number (send tf get-value))))]))
(define (set-server-port num)
(when (number? num)
(current-server-port num)
(send server-option-port set-value (number->string num))))
(define server-option-local
(new check-box%
[parent hpanel-server-options]
[label "local only"]
[callback (λ (cb evt)
(current-server-listen-ip (and (send cb get-value) "127.0.0.1")))]))
(define hpanel-server-controls (make-hpanel))
(define dialog-alert (new dialog%
[label "Error"]
[border 6]
[spacing 6]
[parent #f]))
(define dialog-message (new message%
[parent dialog-alert]
[auto-resize #t]
[label ""]))
(define dialog-alert-button-pane
(new horizontal-pane%
[parent dialog-alert]
[alignment '(right bottom)]))
(define dialog-alert-button-ok
(new button%
[parent dialog-alert-button-pane]
[label "OK"]
[style '(border)]
[callback (λ (button evt)
(send dialog-alert show #f))]))
(define (make-alert str)
(send dialog-message set-label str)
(send dialog-alert show #t))
(define button-start
(new button%
[label "Start project server"]
[parent hpanel-server-controls]
[callback (λ (button evt)
(if (current-server-stopper)
(make-alert "Project server already running.")
(match (current-manager-directory)
[#false (make-alert "No project directory selected.")]
[dir
(message "starting project server")
;; stopper is a function that sends a break signal
;; to the web server thread, wherever it is
(define stopper
(parameterize ([current-project-root dir])
(start-server (setup:main-pagetree dir) #:return #true)))
(current-server-stopper stopper)])))]))
(define button-stop
(new button%
[label "Stop project server"]
[parent hpanel-server-controls]
[callback (λ (button evt)
(match (current-server-stopper)
[#false (make-alert "Project server not running.")]
[stopper-proc
(stopper-proc)
(current-server-stopper #false)
(message "project server stopped")]))]))
(define button-launch
(new button%
[label "Launch browser"]
[parent hpanel-server-controls]
[callback (λ (button evt)
(cond
[(current-server-stopper)
(send-url
(format "http://localhost:~a/~a"
(current-server-port)
(setup:main-pagetree (current-manager-directory)))
#false)]
[else (make-alert "Project server not running.")]))]))
(define status-box
(let* ([wb (new text-field%
[label #f]
[style '(multiple)]
[parent window]
[font (make-font #:face app-mono-fam #:size app-font-size)])]
[ed (send wb get-editor)])
(send ed set-line-spacing (* app-font-size 0.4))
(send ed set-padding 6 3 6 3)
wb))
(define status-box-ed (send status-box get-editor))
(define log-receiver-thread
(thread (λ ()
(define rcvr (make-log-receiver pollen-logger 'info 'pollen))
(for ([vec (in-producer (λ () (sync rcvr)))])
(match-define (vector _ msg _ _) vec)
(send status-box-ed insert msg)
(send status-box-ed insert "\n")))))
(send window show #t)