diff options
-rw-r--r-- | main.lua | 48 | ||||
-rw-r--r-- | text.lua | 49 |
2 files changed, 49 insertions, 48 deletions
diff --git a/main.lua b/main.lua index 589de0a..a00790d 100644 --- a/main.lua +++ b/main.lua @@ -294,6 +294,54 @@ function App.keychord_pressed(chord) Selection1 = deepcopy(src.selection) patch(Lines, event.before, event.after) end + -- clipboard + elseif chord == 'C-c' then + local s = Text.selection() + if s then + App.setClipboardText(s) + end + elseif chord == 'C-x' then + local s = Text.cut_selection() + if s then + App.setClipboardText(s) + end + elseif chord == 'C-v' then + -- We don't have a good sense of when to scroll, so we'll be conservative + -- and sometimes scroll when we didn't quite need to. + local before_line = Cursor1.line + local before = snapshot(before_line) + local clipboard_data = App.getClipboardText() + local num_newlines = 0 -- hack 1 + for _,code in utf8.codes(clipboard_data) do + local c = utf8.char(code) + if c == '\n' then + Text.insert_return() + num_newlines = num_newlines+1 + else + Text.insert_at_cursor(utf8.char(code)) + end + end + -- hack 1: if we have too many newlines we definitely need to scroll + for i=before_line,Cursor1.line do + Lines[i].screen_line_starting_pos = nil + Text.populate_screen_line_starting_pos(i) + end + if Cursor1.line-Screen_top1.line+1 + num_newlines > App.screen.height/Line_height then + Screen_top1.line = Cursor1.line + Screen_top1.pos = 1 + Text.scroll_up_while_cursor_on_screen() + end + -- hack 2: if we have too much text wrapping we definitely need to scroll + local clipboard_text = App.newText(love.graphics.getFont(), clipboard_data) + local clipboard_width = App.width(clipboard_text) +--? print(Cursor_y, Cursor_y*Line_width, Cursor_y*Line_width+Cursor_x, Cursor_y*Line_width+Cursor_x+clipboard_width, Line_width*App.screen.height/Line_height) + if Cursor_y*Line_width+Cursor_x + clipboard_width > Line_width*App.screen.height/Line_height then + Screen_top1.line = Cursor1.line + Screen_top1.pos = 1 + Text.scroll_up_while_cursor_on_screen() + end + record_undo_event({before=before, after=snapshot(before_line, Cursor1.line)}) + -- dispatch to drawing or text elseif love.mouse.isDown('1') or chord:sub(1,2) == 'C-' then Drawing.keychord_pressed(chord) elseif chord == 'escape' and love.mouse.isDown('1') then diff --git a/text.lua b/text.lua index dfad9ab..5c468b2 100644 --- a/text.lua +++ b/text.lua @@ -427,7 +427,7 @@ function test_insert_from_clipboard() App.screen.check(y, 'ghi', 'F - test_insert_from_clipboard/baseline/screen:3') -- after hitting the enter key the screen scrolls down App.clipboard = 'xy\nz' - App.run_after_keychord('M-v') + App.run_after_keychord('C-v') check_eq(Screen_top1.line, 1, 'F - test_insert_from_clipboard/screen_top') check_eq(Cursor1.line, 2, 'F - test_insert_from_clipboard/cursor:line') check_eq(Cursor1.pos, 2, 'F - test_insert_from_clipboard/cursor:pos') @@ -1379,53 +1379,6 @@ function Text.keychord_pressed(chord) end save_to_disk(Lines, Filename) record_undo_event({before=before, after=snapshot(Cursor1.line)}) - -- paste - elseif chord == 'M-c' then - local s = Text.selection() - if s then - App.setClipboardText(s) - end - elseif chord == 'M-x' then - local s = Text.cut_selection() - if s then - App.setClipboardText(s) - end - elseif chord == 'M-v' then - -- We don't have a good sense of when to scroll, so we'll be conservative - -- and sometimes scroll when we didn't quite need to. - local before_line = Cursor1.line - local before = snapshot(before_line) - local clipboard_data = App.getClipboardText() - local num_newlines = 0 -- hack 1 - for _,code in utf8.codes(clipboard_data) do - local c = utf8.char(code) - if c == '\n' then - Text.insert_return() - num_newlines = num_newlines+1 - else - Text.insert_at_cursor(utf8.char(code)) - end - end - -- hack 1: if we have too many newlines we definitely need to scroll - for i=before_line,Cursor1.line do - Lines[i].screen_line_starting_pos = nil - Text.populate_screen_line_starting_pos(i) - end - if Cursor1.line-Screen_top1.line+1 + num_newlines > App.screen.height/Line_height then - Screen_top1.line = Cursor1.line - Screen_top1.pos = 1 - Text.scroll_up_while_cursor_on_screen() - end - -- hack 2: if we have too much text wrapping we definitely need to scroll - local clipboard_text = App.newText(love.graphics.getFont(), clipboard_data) - local clipboard_width = App.width(clipboard_text) ---? print(Cursor_y, Cursor_y*Line_width, Cursor_y*Line_width+Cursor_x, Cursor_y*Line_width+Cursor_x+clipboard_width, Line_width*App.screen.height/Line_height) - if Cursor_y*Line_width+Cursor_x + clipboard_width > Line_width*App.screen.height/Line_height then - Screen_top1.line = Cursor1.line - Screen_top1.pos = 1 - Text.scroll_up_while_cursor_on_screen() - end - record_undo_event({before=before, after=snapshot(before_line, Cursor1.line)}) --== shortcuts that move the cursor elseif chord == 'left' then if Selection1.line then |