dotsandboxes/gui.rkt

103 lines
3.6 KiB
Racket

#lang racket
(define game (GameState (grid '() 6 6) 0 '(0 0) (list (player "None" 0) (player "None" 0))))
(define g 0)
(define w 6)
(define h 6)
(define t 0)
(require "main.rkt" racket/gui)
; Line -> String
; Converts a line to a string for the list
(define (line->string l)
(format "~a : ~a,~a-~a,~a"
(if (= (line-player l) 0) "R" "B")
(point-x (line-from l))
(point-y (line-from l))
(point-x (line-to l))
(point-y (line-to l))))
(define (load-game-gui! ng)
(set! game ng)
(set! g (grid-lines (GameState-grid ng)))
(set! w (grid-width (GameState-grid ng)))
(set! h (grid-height (GameState-grid ng)))
(set! t 0))
(load-game-gui! game)
(define (status-label game)
(format "~a vs ~a, ~a:~a"
(player-name (first (GameState-players game)))
(player-name (last (GameState-players game)))
(first (GameState-scores game)) (last (GameState-scores game))))
(define frame (new frame%
[label "DBN Viewer"]
[width 300]
[height 300]))
(define menu-bar (new menu-bar%
[parent frame]))
(define file-menu (new menu%
(label "&File")
(parent menu-bar)))
(new menu-item%
[label "&Load"]
[parent file-menu]
[callback (lambda (m event)
(let ([f (get-file "Load Game" #f #f #f ".dbn" '() '(("Dots and Boxes Notation" "*.dbn")))])
(if (eq? #f f) 0 (load-game-gui! (load-game! f)))
(send grid-canvas refresh)
(send log set (map line->string g))
(send score set-label (status-label game))
(set! t 0)))])
(define displaypanel (new horizontal-panel% [parent frame]))
(define grid-canvas (new canvas%
[parent displaypanel]
[paint-callback
(lambda (canvas dc)
(send dc clear)
(render-grid (grid (take g t) w h) dc))]))
(define log (new list-box%
[label ""]
[parent displaypanel]
[choices (map line->string g)]
[callback (lambda (box event)
(set! t (car (send box get-selections)))
(send grid-canvas refresh))]))
(define buttonpanel (new horizontal-panel%
[parent frame]
; [alignment '(center center)]
[stretchable-height #f]
))
(define backbutton (new button%
[parent buttonpanel]
[label "back"]
[callback (lambda (button state)
(if (not (= t 0))
(set! t (sub1 t)) 0)
(send log select (- t 1))
(send grid-canvas refresh))]))
(define forwardbutton (new button%
[parent buttonpanel]
[label "forward"]
[callback (lambda (button state)
(if (not (= t (length g)))
(set! t (add1 t)) 0)
(send log select (- t 1))
(send grid-canvas refresh))]))
(define score (new message%
[parent buttonpanel]
[label (status-label game)]))
(send frame show #t)