Merge text.love
[?]
Mar 26, 2023, 4:59 PM
Q6RXCILQD7PV6XI44VJSLQZD3DHWOXTNIU5BFTEHHLBWDRQI4CVACDependencies
- [2]
YMKVHKZRMerge text.love - [3]
REAIVN7WMerge lines.love - [4]
36Z442IVback to commit 8123959e52f without code editing - [5]
R56CKHYZMerge text.love - [6]
KKMFQDR4editing source code from within the app - [7]
MQTFTTEKMerge lines.love - [8]
ORRSP7FVdeduce test names on failures - [9]
T4FRZSYLdelete an ancient, unused file - [10]
K2X6G75Zstart writing some tests for drawings - [11]
XX7G2FFJintermingle freehand line drawings with text - [12]
2CTN2IEFMerge lines.love - [13]
KMSL74GAsupport selections in the source editor - [14]
BLWAYPKVextract a module - [15]
ZTZOO2OQMerge lines.love - [16]
MD3W5IRAnew fork: rip out drawing support - [17]
2L5MEZV3experiment: new edit namespace - [18]
ETXNVRPTMerge lines.love - [19]
LF7BWEG4group all editor globals - [20]
VP5KC4XZMerge lines.love - [21]
C3GUE45IMerge text.love - [22]
VOU73AK6Merge lines.love - [23]
VZJHGWSPMerge lines.love - [24]
R5QXEHUIsomebody stop me - [25]
VHQCNMARseveral more modules - [26]
OGUV4HSAremove some memory leaks from rendered fragments - [27]
TRSYJH2ZMerge text.love - [28]
BJ5X5O4Alet's prevent the text cursor from ever getting on a drawing - [29]
RSZD5A7Gforgot to add json.lua - [30]
FS2ITYYHrecord a known issue - [31]
VXORMHMEdelete experimental REPL - [32]
2TQUKHBCMerge lines.love - [33]
AF253GHLbugfix - [34]
CE4LZV4Tdrop last couple of manual tests - [35]
A4BSGS2CMerge lines.love - [36]
D2GCFTTTclean up repl functionality - [37]
EX43CDDIMerge text.love - [38]
THRPA4VVMerge text.love - [39]
OWPI7Y4QMerge text.love - [40]
5Y24ZDZIbugfix - [41]
TLOAPLBJadd a license - [42]
UAYCSFSKMerge text.love - [43]
3QNOKBFMbeginnings of a test harness - [44]
L6XA5EY2test: moving a point - [45]
GUOQRUL7Merge lines.love - [46]
ECBDENZ4Merge text.love - [47]
3G723RV5Merge text.love - [48]
TVCPXAAUrename - [49]
U3MJNFUYMerge lines.love - [50]
Y5XAFGMWMerge text.love - [51]
MU2HIRR6Merge lines.love - [52]
Q7XPSKIIMerge lines.love - [53]
LXFHXL2NMerge text.love - [54]
BULPIBEGbeginnings of a module for the text editor - [55]
RXNR3U5EMerge text.love - [56]
5YXILO7XMerge text.love - [57]
4U4VQWNYMerge lines.love - [58]
4YDBYBA4clean up memory leak experiments - [59]
K74U4BAUMerge lines.love - [60]
OTIBCAUJlove2d scaffold - [61]
AVTNUQYRbasic test-enabled framework - [62]
VHUNJHXBMerge lines.love - [63]
66X36NZNa little more prose describing manual_tests - [64]
ORKN6EOBMerge lines.love - [65]
LXTTOB33extract a couple of files - [66]
7VGDIPLCmore robust state validation - [67]
4EGQRXDAbugfix: naming points - [68]
4SR3Z4Y3document the version of LÖVE I've been using - [69]
73OCE2MCafter much struggle, a brute-force undo - [70]
3PSFWAILMerge lines.love - [71]
6LJZN727handle chords - [72]
JOPVPUSAediting source code from within the app
Change contents
- file deletion: drawing_tests.lua drawing_tests.lua
-- create a drawing with a lineApp.screen.init{width=Test_margin_left+256, height=300} -- drawing coordinates 1:1 with pixelsEditor_state = edit.initialize_test_state()Editor_state.filename = 'foo'Editor_state.lines = load_array{'```lines', '```', ''}Text.redraw_all(Editor_state)edit.check_locs(Editor_state)Editor_state.current_drawing_mode = 'line'edit.draw(Editor_state)-- draw a lineedit.run_after_mouse_press(Editor_state, Editor_state.left+5, Editor_state.top+Drawing_padding_top+6, 1)edit.run_after_mouse_release(Editor_state, Editor_state.left+35, Editor_state.top+Drawing_padding_top+36, 1)local drawing = Editor_state.lines[1]check_eq(#drawing.shapes, 1, 'baseline/#shapes')check_eq(#drawing.points, 2, 'baseline/#points')check_eq(drawing.shapes[1].mode, 'line', 'baseline/shape:1')local p1 = drawing.points[drawing.shapes[1].p1]local p2 = drawing.points[drawing.shapes[1].p2]check_eq(p1.x, 5, 'baseline/p1:x')check_eq(p1.y, 6, 'baseline/p1:y')check_eq(p2.x, 35, 'baseline/p2:x')check_eq(p2.y, 36, 'baseline/p2:y')check_nil(p2.name, 'baseline/p2:name')-- enter 'name' mode without moving the mouseedit.run_after_keychord(Editor_state, 'C-n')check_eq(Editor_state.current_drawing_mode, 'name', 'mode:1')endfunction test_move_point()-- create a drawing with a lineApp.screen.init{width=Test_margin_left+256, height=300} -- drawing coordinates 1:1 with pixelsEditor_state = edit.initialize_test_state()Editor_state.filename = 'foo'Editor_state.lines = load_array{'```lines', '```', ''}Text.redraw_all(Editor_state)Editor_state.current_drawing_mode = 'line'edit.draw(Editor_state)edit.run_after_mouse_press(Editor_state, Editor_state.left+5, Editor_state.top+Drawing_padding_top+6, 1)edit.run_after_mouse_release(Editor_state, Editor_state.left+35, Editor_state.top+Drawing_padding_top+36, 1)local drawing = Editor_state.lines[1]check_eq(#drawing.shapes, 1, 'baseline/#shapes')check_eq(#drawing.points, 2, 'baseline/#points')check_eq(drawing.shapes[1].mode, 'line', 'baseline/shape:1')function test_move_point()-- click outside the drawingedit.run_after_mouse_click(Editor_state, App.screen.width-5, App.screen.height-5, 1)-- press a keyedit.run_after_text_input(Editor_state, 'a')-- key goes to textcheck_eq(Editor_state.lines[2].data, 'a')check_eq(#drawing.shapes, 1, 'baseline/#shapes')check_eq(#drawing.points, 2, 'baseline/#points')check_eq(drawing.shapes[1].mode, 'line', 'baseline/shape:1')local p1 = drawing.points[drawing.shapes[1].p1]local p2 = drawing.points[drawing.shapes[1].p2]check_eq(p1.x, 5, 'baseline/p1:x')check_eq(p1.y, 6, 'baseline/p1:y')check_eq(p2.x, 35, 'baseline/p2:x')check_eq(p2.y, 36, 'baseline/p2:y')check_nil(p2.name, 'baseline/p2:name')-- enter 'name' mode without moving the mouseedit.run_after_keychord(Editor_state, 'C-n')check_eq(Editor_state.current_drawing_mode, 'name', 'mode:1')-- hit backspaceedit.run_after_keychord(Editor_state, 'backspace')-- no crashendfunction test_name_point_then_exit_drawing()-- draw a lineedit.run_after_mouse_press(Editor_state, Editor_state.left+5, Editor_state.top+Drawing_padding_top+6, 1)edit.run_after_mouse_release(Editor_state, Editor_state.left+35, Editor_state.top+Drawing_padding_top+36, 1)local drawing = Editor_state.lines[1]function test_name_point_then_hit_backspace()-- create a drawing with a lineApp.screen.init{width=Test_margin_left+256, height=300} -- drawing coordinates 1:1 with pixelsEditor_state = edit.initialize_test_state()Editor_state.filename = 'foo'Editor_state.lines = load_array{'```lines', '```', ''}Text.redraw_all(Editor_state)Editor_state.current_drawing_mode = 'line'edit.draw(Editor_state) - file deletion: source_text.lua source_text.lua
assert(State.lines[State.cursor1.line].mode == 'text')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 - file deletion: source_edit.lua source_edit.lua
if len > 0 thenlocal byte_offset = Text.offset(p.name, len-1)if len == 1 then byte_offset = 0 endp.name = string.sub(p.name, 1, byte_offset)record_undo_event(State, {before=before, after=snapshot(State, State.lines.current_drawing_index)})endendendschedule_save(State)elseif State.lines.current_drawing and State.current_drawing_mode == 'name' thenif chord == 'return' thenState.current_drawing_mode = State.previous_drawing_modeState.previous_drawing_mode = nilelselocal before = snapshot(State, State.lines.current_drawing_index)local drawing = State.lines.current_drawinglocal p = drawing.points[drawing.pending.target_point]if chord == 'escape' thenp.name = nilrecord_undo_event(State, {before=before, after=snapshot(State, State.lines.current_drawing_index)})elseif chord == 'backspace' thenlocal len = utf8.len(p.name)elseif State.lines.current_drawing and State.current_drawing_mode == 'name' thenlocal before = snapshot(State, State.lines.current_drawing_index)local drawing = State.lines.current_drawinglocal p = drawing.points[drawing.pending.target_point]p.name = p.name..trecord_undo_event(State, {before=before, after=snapshot(State, State.lines.current_drawing_index)})--? print('text input', t)if State.search_term thenState.search_term = State.search_term..tState.search_text = nilText.search_next(State)--? print('release', State.cursor1.line)if State.lines.current_drawing then--? print('press', State.cursor1.line)if mouse_press_consumed_by_any_button_handler(State, x,y, mouse_button) then-- press on a button and it returned 'true' to short-circuitreturnendfor line_index,line in ipairs(State.lines) dobutton(State, 'draw', {x=State.left-Margin_left+4, y=y+4, w=12,h=12, color={1,1,0},icon = icon.insert_drawing,onpress1 = function()Drawing.before = snapshot(State, line_index-1, line_index)table.insert(State.lines, line_index, {mode='drawing', y=y, h=256/2, points={}, shapes={}, pending={}})table.insert(State.line_cache, line_index, {})if State.cursor1.line >= line_index thenState.cursor1.line = State.cursor1.line+1endschedule_save(State)record_undo_event(State, {before=Drawing.before, after=snapshot(State, line_index-1, line_index+1)})end,})if loc1.line > #State.lines then return true endlocal l = State.lines[loc1.line]if l.mode ~= 'text' then return false end -- pos is irrelevant to validity for a drawing linereturn loc1.pos > #State.lines[loc1.line].dataendfunction edit.cursor_on_text(State)return State.cursor1.line <= #State.linesand State.lines[State.cursor1.line].mode == 'text'endfunction edit.put_cursor_on_first_text_line(State) - edit in edit.lua at line 94
return loc1.line > #State.linesor loc1.pos > #State.lines[loc1.line].data