about summary refs log tree commit diff stats
path: root/subx/070new-stream.subx
Commit message (Expand)AuthorAgeFilesLines
* 5218Kartik Agaram2019-05-221-1/+1
* 5151 - use mmap everywhere we need a heapKartik Agaram2019-05-101-7/+8
* 4981 - no, go back to 3 phasesKartik Agaram2019-02-181-7/+0
* 4950Kartik Agaram2019-02-031-0/+124
id='n55' href='#n55'>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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
## editing sandboxes after they've been created

scenario clicking-on-a-sandbox-moves-it-to-editor [
  local-scope
  trace-until 100/app  # trace too long
  assume-screen 50/width, 10/height
  # run something
  env:&:environment <- new-programming-environment screen, [add 2, 2]
  assume-console [
    press F4
  ]
  event-loop screen, console, env
  screen-should-contain [
    .                               run (F4)           .
    .                                                  .
    .──────────────────────────────────────────────────.
    .0   edit           copy           delete          .
    .add 2, 2                                          .
    .4                                                 .
    .──────────────────────────────────────────────────.
    .                                                  .
  ]
  # click somewhere on the sandbox
  assume-console [
    left-click 3, 4
  ]
  run [
    event-loop screen, console, env
  ]
  # it pops back into editor
  screen-should-contain [
    .                               run (F4)           .
    .add 2, 2                                          .
    .──────────────────────────────────────────────────.
    .                                                  .
  ]
  # cursor should be in the right place
  assume-console [
    type [0]
  ]
  run [
    event-loop screen, console, env
  ]
  screen-should-contain [
    .                               run (F4)           .
    .0add 2, 2                                         .
    .──────────────────────────────────────────────────.
    .                                                  .
  ]
]

after <global-touch> [
  # support 'edit' button
  {
    edit?:bool <- should-attempt-edit? click-row, click-column, env
    break-unless edit?
    edit?, env <- try-edit-sandbox click-row, env
    break-unless edit?
    hide-screen screen
    screen <- render-sandbox-side screen, env, render
    screen <- update-cursor screen, current-sandbox, env
    show-screen screen
    loop +next-event
  }
]

# some preconditions for attempting to edit a sandbox
def should-attempt-edit? click-row:num, click-column:num, env:&:environment -> result:bool [
  local-scope
  load-ingredients
  # are we below the sandbox editor?
  click-sandbox-area?:bool <- click-on-sandbox-area? click-row, env
  reply-unless click-sandbox-area?, 0/false
  # narrower, is the click in the columns spanning the 'edit' button?
  first-sandbox:&:editor <- get *env, current-sandbox:offset
  assert first-sandbox, [!!]
  sandbox-left-margin:num <- get *first-sandbox, left:offset
  sandbox-right-margin:num <- get *first-sandbox, right:offset
  edit-button-left:num, edit-button-right:num, _ <- sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
  edit-button-vertical-area?:bool <- within-range? click-column, edit-button-left, edit-button-right
  reply-unless edit-button-vertical-area?, 0/false
  # finally, is sandbox editor empty?
  current-sandbox:&:editor <- get *env, current-sandbox:offset
  result <- empty-editor? current-sandbox
]

def try-edit-sandbox click-row:num, env:&:environment -> clicked-on-edit-button?:bool, env:&:environment [
  local-scope
  load-ingredients
  # identify the sandbox to edit, if the click was actually on the 'edit' button
  sandbox:&:sandbox <- find-sandbox env, click-row
  return-unless sandbox, 0/false
  clicked-on-edit-button? <- copy 1/true
  # 'edit' button = 'copy' button + 'delete' button
  text:text <- get *sandbox, data:offset
  current-sandbox:&:editor <- get *env, current-sandbox:offset
  current-sandbox <- insert-text current-sandbox, text
  env <- delete-sandbox env, sandbox
  # reset scroll
  *env <- put *env, render-from:offset, -1
]

scenario sandbox-with-print-can-be-edited [
  local-scope
  trace-until 100/app  # trace too long
  assume-screen 50/width, 20/height
  # run a print instruction
  env:&:environment <- new-programming-environment screen, [print-integer screen, 4]
  # run the sandbox
  assume-console [
    press F4
  ]
  event-loop screen, console, env
  screen-should-contain [
    .                               run (F4)           .
    .                                                  .
    .──────────────────────────────────────────────────.
    .0   edit           copy           delete          .
    .print-integer screen, 4                           .
    .screen:                                           .
    .  .4                             .                .
    .  .                              .                .
    .  .                              .                .
    .  .                              .                .
    .  .                              .                .
    .──────────────────────────────────────────────────.
    .                                                  .
  ]
  # edit the sandbox
  assume-console [
    left-click 3, 18
  ]
  run [
    event-loop screen, console, env
  ]
  screen-should-contain [
    .                               run (F4)           .
    .print-integer screen, 4                           .
    .──────────────────────────────────────────────────.
    .                                                  .
    .                                                  .
  ]
]

scenario editing-sandbox-after-scrolling-resets-scroll [
  local-scope
  trace-until 100/app  # trace too long
  assume-screen 50/width, 20/height
  # initialize environment
  env:&:environment <- new-programming-environment screen, []
  render-all screen, env, render
  # create 2 sandboxes and scroll to second
  assume-console [
    press ctrl-n
    type [add 2, 2]
    press F4
    type [add 1, 1]
    press F4
    press page-down
    press page-down
  ]
  event-loop screen, console, env
  screen-should-contain [
    .                               run (F4)           .
    .──────────────────────────────────────────────────.
    .1   edit           copy           delete          .
    .add 2, 2                                          .
    .4                                                 .
    .──────────────────────────────────────────────────.
    .                                                  .
  ]
  # edit the second sandbox
  assume-console [
    left-click 2, 10
  ]
  run [
    event-loop screen, console, env
  ]
  # second sandbox shows in editor; scroll resets to display first sandbox
  screen-should-contain [
    .                               run (F4)           .
    .add 2, 2                                          .
    .──────────────────────────────────────────────────.
    .0   edit           copy           delete          .
    .add 1, 1                                          .
    .2                                                 .
    .──────────────────────────────────────────────────.
    .                                                  .
  ]
]

scenario editing-sandbox-updates-sandbox-count [
  local-scope
  trace-until 100/app  # trace too long
  assume-screen 50/width, 20/height
  # initialize environment
  env:&:environment <- new-programming-environment screen, []
  render-all screen, env, render
  # create 2 sandboxes and scroll to second
  assume-console [
    press ctrl-n
    type [add 2, 2]
    press F4
    type [add 1, 1]
    press F4
  ]
  event-loop screen, console, env
  screen-should-contain [
    .                               run (F4)           .
    .                                                  .
    .──────────────────────────────────────────────────.
    .0   edit           copy           delete          .
    .add 1, 1                                          .
    .2                                                 .
    .──────────────────────────────────────────────────.
    .1   edit           copy           delete          .
  ]
  # edit the second sandbox, then resave
  assume-console [
    left-click 3, 10
    press F4
  ]
  run [
    event-loop screen, console, env
  ]
  # no change in contents
  screen-should-contain [
    .                               run (F4)           .
    .                                                  .
    .──────────────────────────────────────────────────.
    .0   edit           copy           delete          .
    .add 1, 1                                          .
    .2                                                 .
    .──────────────────────────────────────────────────.
    .1   edit           copy           delete          .
  ]
  # now try to scroll past end
  assume-console [
    press page-down
    press page-down
    press page-down
  ]
  run [
    event-loop screen, console, env
  ]
  # screen should show just final sandbox
  screen-should-contain [
    .                               run (F4)           .
    .──────────────────────────────────────────────────.
    .1   edit           copy           delete          .
    .add 2, 2                                          .
    .4                                                 .
    .──────────────────────────────────────────────────.
    .                                                  .
  ]
]