summaryrefslogtreecommitdiff
path: root/gui.rkt
blob: ce1228543b9d997d3921dc4498256f994b5b0e8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#lang racket/gui

(provide show-window)

(require racket/format)
(require racket/class)
(require (planet williams/table-panel:1:2/table-panel))
;(require table-panel)

(require "full-parse.rkt")

(define ns (make-base-namespace))
(namespace-set-variable-value! '^ expt #t ns)

(define (show-window)
      (define frame (new frame% [label "Calculator"]))

      (define msg (new message%
                       [parent frame]
                       [label ""]))

      (define root-panel (new vertical-panel%
                              [parent frame]
                              [alignment '(left top)]))

      (define top-op-panel (new horizontal-panel%
                                [parent root-panel]
                                [alignment '(left top)]))

      (define center-panel (new horizontal-panel%
                                [parent root-panel]
                                [alignment '(left top)]))

      (define number-panel (new table-panel%
                                [parent center-panel]
                                [alignment '(left top)]))

      (define left-op-panel (new vertical-panel%
                                 [parent center-panel]
                                 [alignment '(left top)]))

      (define bottom-op-panel (new horizontal-panel%
                                   [parent root-panel]
                                   [alignment '(left top)]))

      (send number-panel set-dimensions 3 3)


      (define (setup-num-btn lbl par)
        (new button%
             [parent par]
             [label (~a lbl)]
             [min-width 30]
             [callback
               (lambda (button event)
                 (send msg
                       set-label
                       (string-append
                         (send msg get-label)
                         (send button get-label))))]))

      (map (lambda (x) (setup-num-btn x top-op-panel)) '("(" ")" "/"))

      (map
        (lambda (x) (setup-num-btn x number-panel))
        (range 1 10))
      (map
        (lambda (x) (setup-num-btn x left-op-panel))
        '(* - +))
      (map
        (lambda (x) (setup-num-btn x bottom-op-panel))
        '(0 "." ^ ))

      (new button%
           [parent top-op-panel]
           [label "←"]
           [min-width 30]
           [callback
             (lambda (button event)
               (define str (send msg get-label))
               (send msg set-label (substring str 0 (- (string-length str) 1))))])


      (new button%
           [parent bottom-op-panel]
           [label "="]
           [min-width 30]
           [callback
             (lambda (button event)
               (define ^ expt)
               (send msg set-label (~a
                       (eval (full-parse (send msg get-label)) ns))))])

      (send frame show #t))