about summary refs log tree commit diff stats
path: root/edit.mu
blob: 517d5e2acf8ed7e33d38f1dcbb86c0f30ee9d716 (plain) (blame)
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
130
131
132
133
134
recipe main [
  default-space:address:array:location <- new location:type, 30:literal
  switch-to-display
  width:number <- display-width
  {
    wide-enough?:boolean <- greater-than width:number, 100:literal
    break-if wide-enough?:boolean
    return-to-console
    assert wide-enough?:boolean, [screen too narrow; we don't support less than 100 characters yet]
  }
  divider:number, _ <- divide-with-remainder width:number, 2:literal
  draw-column 0:literal/screen, divider:number
  x:address:array:character <- new [1:integer <- add 2:literal, 2:literal]
  y:address:array:character <- edit x:address:array:character, 0:literal/screen, 0:literal, 0:literal, 5:literal, divider:number
#?   draw-bounding-box 0:literal/screen, 0:literal, 0:literal, 5:literal, divider:number
  left:number <- add divider:number, 1:literal
  y:address:array:character <- edit 0:literal, 0:literal/screen, 0:literal, left:number, 2:literal, width:number
  move-cursor 0:literal/screen, 0:literal, 0:literal
  wait-for-key-from-keyboard
  return-to-console
]

recipe draw-column [
  default-space:address:array:location <- new location:type, 30:literal
  screen:address <- next-ingredient
  col:number <- next-ingredient
  curr:number <- copy 0:literal
  max:number <- screen-height screen:address
  {
    continue?:boolean <- lesser-than curr:number, max:number
    break-unless continue?:boolean
    move-cursor screen:address, curr:number, col:number
    print-character screen:address, 9474:literal/vertical, 245:literal/grey
    curr:number <- add curr:number, 1:literal
    loop
  }
  move-cursor screen:address, 0:literal, 0:literal
]

recipe edit [
  default-space:address:array:location <- new location:type, 30:literal
  in:address:array:character <- next-ingredient
  screen:address <- next-ingredient
  top:number <- next-ingredient
  left:number <- next-ingredient
  bottom:number <- next-ingredient
  right:number <- next-ingredient
  # draw bottom boundary
  curr:number <- copy left:number
  {
    continue?:boolean <- lesser-than curr:number, right:number
    break-unless continue?:boolean
    move-cursor screen:address, bottom:number, curr:number
    print-character screen:address, 9472:literal/vertical, 245:literal/grey
    curr:number <- add curr:number, 1:literal
    loop
  }
  move-cursor screen:address, top:number, left:number
]

recipe draw-bounding-box [
  default-space:address:array:location <- new location:type, 30:literal
  screen:address <- next-ingredient
  # sanity-check the box bounds
  top:number <- next-ingredient
  {
    out?:boolean <- lesser-than top:number, 0:literal
    break-unless out?:boolean
    top:number <- copy 0:literal
  }
  left:number <- next-ingredient
  {
    out?:boolean <- lesser-than left:number, 0:literal
    break-unless out?:boolean
    left:number <- copy 0:literal
  }
  bottom:number <- next-ingredient
  {
    height:number <- screen-height screen:address
    out?:boolean <- greater-or-equal bottom:number, height:number
    break-unless out?:boolean
    bottom:number <- subtract height:number, 1:literal
  }
  right:number <- next-ingredient
  {
    width:number <- screen-width screen:address
    out?:boolean <- greater-or-equal right:number, width:number
    break-unless out?:boolean
    right:number <- subtract width:number, 1:literal
  }
#?   print-integer screen:address, bottom:number
#?   print-character screen:address, 32:literal/space
#?   print-integer screen:address, right:number
  # top border
  move-cursor screen:address, top:number, left:number
  print-character screen:address, 9484:literal/down-right, 245:literal/grey
  x:number <- add left:number, 1:literal  # exclude corner
  {
    continue?:boolean <- lesser-than x:number, right:number
    break-unless continue?:boolean
    print-character screen:address, 9472:literal/horizontal, 245:literal/grey
    x:number <- add x:number, 1:literal
    loop
  }
  print-character screen:address, 9488:literal/down-left, 245:literal/grey
  # bottom border
  move-cursor screen:address, bottom:number, left:number
  print-character screen:address, 9492:literal/up-right, 245:literal/grey
  x:number <- add left:number, 1:literal  # exclude corner
  {
    continue?:boolean <- lesser-than x:number, right:number
    break-unless continue?:boolean
    print-character screen:address, 9472:literal/horizontal, 245:literal/grey
    x:number <- add x:number, 1:literal
    loop
  }
  print-character screen:address, 9496:literal/up-left, 245:literal/grey
  # left and right borders
  x:number <- add top:number, 1:literal  # exclude corner
  {
    continue?:boolean <- lesser-than x:number, bottom:number
    break-unless continue?:boolean
    move-cursor screen:address, x:number, left:number
    print-character screen:address, 9474:literal/vertical, 245:literal/grey
    move-cursor screen:address, x:number, right:number
    print-character screen:address, 9474:literal/vertical, 245:literal/grey
    x:number <- add x:number, 1:literal
    loop
  }
  # position cursor inside box
  move-cursor screen:address, top:number, left:number
  cursor-down screen:address
  cursor-right screen:address
]