DrBrainf-ck/gui.rkt

74 lines
2 KiB
Racket
Raw Normal View History

2018-12-01 21:06:12 +00:00
#lang racket/gui
(require "main.rkt")
; The editor width in pixels
(define EDITOR-WIDTH 600)
(define EDITOR-HEIGHT 600)
; The frame racket/gui base object for the editor
(define f (new frame%
[label "DrBrainf*ck"]
[width EDITOR-WIDTH]
[height EDITOR-HEIGHT]))
; execute-content: -> World
; Returns the last state of execution of the program loaded in the editor
(define (execute-content)
(execute
(program->world
(string->program
(send t get-flattened-text)))))
; The run button
(define button (new button% [parent f]
[label "Run"]
; Callback procedure for a button click:
[callback (lambda (button event)
(send
output set-label
(world-output (execute-content))))]))
(define c (new editor-canvas% [parent f]))
; The editor text object
(define t (new text%))
; Change font to monospace
(define style-delta (make-object style-delta% 'change-family 'modern))
(send t change-style style-delta)
(define mb (new menu-bar% [parent f]))
(define m-file (new menu% [label "File"] [parent mb]))
(define m-edit (new menu% [label "Edit"] [parent mb]))
; Make a static text message in the frame
(define output (new message% [parent f]
[label "Click run to get output"]))
(define mi-open
(new menu-item%
[label "Open"]
[parent m-file]
[callback
(lambda (i e)
(define path (get-file #f f))
(when path
(send t load-file path 'text)))]
[shortcut #\o]
[shortcut-prefix '(ctl)]))
(define mi-save
(new menu-item%
[label "Save"]
[parent m-file]
[callback
(lambda (i e)
(send t save-file #f 'text))]
[shortcut #\s]
[shortcut-prefix '(ctl)]))
(append-editor-operation-menu-items m-edit #f)
(send t set-max-undo-history 100)
(send c set-editor t)
(send f show #t)