about summary refs log tree commit diff stats
path: root/text.lua
diff options
context:
space:
mode:
Diffstat (limited to 'text.lua')
-rw-r--r--text.lua142
1 files changed, 9 insertions, 133 deletions
diff --git a/text.lua b/text.lua
index 84339d4..4ccd874 100644
--- a/text.lua
+++ b/text.lua
@@ -41,12 +41,10 @@ function Text.draw(State, line_index, y, startpos)
           end
         else
           if pos <= State.cursor1.pos and pos + frag_len > State.cursor1.pos then
-            Text.draw_cursor(State, State.left+Text.x(screen_line, State.cursor1.pos-pos+1), y)
+            Text.pretend_draw_cursor(State, State.left+Text.x(screen_line, State.cursor1.pos-pos+1), y)
           elseif pos + frag_len == State.cursor1.pos then
-            -- Show cursor at end of line.
-            -- This place also catches end of wrapping screen lines. That doesn't seem worth distinguishing.
-            -- It seems useful to see a cursor whether your eye is on the left or right margin.
-            Text.draw_cursor(State, State.left+Text.x(screen_line, State.cursor1.pos-pos+1), y)
+            -- Keep pretend cursor_x/cursor_y in sync with upstream.
+            Text.pretend_draw_cursor(State, State.left+Text.x(screen_line, State.cursor1.pos-pos+1), y)
           end
         end
       end
@@ -83,6 +81,11 @@ function Text.draw_cursor(State, x, y)
   State.cursor_y = y+State.line_height
 end
 
+function Text.pretend_draw_cursor(State, x, y)
+  State.cursor_x = x
+  State.cursor_y = y+State.line_height
+end
+
 function Text.populate_screen_line_starting_pos(State, line_index)
   local line = State.lines[line_index]
   local line_cache = State.line_cache[line_index]
@@ -120,128 +123,10 @@ function Text.populate_screen_line_starting_pos(State, line_index)
   end
 end
 
-function Text.text_input(State, t)
-  if App.mouse_down(1) then return end
-  if App.ctrl_down() or App.alt_down() or App.cmd_down() then return end
-  local before = snapshot(State, State.cursor1.line)
---?   print(State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos, State.screen_bottom1.line, State.screen_bottom1.pos)
-  Text.insert_at_cursor(State, t)
-  if State.cursor_y > App.screen.height - State.line_height then
-    Text.populate_screen_line_starting_pos(State, State.cursor1.line)
-    Text.snap_cursor_to_bottom_of_screen(State, State.left, State.right)
-  end
-  record_undo_event(State, {before=before, after=snapshot(State, State.cursor1.line)})
-end
-
-function Text.insert_at_cursor(State, t)
-  local byte_offset = Text.offset(State.lines[State.cursor1.line].data, State.cursor1.pos)
-  State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_offset-1)..t..string.sub(State.lines[State.cursor1.line].data, byte_offset)
-  Text.clear_screen_line_cache(State, State.cursor1.line)
-  State.cursor1.pos = State.cursor1.pos+1
-end
-
--- Don't handle any keys here that would trigger text_input above.
 function Text.keychord_press(State, chord)
 --?   print('chord', chord, State.selection1.line, State.selection1.pos)
-  --== shortcuts that mutate text
-  if chord == 'return' then
-    local before_line = State.cursor1.line
-    local before = snapshot(State, before_line)
-    Text.insert_return(State)
-    State.selection1 = {}
-    if State.cursor_y > App.screen.height - State.line_height then
-      Text.snap_cursor_to_bottom_of_screen(State, State.left, State.right)
-    end
-    schedule_save(State)
-    record_undo_event(State, {before=before, after=snapshot(State, before_line, State.cursor1.line)})
-  elseif chord == 'tab' then
-    local before = snapshot(State, State.cursor1.line)
---?     print(State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos, State.screen_bottom1.line, State.screen_bottom1.pos)
-    Text.insert_at_cursor(State, '\t')
-    if State.cursor_y > App.screen.height - State.line_height then
-      Text.populate_screen_line_starting_pos(State, State.cursor1.line)
-      Text.snap_cursor_to_bottom_of_screen(State, State.left, State.right)
---?       print('=>', State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos, State.screen_bottom1.line, State.screen_bottom1.pos)
-    end
-    schedule_save(State)
-    record_undo_event(State, {before=before, after=snapshot(State, State.cursor1.line)})
-  elseif chord == 'backspace' then
-    if State.selection1.line then
-      Text.delete_selection(State, State.left, State.right)
-      schedule_save(State)
-      return
-    end
-    local before
-    if State.cursor1.pos > 1 then
-      before = snapshot(State, State.cursor1.line)
-      local byte_start = utf8.offset(State.lines[State.cursor1.line].data, State.cursor1.pos-1)
-      local byte_end = utf8.offset(State.lines[State.cursor1.line].data, State.cursor1.pos)
-      if byte_start then
-        if byte_end then
-          State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_start-1)..string.sub(State.lines[State.cursor1.line].data, byte_end)
-        else
-          State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_start-1)
-        end
-        State.cursor1.pos = State.cursor1.pos-1
-      end
-    elseif State.cursor1.line > 1 then
-      before = snapshot(State, State.cursor1.line-1, State.cursor1.line)
-      -- join lines
-      State.cursor1.pos = utf8.len(State.lines[State.cursor1.line-1].data)+1
-      State.lines[State.cursor1.line-1].data = State.lines[State.cursor1.line-1].data..State.lines[State.cursor1.line].data
-      table.remove(State.lines, State.cursor1.line)
-      table.remove(State.line_cache, State.cursor1.line)
-      State.cursor1.line = State.cursor1.line-1
-    end
-    if State.screen_top1.line > #State.lines then
-      Text.populate_screen_line_starting_pos(State, #State.lines)
-      local line_cache = State.line_cache[#State.line_cache]
-      State.screen_top1 = {line=#State.lines, pos=line_cache.screen_line_starting_pos[#line_cache.screen_line_starting_pos]}
-    elseif Text.lt1(State.cursor1, State.screen_top1) then
-      State.screen_top1 = {
-        line=State.cursor1.line,
-        pos=Text.pos_at_start_of_screen_line(State, State.cursor1),
-      }
-      Text.redraw_all(State)  -- if we're scrolling, reclaim all fragments to avoid memory leaks
-    end
-    Text.clear_screen_line_cache(State, State.cursor1.line)
-    assert(Text.le1(State.screen_top1, State.cursor1))
-    schedule_save(State)
-    record_undo_event(State, {before=before, after=snapshot(State, State.cursor1.line)})
-  elseif chord == 'delete' then
-    if State.selection1.line then
-      Text.delete_selection(State, State.left, State.right)
-      schedule_save(State)
-      return
-    end
-    local before
-    if State.cursor1.pos <= utf8.len(State.lines[State.cursor1.line].data) then
-      before = snapshot(State, State.cursor1.line)
-    else
-      before = snapshot(State, State.cursor1.line, State.cursor1.line+1)
-    end
-    if State.cursor1.pos <= utf8.len(State.lines[State.cursor1.line].data) then
-      local byte_start = utf8.offset(State.lines[State.cursor1.line].data, State.cursor1.pos)
-      local byte_end = utf8.offset(State.lines[State.cursor1.line].data, State.cursor1.pos+1)
-      if byte_start then
-        if byte_end then
-          State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_start-1)..string.sub(State.lines[State.cursor1.line].data, byte_end)
-        else
-          State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_start-1)
-        end
-        -- no change to State.cursor1.pos
-      end
-    elseif State.cursor1.line < #State.lines then
-      -- join lines
-      State.lines[State.cursor1.line].data = State.lines[State.cursor1.line].data..State.lines[State.cursor1.line+1].data
-      table.remove(State.lines, State.cursor1.line+1)
-      table.remove(State.line_cache, State.cursor1.line+1)
-    end
-    Text.clear_screen_line_cache(State, State.cursor1.line)
-    schedule_save(State)
-    record_undo_event(State, {before=before, after=snapshot(State, State.cursor1.line)})
   --== shortcuts that move the cursor
-  elseif chord == 'left' then
+  if chord == 'left' then
     Text.left(State)
     State.selection1 = {}
   elseif chord == 'right' then
@@ -325,15 +210,6 @@ function Text.keychord_press(State, chord)
   end
 end
 
-function Text.insert_return(State)
-  local byte_offset = Text.offset(State.lines[State.cursor1.line].data, State.cursor1.pos)
-  table.insert(State.lines, State.cursor1.line+1, {data=string.sub(State.lines[State.cursor1.line].data, byte_offset)})
-  table.insert(State.line_cache, State.cursor1.line+1, {})
-  State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_offset-1)
-  Text.clear_screen_line_cache(State, State.cursor1.line)
-  State.cursor1 = {line=State.cursor1.line+1, pos=1}
-end
-
 function Text.pageup(State)
 --?   print('pageup')
   -- duplicate some logic from love.draw