aboutsummaryrefslogtreecommitdiff
path: root/Gui_Exploration.rkt
blob: ff4d2d34961efc3caf75fef327a4180267d84d85 (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#lang racket
(require racket/gui/base)
;;Step 1. Create a window to draw into
(define frame(new frame% [label "Example"]))
;;I don't know what frame% means, but new must be a procedure
;;(send frame show #t) Running this command displays the frame
;;send appears to be a command to be a procedure that takes a frame
;; followed by a command and a boolean.
;;the boolean is fed into the command in this case
;;if you said #f it would close the window
;;that is usefull
;;Below is a slight expantion on example code
;;letting the button be a toggle
(define frame2 (new frame%[label "Example2"]))
(define msg (new message% [parent frame2] [label " Nothing  "]))
(define thingy #t)
(define button-to-click (new button%
     [parent frame2]
     [label "Click"]
     [callback (lambda (button event)
                 (if thingy
                 (begin (set! thingy #f)
                        (send msg set-label "Something"))
                 (begin (set! thingy #t)
                        (send msg set-label " Nothing  "))))]))
;;Frames are okay ish for error messages but the real stuff is
;;in canvas stuff
(define my-canvas%
  (class canvas%
    (define/override (on-event event)
      (send msg set-label "Canvas mouse"))
    (define/override (on-char event)
      (send msg set-label "Canvas keyboard"))
    (super-new)));;Don't know what that one means

(define canvas-thing (new my-canvas% [parent frame2]));;unfortunately
;;we still need to re-size it manually
;;Now I wonder if we could create a procedure to make any text
;;appear
(define frame3 (new frame%[label "Example3"]))
(define blank (new message% [parent frame3] [label "                                                                                "]))
(define (make-text string) (begin (send blank set-label string)))
;(send frame3 show #t)
;(make-text "Hello World") works exactly fine.
;;Now lets do something more complicated
;;We want to create a procedure that creates a new line
;;each time it is called so...
(define frame4 (new frame%[label "Example4"]))
;;now blank4 should be a procedure to create multiple lines in the frame
(define (make-text-line string) (begin (new message%
                                            [parent frame4]
                                            [label string])))
;;display with
;;(send frame4 show #t)
;;add text with
;;(make-text-line "Hello World!")
;;This works for not but there are a few problems
;;first of all the window starts really small and doesn't restrict
;;resizing. Second it is always in the middle of the frame
;;Third, once text is on screen there is no way to get it off
;;But we can do better
(define frame5 (new frame%
                   [label "Example5"]
                   [width 300]
                   [height 300]))
(define canvas5 (new canvas% [parent frame5]
             [paint-callback
              (lambda (canvas dc)
                (send dc set-scale 3 3)
                (send dc set-text-foreground "blue")
                (send dc draw-text "Don't Panic!" 0 0))]))
;;above is the example code to write some simple text, however
;;we can apply this to what we learned above to make something abit
;;more
(define frame6 (new frame%
                    [label "Example6"]
                    [width 600]
                    [height 700]))
(define (make-color-text string color)
  (begin (new canvas%
              [parent frame6]
              [paint-callback
               (lambda (canvas dc)
                 (send dc set-text-foreground color)
                 (send dc draw-text string 0 0 #f))])))
;;display with
;;(send frame6 show #t)
;;write text with
;;(make-color-text "Hello World!" "purple")
;;Okay that doesn't exactly work as planned...
;;the problem with this is that each message is it's own canvas now
;;not only that but it means we can only print each line in it's
;;own color. So new plan is to make it so it adds on new strings
;;to one canvas, adding \n as nessessary. Except nevermind since
;;\n doesn't exist in this apparently

;;Lets switch back to text and we can change it later
(define frame7 (new frame%
                    [label "Example7"]
                    [width 600]
                    [height 200]))
(define (make-blank-line i)
  (new message%
       [parent frame7]
       [label "                                                                                "]))
;;80 space characters
;;the i is only there to make the build-list command happy
(define Message-list (build-list 10 make-blank-line))
;;10 make-blank-lines
;;that build-list command is super usefull for something like this
(define (move-down-list list)
  (if (eq? '() (cdr list))
      '()
      (begin
        (move-down-list (cdr list))
        (send (car (cdr list)) set-label (send (car list) get-label)))))
(define (send-word string)
  (begin
    (move-down-list Message-list)
    (send (car Message-list) set-label string)))
;;display with
;;(send frame7 show #t)
;;add text with
;;(send-word "Hello World")
;;Now using the send-word command I can make each word appear on the
;;screen in the place where it used to be. Starting at the top of the
;;screen and working it's way down the more text is added.
;;on the bottom line, after adding 10 lines of text, it will remove the bottom
;;most line