about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--edit.mu138
1 files changed, 15 insertions, 123 deletions
diff --git a/edit.mu b/edit.mu
index 517d5e2a..62055ac9 100644
--- a/edit.mu
+++ b/edit.mu
@@ -1,134 +1,26 @@
-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
-]
+# Editor widget: takes a string and screen coordinates, and returns a new string.
 
-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
+scenario edit-prints-string-to-screen [
+  assume-screen 10:literal/width, 5:literal/height
+  assume-keyboard []
+  run [
+    s:address:array:character <- new [abc]
+    s2:address:array:character, screen:address, keyboard:address <- edit s:address:array:character, screen:address, 0:literal/top, 0:literal/right, 10:literal/bottom, 5:literal/right, keyboard:address
+  ]
+  screen-should-contain [
+    .abc       .
+    .          .
+  ]
 ]
 
 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
+  s:address:array:character <- next-ingredient
   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
+  keyboard:address <- next-ingredient
+  print-string screen:address, s:address:array:character
 ]