XNFTJHC4QSHNSIWNN7K6QZEZ37GTQYKHS4EPNSVPQCUSWREROGIQC BULPIBEGL7TMK6CVIE7IS7WGAHGOSUJBGJSFQK542MOWGHP2ADQQC VHQCNMARPMNBSIUFLJG7HVK4QGDNPCGNVFLHS3I4IGNVSV5MRLYQC NUA5NOPIXGB4YHFM5HR77VBVHRYZV3PPMUXAVMD2QBSBQFYOCN2QC DV4TUFCNOQHI4GBOK3ESTTFU57EY7AC7AJJIEZ6O3JXYD4QHK4AAC NCQ4XLLBCI7XIAVRYLUVPF2IUP3XH75SXDBID4HXYE6NE4GRFNMAC EF6MFB46IJA3TMTGY6DNPFB46RETYX6L2JGX2P567T2XFY47MB3AC VG54CQZTBKBJZYHLWN3O4IJKX67HEDPPPJ75BA2LWZPWVNU6XUXQC KCIM5UTVV4KIL7SNRZFOW6FUQHGWAPOGQO4QTVNIWWBWMVG6GYNQC 6LJZN727CRPYR34LV75CQF55YZI3E7MGESYZSFSYAE73SNEZE3FAC OTIBCAUJ3KDQJLVDN3A536DLZGNRYMGJLORZVR3WLCGXGO6UGO6AC NL5J7Z5H577GPKGNS5TDRVWC55VLA2UCZE34F5WR4AJ5N265UECAC ZOOY3ME4BUD6RLWCKZFA62JNN4BMPOXH24HGTFWPWEKDECOXMFUAC XX7G2FFJ4QCGQGD4REAW5QFHVYAKCFUPGZCK7L6DFGS5ISVBYBQQC H7OEU6WPOKOSKV5RNAM5W62V5SYOY7VEA5VOK6JD5UEBUBIMOKUQC AVQ5MC5DWNLI6LUUIPGBLGP4LKRPGWBY4THNY25OBT2FAVHC6MCAC IYW7X3WLOPYLSNO5IQNSULUNO4XFEM24DJ2VB5HPBUKWUYFPRCGQC VVXVV2D2F5Y6D6N5VVPUPK3N6GMDTG2YCYPQDYTYEKVKBYHRRYEAC MGOQ5XAVFTWZPBG2O5ZTGSEKU6BRJKQZLDV6CM4737VD2FAEB5JQC OFA3PRBSGC7OXHUJGUSEZI73XMVC2HJIO6LG6XYE73DDAJT6KFPAC UTF73CBLAPLW2J6BUF4Q7N2TETQ2IKSUZ4267UG357V4SFXDFUTAC NJ6ZL7PW32GVXUG2IVJCIRRKVBRHFOUACKS7MWXTZ2H464ZQTIHAC 5RTXACUS3HSUZARYN2Z6CC5HFRDN6KF27R7TXTCLAMKS6DS732BAC I7MA5UOOU7MPBQQLOIEPV6J2MKQQ53CRPZ7PFPM75XMMC5JHACNQC 6PUNJS5BSLTYMYMN4JFD7YDEGVQLM5PGAT7PQIG5NIAKLTM5T4PQC 3CS5KKCIZQ6J4SBILINYZSOM6V3U2LE7YIXOZVKXXNBROF6Z6JWAC BJ5X5O4ACBBJ56LRBBSTCW6IBQP4HAEOOOPNH3SKTA4F66YTOIDAC RJGZD4INLQ3IAWLCBYBZQDMP4ICSMZWJX2TRYODDYVUNMGPL6GYAC 3D5RFWHVIHCJGN7HLEP5ZMC6WNIG7GXISJRJXOA4K5MBJFJYPIIQC 62ST7SV3GF5CLNWDRGYGN5BOIUHSMSPH26VIWO3Q2A6P2U7B2TRQC PRPPZGDYFTLRYL4NHUXOXNQKF2LJ4XEOGJDN36DZWBQY6D3K3MGAC V5TP27FPD6GPATHPABRW2FKP7BIKY53KL47UVEU5DF4WXEZF7CKAC FQJ2LBURF7WCHRQH6SQGI6PGH32BAL7FNUTM5MRWM2CBOEUGWU4AC IK3N7J3BCIMTQ5JODRSVHNGZDVW33HAZDYWUQB5KMVFPP4TKNJHQC 7Q4B6M2DAB6FZX6RGA2ZX2UTP6PG2LC745WNPK7ZMEUCSSGXEUQQC D2GCFTTT2RNUBFB243YTA4F2H5ZXFTFHBSKHLZ2CX4JSKRZFTUUQC WDWXNW7VH57W6KXBNXFV6NPIO5RUS7Q6QNGGI4R6HWIRXLYI5NSAC RXE6NQTNS7MFNF24KFEQRVCZFQ44MDO5HPSQGQD555HPEMQA76DAC PLLSUOCI777X65MERQPO5FHR7YJVDLVOX2NGMSCJEFLWIJ5MDEJQC FMQ74DP324YKGBSTNMHBJMT6FYP5NI26MM43VUPGKODI5DVDCUXQC IFGAJAF7UWM236QV4NWP2C67TJPQGXNBC2RTZCOWPJUJYYC2MMXAC 7IKRRESBHMYHHKW4XHUEEKHKPOBLAGZ7A7FJMRU32MTRKIV6S7GQC JCSLDGAH2F6AIY4Z6XM6K4LOMW7EFY3E4NF5YXLMHLTYTX3A4Z3QC HWPK4SMPGZMXWXKCVX667676ZWN5Q2XZSTMVAADG7JNRF6XE45RQC T76KKDWZLQSWMXT2ZE2PPNKBKB4W5M4BW5E6ICHKEBDAUBN6FMZAC 3XD6M3CFKZJR365MHXUWJ4HGSDTPYO6WYZ4RGW7ECBBITKVQX24QC HRWN5V6J6VMXS7WNSRGI7WMUSZ2OI52JJ4IK352VVSDZI4EF5HHQC FBDRL6LHPTBPMU3R356OLY4XE4ELQQEDXMCZGCBT2RFHLR7VQXQAC SNDZOK6QJUASKYLYBHIATA7WXPCPZTEYEWA63I4H7HH3JT3B4U6AC JRLBUB6LR2JIAKVQNKF3T4BDICUIJ3HEMRRHX56YP5M5SP7ZS3WAC JS6JSYOTXVZRN4XN7TYDY4GCNCFQBSERBPXEJ2TR5A2ITA6JJT2QC M36DBSDECWQYCVIPWUYPZXSR547P76RBVYQ63B5KJGVTFWIXCSJQC YKRF5V3ZZQIQ3UGAFYTQT5PUQVHCP2VHFDX77EY2C3X543HUDYKQC LBQAAJN4CGSIEO3L4UNKYTPX6MRLUJYHCMRMFTFLLTTAGCRUSE7QC BLWAYPKV3MLDZ4ALXLUJ25AIR6PCIL4RFYNRYLB26GFVC2KQBYBAC endendfunction love.textinput(t)if love.mouse.isDown('1') then return endif Lines[Cursor_line].mode == 'drawing' then return endlocal byte_offsetif Cursor_pos > 1 thenbyte_offset = utf8.offset(Lines[Cursor_line].data, Cursor_pos-1)elsebyte_offset = 0endLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_offset)..t..string.sub(Lines[Cursor_line].data, byte_offset+1)Cursor_pos = Cursor_pos+1save_to_disk(Lines, Filename)end-- Don't handle any keys here that would trigger love.textinput above.function Text.keychord_pressed(chord)if chord == 'return' thenlocal byte_offset = utf8.offset(Lines[Cursor_line].data, Cursor_pos)table.insert(Lines, Cursor_line+1, {mode='text', data=string.sub(Lines[Cursor_line].data, byte_offset)})Lines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_offset-1)Cursor_line = Cursor_line+1Cursor_pos = 1save_to_disk(Lines, Filename)elseif chord == 'left' thenassert(Lines[Cursor_line].mode == 'text')if Cursor_pos > 1 thenCursor_pos = Cursor_pos-1elselocal new_cursor_line = Cursor_linewhile new_cursor_line > 1 donew_cursor_line = new_cursor_line-1if Lines[new_cursor_line].mode == 'text' thenCursor_line = new_cursor_lineCursor_pos = #Lines[Cursor_line].data+1breakendendendelseif chord == 'right' thenassert(Lines[Cursor_line].mode == 'text')if Cursor_pos <= #Lines[Cursor_line].data thenCursor_pos = Cursor_pos+1elselocal new_cursor_line = Cursor_linewhile new_cursor_line <= #Lines-1 donew_cursor_line = new_cursor_line+1if Lines[new_cursor_line].mode == 'text' thenCursor_line = new_cursor_lineCursor_pos = 1breakendendendelseif chord == 'home' thenCursor_pos = 1elseif chord == 'end' thenCursor_pos = #Lines[Cursor_line].data+1elseif chord == 'backspace' thenif Cursor_pos > 1 thenlocal byte_start = utf8.offset(Lines[Cursor_line].data, Cursor_pos-1)local byte_end = utf8.offset(Lines[Cursor_line].data, Cursor_pos)if byte_start thenif byte_end thenLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_start-1)..string.sub(Lines[Cursor_line].data, byte_end)elseLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_start-1)endCursor_pos = Cursor_pos-1endelseif Cursor_line > 1 thenif Lines[Cursor_line-1].mode == 'drawing' thentable.remove(Lines, Cursor_line-1)else-- join linesCursor_pos = utf8.len(Lines[Cursor_line-1].data)+1Lines[Cursor_line-1].data = Lines[Cursor_line-1].data..Lines[Cursor_line].datatable.remove(Lines, Cursor_line)endCursor_line = Cursor_line-1endsave_to_disk(Lines, Filename)elseif chord == 'delete' thenif Cursor_pos <= #Lines[Cursor_line].data thenlocal byte_start = utf8.offset(Lines[Cursor_line].data, Cursor_pos)local byte_end = utf8.offset(Lines[Cursor_line].data, Cursor_pos+1)if byte_start thenif byte_end thenLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_start-1)..string.sub(Lines[Cursor_line].data, byte_end)elseLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_start-1)end-- no change to Cursor_posendelseif Cursor_line < #Lines thenif Lines[Cursor_line+1].mode == 'drawing' thentable.remove(Lines, Cursor_line+1)else-- join linesLines[Cursor_line].data = Lines[Cursor_line].data..Lines[Cursor_line+1].datatable.remove(Lines, Cursor_line+1)endendsave_to_disk(Lines, Filename)elseif chord == 'up' thenassert(Lines[Cursor_line].mode == 'text')local new_cursor_line = Cursor_linewhile new_cursor_line > 1 donew_cursor_line = new_cursor_line-1if Lines[new_cursor_line].mode == 'text' thenlocal old_x = Text.cursor_x(Lines[new_cursor_line].data, Cursor_pos)Cursor_line = new_cursor_lineCursor_pos = Text.nearest_cursor_pos(Lines[Cursor_line].data, old_x, Cursor_pos)breakendendelseif chord == 'down' thenassert(Lines[Cursor_line].mode == 'text')local new_cursor_line = Cursor_linewhile new_cursor_line < #Lines donew_cursor_line = new_cursor_line+1if Lines[new_cursor_line].mode == 'text' thenlocal old_x = Text.cursor_x(Lines[new_cursor_line].data, Cursor_pos)Cursor_line = new_cursor_lineCursor_pos = Text.nearest_cursor_pos(Lines[Cursor_line].data, old_x, Cursor_pos)breakendend
function love.textinput(t)if love.mouse.isDown('1') then return endif Lines[Cursor_line].mode == 'drawing' then return endlocal byte_offsetif Cursor_pos > 1 thenbyte_offset = utf8.offset(Lines[Cursor_line].data, Cursor_pos-1)elsebyte_offset = 0endLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_offset)..t..string.sub(Lines[Cursor_line].data, byte_offset+1)Cursor_pos = Cursor_pos+1save_to_disk(Lines, Filename)end
-- Don't handle any keys here that would trigger love.textinput above.-- shortcuts for textif chord == 'return' thenlocal byte_offset = utf8.offset(Lines[Cursor_line].data, Cursor_pos)table.insert(Lines, Cursor_line+1, {mode='text', data=string.sub(Lines[Cursor_line].data, byte_offset)})Lines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_offset-1)Cursor_line = Cursor_line+1Cursor_pos = 1save_to_disk(Lines, Filename)elseif chord == 'left' thenassert(Lines[Cursor_line].mode == 'text')if Cursor_pos > 1 thenCursor_pos = Cursor_pos-1elselocal new_cursor_line = Cursor_linewhile new_cursor_line > 1 donew_cursor_line = new_cursor_line-1if Lines[new_cursor_line].mode == 'text' thenCursor_line = new_cursor_lineCursor_pos = #Lines[Cursor_line].data+1breakendendendelseif chord == 'right' thenassert(Lines[Cursor_line].mode == 'text')if Cursor_pos <= #Lines[Cursor_line].data thenCursor_pos = Cursor_pos+1elselocal new_cursor_line = Cursor_linewhile new_cursor_line <= #Lines-1 donew_cursor_line = new_cursor_line+1if Lines[new_cursor_line].mode == 'text' thenCursor_line = new_cursor_lineCursor_pos = 1breakendendendelseif chord == 'home' thenCursor_pos = 1elseif chord == 'end' thenCursor_pos = #Lines[Cursor_line].data+1-- transitioning between drawings and textelseif chord == 'backspace' thenif Cursor_pos > 1 thenlocal byte_start = utf8.offset(Lines[Cursor_line].data, Cursor_pos-1)local byte_end = utf8.offset(Lines[Cursor_line].data, Cursor_pos)if byte_start thenif byte_end thenLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_start-1)..string.sub(Lines[Cursor_line].data, byte_end)elseLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_start-1)endCursor_pos = Cursor_pos-1endelseif Cursor_line > 1 thenif Lines[Cursor_line-1].mode == 'drawing' thentable.remove(Lines, Cursor_line-1)else-- join linesCursor_pos = utf8.len(Lines[Cursor_line-1].data)+1Lines[Cursor_line-1].data = Lines[Cursor_line-1].data..Lines[Cursor_line].datatable.remove(Lines, Cursor_line)endCursor_line = Cursor_line-1endsave_to_disk(Lines, Filename)elseif chord == 'delete' thenif Cursor_pos <= #Lines[Cursor_line].data thenlocal byte_start = utf8.offset(Lines[Cursor_line].data, Cursor_pos)local byte_end = utf8.offset(Lines[Cursor_line].data, Cursor_pos+1)if byte_start thenif byte_end thenLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_start-1)..string.sub(Lines[Cursor_line].data, byte_end)elseLines[Cursor_line].data = string.sub(Lines[Cursor_line].data, 1, byte_start-1)end-- no change to Cursor_posendelseif Cursor_line < #Lines thenif Lines[Cursor_line+1].mode == 'drawing' thentable.remove(Lines, Cursor_line+1)else-- join linesLines[Cursor_line].data = Lines[Cursor_line].data..Lines[Cursor_line+1].datatable.remove(Lines, Cursor_line+1)endendsave_to_disk(Lines, Filename)elseif chord == 'up' thenassert(Lines[Cursor_line].mode == 'text')local new_cursor_line = Cursor_linewhile new_cursor_line > 1 donew_cursor_line = new_cursor_line-1if Lines[new_cursor_line].mode == 'text' thenlocal old_x = Text.cursor_x(Lines[new_cursor_line].data, Cursor_pos)Cursor_line = new_cursor_lineCursor_pos = Text.nearest_cursor_pos(Lines[Cursor_line].data, old_x, Cursor_pos)breakendendelseif chord == 'down' thenassert(Lines[Cursor_line].mode == 'text')local new_cursor_line = Cursor_linewhile new_cursor_line < #Lines donew_cursor_line = new_cursor_line+1if Lines[new_cursor_line].mode == 'text' thenlocal old_x = Text.cursor_x(Lines[new_cursor_line].data, Cursor_pos)Cursor_line = new_cursor_lineCursor_pos = Text.nearest_cursor_pos(Lines[Cursor_line].data, old_x, Cursor_pos)breakendendelseif chord == 'C-=' thenDrawing_width = Drawing_width/ZoomZoom = Zoom+0.5Drawing_width = Drawing_width*Zoomelseif chord == 'C--' thenDrawing_width = Drawing_width/ZoomZoom = Zoom-0.5Drawing_width = Drawing_width*Zoomelseif chord == 'C-0' thenDrawing_width = Drawing_width/ZoomZoom = 1.5Drawing_width = Drawing_width*Zoom-- shortcuts for drawingselseif chord == 'escape' and love.mouse.isDown('1') thenlocal drawing = Drawing.current_drawing()drawing.pending = {}elseif chord == 'C-f' and not love.mouse.isDown('1') thenCurrent_drawing_mode = 'freehand'elseif chord == 'C-g' and not love.mouse.isDown('1') thenCurrent_drawing_mode = 'polygon'elseif love.mouse.isDown('1') and chord == 'g' thenCurrent_drawing_mode = 'polygon'local drawing = Drawing.current_drawing()if drawing.pending.mode == 'freehand' thendrawing.pending.vertices = {Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)}elseif drawing.pending.mode == 'line' or drawing.pending.mode == 'manhattan' thenif drawing.pending.vertices == nil thendrawing.pending.vertices = {drawing.pending.p1}endelseif drawing.pending.mode == 'circle' or drawing.pending.mode == 'arc' thendrawing.pending.vertices = {drawing.pending.center}enddrawing.pending.mode = 'polygon'elseif love.mouse.isDown('1') and chord == 'p' and Current_drawing_mode == 'polygon' thenlocal drawing = Drawing.current_drawing()local mx,my = Drawing.coord(love.mouse.getX()-16), Drawing.coord(love.mouse.getY()-drawing.y)local j = Drawing.insert_point(drawing.points, mx,my)table.insert(drawing.pending.vertices, j)elseif chord == 'C-c' and not love.mouse.isDown('1') thenCurrent_drawing_mode = 'circle'elseif love.mouse.isDown('1') and chord == 'a' and Current_drawing_mode == 'circle' thenlocal drawing = Drawing.current_drawing()drawing.pending.mode = 'arc'local mx,my = Drawing.coord(love.mouse.getX()-16), Drawing.coord(love.mouse.getY()-drawing.y)local j = Drawing.insert_point(drawing.points, mx,my)local center = drawing.points[drawing.pending.center]drawing.pending.radius = math.dist(center.x,center.y, mx,my)drawing.pending.start_angle = geom.angle(center.x,center.y, mx,my)elseif love.mouse.isDown('1') and chord == 'c' thenCurrent_drawing_mode = 'circle'local drawing = Drawing.current_drawing()if drawing.pending.mode == 'freehand' thendrawing.pending.center = Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)elseif drawing.pending.mode == 'line' or drawing.pending.mode == 'manhattan' thendrawing.pending.center = drawing.pending.p1elseif drawing.pending.mode == 'polygon' thendrawing.pending.center = drawing.pending.vertices[1]enddrawing.pending.mode = 'circle'elseif love.mouse.isDown('1') and chord == 'l' thenCurrent_drawing_mode = 'line'local drawing = Drawing.current_drawing()if drawing.pending.mode == 'freehand' thendrawing.pending.p1 = Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)elseif drawing.pending.mode == 'circle' or drawing.pending.mode == 'arc' thendrawing.pending.p1 = drawing.pending.centerelseif drawing.pending.mode == 'polygon' thendrawing.pending.p1 = drawing.pending.vertices[1]enddrawing.pending.mode = 'line'elseif chord == 'C-l' thenCurrent_drawing_mode = 'line'local drawing,_,shape = Drawing.select_shape_at_mouse()if drawing thenconvert_line(drawing, shape)endelseif love.mouse.isDown('1') and chord == 'm' thenCurrent_drawing_mode = 'manhattan'local drawing = Drawing.select_drawing_at_mouse()if drawing.pending.mode == 'freehand' thendrawing.pending.p1 = Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)elseif drawing.pending.mode == 'line' then-- do nothingelseif drawing.pending.mode == 'polygon' thendrawing.pending.p1 = drawing.pending.vertices[1]elseif drawing.pending.mode == 'circle' or drawing.pending.mode == 'arc' thendrawing.pending.p1 = drawing.pending.centerenddrawing.pending.mode = 'manhattan'elseif chord == 'C-m' and not love.mouse.isDown('1') thenCurrent_drawing_mode = 'manhattan'local drawing,_,shape = Drawing.select_shape_at_mouse()if drawing thenconvert_horvert(drawing, shape)endelseif chord == 'C-s' and not love.mouse.isDown('1') thenlocal drawing,_,shape = Drawing.select_shape_at_mouse()if drawing thensmoothen(shape)endelseif chord == 'C-v' and not love.mouse.isDown('1') thenlocal drawing,_,p = Drawing.select_point_at_mouse()if drawing thenPrevious_drawing_mode = Current_drawing_modeCurrent_drawing_mode = 'move'drawing.pending = {mode=Current_drawing_mode, target_point=p}Lines.current = drawingendelseif love.mouse.isDown('1') and chord == 'v' thenlocal drawing,_,p = Drawing.select_point_at_mouse()if drawing thenPrevious_drawing_mode = Current_drawing_modeCurrent_drawing_mode = 'move'drawing.pending = {mode=Current_drawing_mode, target_point=p}Lines.current = drawingendelseif chord == 'C-d' and not love.mouse.isDown('1') thenlocal drawing,i,p = Drawing.select_point_at_mouse()if drawing thenfor _,shape in ipairs(drawing.shapes) doif Drawing.contains_point(shape, i) thenif shape.mode == 'polygon' thenlocal idx = table.find(shape.vertices, i)assert(idx)table.remove(shape.vertices, idx)if #shape.vertices < 3 thenshape.mode = 'deleted'endelseshape.mode = 'deleted'endendenddrawing.points[i].deleted = trueendlocal drawing,_,shape = Drawing.select_shape_at_mouse()if drawing thenshape.mode = 'deleted'endelseif chord == 'C-h' and not love.mouse.isDown('1') thenlocal drawing = Drawing.select_drawing_at_mouse()if drawing thendrawing.show_help = trueendelseif chord == 'escape' and not love.mouse.isDown('1') thenfor _,line in ipairs(Lines) doif line.mode == 'drawing' thenline.show_help = falseendend
if love.mouse.isDown('1') or chord:sub(1,2) == 'C-' thenDrawing.keychord_pressed(chord)elseText.keychord_pressed(chord)
function Drawing.keychord_pressed(chord)if chord == 'C-=' thenDrawing_width = Drawing_width/ZoomZoom = Zoom+0.5Drawing_width = Drawing_width*Zoomelseif chord == 'C--' thenDrawing_width = Drawing_width/ZoomZoom = Zoom-0.5Drawing_width = Drawing_width*Zoomelseif chord == 'C-0' thenDrawing_width = Drawing_width/ZoomZoom = 1.5Drawing_width = Drawing_width*Zoomelseif chord == 'escape' and love.mouse.isDown('1') thenlocal drawing = Drawing.current_drawing()drawing.pending = {}elseif chord == 'C-f' and not love.mouse.isDown('1') thenCurrent_drawing_mode = 'freehand'elseif chord == 'C-g' and not love.mouse.isDown('1') thenCurrent_drawing_mode = 'polygon'elseif love.mouse.isDown('1') and chord == 'g' thenCurrent_drawing_mode = 'polygon'local drawing = Drawing.current_drawing()if drawing.pending.mode == 'freehand' thendrawing.pending.vertices = {Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)}elseif drawing.pending.mode == 'line' or drawing.pending.mode == 'manhattan' thenif drawing.pending.vertices == nil thendrawing.pending.vertices = {drawing.pending.p1}endelseif drawing.pending.mode == 'circle' or drawing.pending.mode == 'arc' thendrawing.pending.vertices = {drawing.pending.center}enddrawing.pending.mode = 'polygon'elseif love.mouse.isDown('1') and chord == 'p' and Current_drawing_mode == 'polygon' thenlocal drawing = Drawing.current_drawing()local mx,my = Drawing.coord(love.mouse.getX()-16), Drawing.coord(love.mouse.getY()-drawing.y)local j = Drawing.insert_point(drawing.points, mx,my)table.insert(drawing.pending.vertices, j)elseif chord == 'C-c' and not love.mouse.isDown('1') thenCurrent_drawing_mode = 'circle'elseif love.mouse.isDown('1') and chord == 'a' and Current_drawing_mode == 'circle' thenlocal drawing = Drawing.current_drawing()drawing.pending.mode = 'arc'local mx,my = Drawing.coord(love.mouse.getX()-16), Drawing.coord(love.mouse.getY()-drawing.y)local j = Drawing.insert_point(drawing.points, mx,my)local center = drawing.points[drawing.pending.center]drawing.pending.radius = geom.dist(center.x,center.y, mx,my)drawing.pending.start_angle = geom.angle(center.x,center.y, mx,my)elseif love.mouse.isDown('1') and chord == 'c' thenCurrent_drawing_mode = 'circle'local drawing = Drawing.current_drawing()if drawing.pending.mode == 'freehand' thendrawing.pending.center = Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)elseif drawing.pending.mode == 'line' or drawing.pending.mode == 'manhattan' thendrawing.pending.center = drawing.pending.p1elseif drawing.pending.mode == 'polygon' thendrawing.pending.center = drawing.pending.vertices[1]enddrawing.pending.mode = 'circle'elseif love.mouse.isDown('1') and chord == 'l' thenCurrent_drawing_mode = 'line'local drawing = Drawing.current_drawing()if drawing.pending.mode == 'freehand' thendrawing.pending.p1 = Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)elseif drawing.pending.mode == 'circle' or drawing.pending.mode == 'arc' thendrawing.pending.p1 = drawing.pending.centerelseif drawing.pending.mode == 'polygon' thendrawing.pending.p1 = drawing.pending.vertices[1]enddrawing.pending.mode = 'line'elseif chord == 'C-l' thenCurrent_drawing_mode = 'line'local drawing,_,shape = Drawing.select_shape_at_mouse()if drawing thenconvert_line(drawing, shape)endelseif love.mouse.isDown('1') and chord == 'm' thenCurrent_drawing_mode = 'manhattan'local drawing = Drawing.select_drawing_at_mouse()if drawing.pending.mode == 'freehand' thendrawing.pending.p1 = Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)elseif drawing.pending.mode == 'line' then-- do nothingelseif drawing.pending.mode == 'polygon' thendrawing.pending.p1 = drawing.pending.vertices[1]elseif drawing.pending.mode == 'circle' or drawing.pending.mode == 'arc' thendrawing.pending.p1 = drawing.pending.centerenddrawing.pending.mode = 'manhattan'elseif chord == 'C-m' and not love.mouse.isDown('1') thenCurrent_drawing_mode = 'manhattan'local drawing,_,shape = Drawing.select_shape_at_mouse()if drawing thenconvert_horvert(drawing, shape)endelseif chord == 'C-s' and not love.mouse.isDown('1') thenlocal drawing,_,shape = Drawing.select_shape_at_mouse()if drawing thensmoothen(shape)endelseif chord == 'C-v' and not love.mouse.isDown('1') thenlocal drawing,_,p = Drawing.select_point_at_mouse()if drawing thenPrevious_drawing_mode = Current_drawing_modeCurrent_drawing_mode = 'move'drawing.pending = {mode=Current_drawing_mode, target_point=p}Lines.current = drawingendelseif love.mouse.isDown('1') and chord == 'v' thenlocal drawing,_,p = Drawing.select_point_at_mouse()if drawing thenPrevious_drawing_mode = Current_drawing_modeCurrent_drawing_mode = 'move'drawing.pending = {mode=Current_drawing_mode, target_point=p}Lines.current = drawingendelseif chord == 'C-d' and not love.mouse.isDown('1') thenlocal drawing,i,p = Drawing.select_point_at_mouse()if drawing thenfor _,shape in ipairs(drawing.shapes) doif Drawing.contains_point(shape, i) thenif shape.mode == 'polygon' thenlocal idx = table.find(shape.vertices, i)assert(idx)table.remove(shape.vertices, idx)if #shape.vertices < 3 thenshape.mode = 'deleted'endelseshape.mode = 'deleted'endendenddrawing.points[i].deleted = trueendlocal drawing,_,shape = Drawing.select_shape_at_mouse()if drawing thenshape.mode = 'deleted'endelseif chord == 'C-h' and not love.mouse.isDown('1') thenlocal drawing = Drawing.select_drawing_at_mouse()if drawing thendrawing.show_help = trueendelseif chord == 'escape' and not love.mouse.isDown('1') thenfor _,line in ipairs(Lines) doif line.mode == 'drawing' thenline.show_help = falseendendendend