7CEOB56DPV2VOG6BCO4YRGTDD3KOHVPAXBAUHO22747DRBKR2ZBQC XHGO5TGM6BP3FWEPH2NJHHDNX62UXZBTA6H6ORRLJJ6WHPTGIJDAC DR5XD5JQ7RICJ7HX3W3BYXO2V2KYLJVLIKJRCEYUXBO4Q2NL54QQC CTK7YUFZFOV53EDPU2OJ7PV4TKORDXRVYTYF3FMQGKIT2HQCN2AQC 7TGTAVEES2NXJIAMYH4ZQB3TIRVECGYDBCOWI3ZNOKDCQVEHFK3QC BADSSEFMUZYAIPC54CCOFXWSJOTAHBYDXRKODPSGXEWSFHCFBWCAC UUTYRLLEVNKAAWIPUYPZASYV4HFFNQ6LIVY7LALTRGNHA2DDOKEQC MXA3RZYKUI4UF2ISY7JEF6VKX6NOPZMZH5SLLCZHRJKFIXXXDPSAC P5QNVXSNGPUYFDBHK6KJMFDVG6U6S5Q3KRQICGK7AZ7FKZE7OJJQC R5QXEHUIZLELJGGCZAE7ATNS3CLRJ7JFRENMGH4XXH24C5WABZDQC CE4LZV4TNXJT54CVGM3QANCBP42TMLMZWF2DBSMUYKAHILXIZEMQC VUVH2XLFK4225ZWM7V2JFLKO6HZYM5C6IS36DOCARRXWATKXPBEQC YT5P6TO64XSMCZGTT4SVNFOWUN5ECNXTWCMFXN3YCDZUNH4H3IFAC LF7BWEG4DKQI7NMXMZC4LC2BE5PB42HK5PD6OYBNIDMAZBJASOKQC PTDO2SOTXEI6FROZ2AVRFXSKKNKCRMPPTQSI5LWD45UVGDJPMSGQC BPWFKBXTKIRBJFWVZIUVCHGJTLBCR6EIMEHM3D3KOF5IULXCR5RQC UHB4GARJI5AB5UCDCZRFSCJNXGJSLU5DYGUGX5ITYEXI7Q43Z4CAC 4VKEE43Z7MUPNIAOCK36INVBNHRTSWRRN37TIKRPXPH3DRKGHHAQC CZB4CK2RB6LQOHUIHCFUGGSNGPRIASYBXX64UEQ3SKLI3TWIA5BQC LXTTOB33N2HCUZFIUDRQGGBVHK2HODRG4NBLH6RXRQZDCHF27BSAC PNGWLAFNM2OM2ZEYNS64WBVG5ZMWYY5JSDV6JIUZAEK4WDR4JJQQC IWYLK45KJSPRXKW55OD4GEPMLTYMMTXNFJJU26JTZN3RE35DWSCQC OEUU62GMV5NDJTICRKJSGKG3TO5DJIPY6CQZNNP53MK737X3KG6QC 5DOTWNVMOGN75GJMXXB4A56UAJYSNYC5WXPRT7QFMAAV27NWPP3AC 2JLVAYHBQGIYFYLPYP5MC7V3DGTSUKLKTFSAIDG4XZFWVDU33SNQC M6TH7VSZQGKDB7SFNN5K52WWAX5VTVNT6GOKNKTXPVZBT6NEYDOQC APYPFFS3G6TDEUMIHQGMDBJNRNDTCNTPKI5M2AFACJ73P725XQRQC 27DROQW2CHKBMWQCCR7N7VK54P3HE7MESZIJSJ32JTPKEE23WJPAC 3TDOZESEOYHGF6LYKR6PYSPNFI3QUGED2BKM5LUDEKJKRIX3ACEAC EQP53UQV3YCW43IDOGQSGA6YTPNRTLCMGHSHUBDZNHNSWLX5WO7AC BULPIBEGL7TMK6CVIE7IS7WGAHGOSUJBGJSFQK542MOWGHP2ADQQC MTJEVRJR5GLWUSK7HMIM4UXM6GS6O6YCRWJT3DUSU2RYMHCQNOEQC IRCKL6VNSFB7TQEKPQUPJCN37N5QW7D54DSZMESVXGK7NEHGSIPAC AYE2VEGJ63AWWX76SFQZLOTBIZOQRWBG4AZMIOSVOI2WZVRQJXYAC XNFTJHC4QSHNSIWNN7K6QZEZ37GTQYKHS4EPNSVPQCUSWREROGIQC SPSW74Y5OJ54Y7VQ3SJFCJR5CYDKTR4A3TOEVZODDZLUSDDU2GZAC DHI6IJCNSTHGED67T6H5X6Y636C7PIDGIJD32HBEKLT5WIMRS5MAC S2MISTTMPEULTO6WRO4Q4NRUO7XC2PTZW3UBR7K7SO6JPZO6HBHAC ZPUQSPQPQFVRUIHGLAWW3IDBYODIWDHO62HAC3WWF5TM3CIJGHNQC YW2GO3U4JZBBIVZIK3ZVHM7SDDZU3X65VSZOLMWD7TGVPEFJSUYAC V3EABA35RWCOOU5OMIYRWXAKZOLHO4XPGTPOKY24RR2LOAD7ZQAQC 2LC3BM2NCIR76UILI5D4DVC5KYJSBVHDNMOC5G3TOJNCRLX6PZEQC 2CH77LZCSHAKRKLCCJGDGECVYFNCEV23NF3PFXHAQ2E33AJGSNVAC QCPXQ2E3USF3Z6R6WJ2JKHTRMPKA6QWXFKKRMLXA3MXABJEL543AC 7M5PGWKUXWBSSBTCGUT7KKMDQW6IDQMSLTQHQO37V45PG65XLQMQC JCSLDGAH2F6AIY4Z6XM6K4LOMW7EFY3E4NF5YXLMHLTYTX3A4Z3QC WDMPH4ANFQ4YDIBCKDE5ZSRRNIJFBR5W5CH4VYYFKWS5Q63KHLFAC OTIBCAUJ3KDQJLVDN3A536DLZGNRYMGJLORZVR3WLCGXGO6UGO6AC 2L5MEZV344TOZLVY3432RHJFIRVXFD6O3GWLL5O4CV66BGAFTURQC QW5KQQTDX5SRZI6EUHDZNQZMCTMEMBJHWQI4KGCLZG7SHLXMLKGAC VHQCNMARPMNBSIUFLJG7HVK4QGDNPCGNVFLHS3I4IGNVSV5MRLYQC DDXXXXBRUH4UHHPOLAK2IG45C4QAPGSR4MTLV3MVFV3EMND43DIAC PGZJ6NATSMW4XH64XEPE5Q2EEYCMAMQIIP2OZXPNJ527234QPKMQC K464QQR4FTXFUMHFWAGOD5DJ6YHUBUKRHLXF2ORE74DVT7TVQ35QC NP7PIUBTR4K6SWJS46YZG3H2RYYNRGNEJMPV4I24TQXT5O3YT27QC J2SVGR2EQEROXDDMYZOCELD2VDYQALGZYRSZ4WGMTACAGMRPJ7UAC NFCBIEZD5DPQE57TKEMBQCQY4L7R5QSTUPBBITXGREWZB5XBHC3QC WOXIYUTL4NU7ACHQYXEXJDSXCRDLQ2X457KO6C7GEXFQZ43F3L7QC RF5ALVNYB2FMU7LRRD5LMQC7P6OO4BX3NXIGWNZTQ2CD62RBRRFAC AJB4LFRBMIRBEDWJ3OW7GQIMD2BZBVQ62GH4TE2FISWZKSAHRF4QC 2H67P75X7FSSNZMV4TU5I46XLIYAJ5VT7H6MS7GYLUSNTA4IRDFQC LFMI3D7D236VAARLPOF3OKWMFVL7KSCVEUBNGJKVOE75ST3AKZSQC 6J3NXBYGADKVHD53QKHUZNRO2B52DC66Y6GQT5KEH6YKVYNCCRTAC NQKFQSZEFIQTIJXEJ64KX46JXLWUUFXVRTQCPM7HF4DUHT2QHZAAC RT6EV6OPUYCXYZOX2PHFXJ7KT77KHNEVINEGQXIQLHQVKPGTN6VQC KVHUFUFVOSY6GB4XI2QK4T4WCLIYOV3NZR67TX6AQHAQDWJMEOBQC PX7DDEMOBGPVK3FXKK5XEPG24CJXZSVW67DLG2JZZ5E77NVEAA3AC LNUHQOGHIOFGJXNGA3DZLYEASLYYDGLN2I3EDZY5ANASQAHCG3YQC XX7G2FFJ4QCGQGD4REAW5QFHVYAKCFUPGZCK7L6DFGS5ISVBYBQQC 23DEB6JLDWF7RH65IRVW2F6ZPR2XCYCR3NZCTSEVG4AACSWJWWJQC AM42E4Y6RLS7QPWBMESL6H5RPFKG5LQYM6EFNB5UYSRSUASKLISQC VIU2FBNVHG5FV5AJLVPMGEUO5HCLJEGZTRWNY2C5XC4AKMQZZKVAC 7M7LS7I2QT6AFZ6RVK5KK2CZ6SNJAMQIWD7MX34F7MQ3MZKH72GAC S7ZZA3YEKYGLBN6UC2N7WGUS43L6MX2KQQ2LBUZT4FQ7K7V5IQGQC 4447N732DNCNIMDDBCOQN2LUUQ6LILPXTUBHVUK42UX34VEC3B6QC DWZK32YDFQIUYR4LDUUFLOPJMUVJMFDP2RKW2L3QFAGUHAWPJU2AC 2ENZW7TVCS47BWCA4AIEVGKGMT4Y2TSM5IJ7O5K2VSWNXIN3SG4QC NX3DDSCZM23ONUBXATHBM2DM3RL7YO7LDPXLI2UA6GQU2G3DKOTQC BYG5CEMVXANDTBI2ORNVMEY6K3EBRIHZHS4QBK27VONJC5537COQC Z4XRNDTRTGSZHNB65WNHOVUBFW4QWQABLVSK4RM3QJHGK33DMRJAC NQWWTGXRLSBASOSP75FPOSVYP664VYRFQH7MY5LALLIP2VEBQMCQC IDG26SXKRKPRUQM3G2MMBQR3UZGNU7NCWJBBDKKIM5IGUNJQ2URQC JRLBUB6LR2JIAKVQNKF3T4BDICUIJ3HEMRRHX56YP5M5SP7ZS3WAC SGMDI4TCL375Y5ADXK6KDMWADDRXHZMCJ42PBMMW3RLMNDABEPUQC HOSPP2ANSW654DYRTC6CQUQA2GUKV6T2FI7QBKXD2DZS3R32IMGAC P4376EXKQXGN6KUOKIZDSGN65J5C33XVX3RDXHYVOOTG7P2ISZWQC NONKKVVPSOFWX3FTCBAI6JC67GK7AVJH4PAHBFPCZQLR3DVLJ2HAC WTDKUACNTWB4KD34TZZNPILNX4FQ6MR64XYBAA5GOMICF73WLIAAC OLZRJ4AXIXZHJSCTMH365Z6HPE26UAVSXPSFAPASZPPHT44VYL4AC 4KC7I3E2DIKLIP7LQRKB5WFA2Z5XZXAU46RFHNFQU5BVEJPDX6UQC KTZQ57HVZU4XGWRPXBA27G4GXZFV74YYKJRXCJCE7UKDS7NGJVBAC GXEM6FP6K3F2ICW4ZOTKRZ6FA4HL6EVCIAGW7PIVEFP4PPHZOKOQC BERHYBXMPLRJKHXKCHGIMURTVGGE2FLF5JZPWR5WBVEF44DISIHQC GY6LTMIJSZCHAPP4BFD36DOXCCOF25YWYV6CO7YFUAXQOJRETOLAC 4CTZOJPCTWYUSHLIZZJ2M5W7S4JZFZVT5MUU5XNSOIBS5L4UY5UQC K2X6G75Z6XBC4DVIRWC5HC7XA3A2SKOM3MWSQTCFEYWIJL7LME2QC IPW5MN2Q7ZAKHNKC6ISJMLJUUMR5UP6KS4XUWYWPEFXXBWE2LX2AC OWK3U6VDHPZM6Q6MB7PVFZPDD2KD5NJ3WHVMGTQ2XGUNYDNWSPWAC W7JMT5V2ELDFZG354LUL5AR6IQLIYQUDXBEPDNZ2BEBXDCZLQJTAC KAUD3YIKPOXHIUZVR3VCIQHQGBPWTBHXEXC3VQIPAN2BAV6SEMIQC BLWAYPKV3MLDZ4ALXLUJ25AIR6PCIL4RFYNRYLB26GFVC2KQBYBAC NYQ7HD4D5L44UORK52TH7CAEXYN5CE4ZUVLCWMY6XXPYHXVBTGHAC HYEAFRZ2UEKDYTAE2GDQLHEJBPQASP2NDLMXB7F6MTVK2BKOXKEAC DLQAEAC76KLM3KZXQ2C5DASP4IBS64GR6L7QYEP67CNXJ6LRL7LQC 4PHDQ5L5N644QYM73IXMNCLAKQELYEPBDFXHTGCTTAKJAR6PEMTAC QXVD2RIFQPTO3H6J3IJHRHRDRBW6C6MLUWMCEDQ6Z75SW2TMRBIQC DRFE3B3ZKRG4RY2R5Q3SDFD3LH4EXUX3CZCDFBNAXVI2SLDS57PAC IHHNPJ5QIEYWJTC34GSVWJ7KSHAEO7RQCQULTA7MA5RUMQ2GVOZQC NVSWVPW5IGHXNRE2OMV4OEWRFJA25DP37CRFPZEVWAZINWGCCVXAC 23MA4T3GWPOLM5S6JCNQJU2SRT7VQGYZ2JZJN26KA5MKI4LOCC4QC 3HVBAZPADERJZTVHKZWOBNGDWYPJKPOEDZCCI6TLAFU4BFEKFOKAC SRVDX4I5QKWAH3Y5DX25PG34U7NY55H46ZYG2APH47BUZT3EJ2HAC Editor_state.lines = load_array{'abc', 'def'}Editor_state.filename = 'foo'schedule_save(Editor_state)-- now drag a new file bar from the filesystemApp.filesystem['bar'] = 'abc\ndef\nghi\n'local fake_dropped_file = {opened = false,getFilename = function(self)return 'bar'end,open = function(self)self.opened = trueend,lines = function(self)assert(self.opened)return App.filesystem['bar']:gmatch('[^\n]+')end,close = function(self)self.opened = falseend,}App.filedropped(fake_dropped_file)-- filesystem now contains a file called foocheck_eq(App.filesystem['foo'], 'abc\ndef\n', 'F - test_drop_file_saves_previous')check_eq(#Editor_state.lines, 3, 'F - test_drop_file/#lines')check_eq(Editor_state.lines[1].data, 'abc', 'F - test_drop_file/lines:1')check_eq(Editor_state.lines[2].data, 'def', 'F - test_drop_file/lines:2')check_eq(Editor_state.lines[3].data, 'ghi', 'F - test_drop_file/lines:3')App.screen.init{width=Editor_state.left+300, height=300}-- initially editing a file called foo that hasn't been saved to filesystem yetendfunction test_drop_file_saves_previous()io.write('\ntest_drop_file_saves_previous')Editor_state.filename = 'foo'App.screen.init{width=Editor_state.left+300, height=300}check_eq(App.screen.width, Editor_state.left+300, 'F - test_resize_window/baseline/width')App.screen.init{width=Editor_state.left+300, height=300}App.filesystem['foo'] = 'abc\ndef\nghi\n'local fake_dropped_file = {opened = false,getFilename = function(self)return 'foo'end,open = function(self)self.opened = trueend,lines = function(self)assert(self.opened)return App.filesystem['foo']:gmatch('[^\n]+')end,close = function(self)self.opened = falseend,}App.filedropped(fake_dropped_file)check_eq(App.screen.height, 300, 'F - test_resize_window/baseline/height')App.resize(200, 400)check_eq(App.screen.width, 200, 'F - test_resize_window/width')check_eq(App.screen.height, 400, 'F - test_resize_window/height')-- TODO: how to make assertions about when App.update got past the early exit?end
Lines = load_array{'the quick brown fox jumped over the lazy dog'}Margin_right = 0; Margin_width = Margin_leftCursor1 = {line=1, pos=1}Screen_top1 = {line=1, pos=1}Screen_bottom1 = {}App.draw()local y = Margin_top
Text.clear_cache(State.lines[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)})
if State.selection1.line thenText.delete_selection(State, State.left, State.right)schedule_save(State)
Filename = 'foo'App.screen.init{width=Margin_left+300, height=300}check_eq(App.screen.width, Margin_left+300, 'F - test_resize_window/baseline/width')
Editor_state.filename = 'foo'App.screen.init{width=Editor_state.left+300, height=300}check_eq(App.screen.width, Editor_state.left+300, 'F - test_resize_window/baseline/width')
check_eq(#Lines, 3, 'F - test_drop_file/#lines')check_eq(Lines[1].data, 'abc', 'F - test_drop_file/lines:1')check_eq(Lines[2].data, 'def', 'F - test_drop_file/lines:2')check_eq(Lines[3].data, 'ghi', 'F - test_drop_file/lines:3')
check_eq(#Editor_state.lines, 3, 'F - test_drop_file/#lines')check_eq(Editor_state.lines[1].data, 'abc', 'F - test_drop_file/lines:1')check_eq(Editor_state.lines[2].data, 'def', 'F - test_drop_file/lines:2')check_eq(Editor_state.lines[3].data, 'ghi', 'F - test_drop_file/lines:3')
-- an array vertices for mode 'rectangle'-- center, p1, num_vertices for mode 'polygon'Current_drawing_submode = nilNext_save = nil
Selection1 = {} -- no support for shift drag while we're resizingText.tweak_screen_top_and_cursor(Margin_left, App.screen.height-Margin_right)Last_resize_time = App.getTime()
Text.redraw_all(Editor_state)Editor_state.selection1 = {} -- no support for shift drag while we're resizingText.tweak_screen_top_and_cursor(Editor_state, Editor_state.left, Editor_state.right)
love.graphics.setColor(0, 0, 0)end
endfunction schedule_save()if Next_save == nil thenNext_save = App.getTime() + 3 -- short enough that you're likely to still remember what you didend
if Next_save thensave_to_disk(Lines, Filename)end-- make sure to save before quitting
local byte_offset = Text.offset(Search_term, len)schedule_save()schedule_save()end
function icon.line_width(x, y)love.graphics.setColor(0.7,0.7,0.7)love.graphics.line(x+0,y+0, x+9,y+0)love.graphics.line(x+0,y+1, x+9,y+1)love.graphics.line(x+0,y+2, x+9,y+2)love.graphics.line(x+0,y+3, x+9,y+3)love.graphics.line(x+0,y+4, x+9,y+4)love.graphics.line(x+0,y+5, x+9,y+5)love.graphics.line(x+1,y+6, x+8,y+6)love.graphics.line(x+2,y+7, x+7,y+7)love.graphics.line(x+3,y+8, x+6,y+8)love.graphics.line(x+4,y+9, x+5,y+9)end
love.graphics.print("Things you can do:", Margin_left+30,y)love.graphics.print("* Hover on a point and press 'ctrl+u' to pick it up and start moving it,", Margin_left+30,y)love.graphics.print("then press the mouse button to drop it", Margin_left+30+bullet_indent(),y)love.graphics.print("* Hover on a point or shape and press 'ctrl+d' to delete it", Margin_left+30,y)love.graphics.print("* Press 'ctrl+p' to switch to drawing freehand strokes", Margin_left+30,y)
y = y + State.line_heightlove.graphics.print("* Press the mouse button to start drawing a "..current_shape(State), State.left+30,y)y = y + State.line_height
y = y + Line_heightlove.graphics.print("* Press the mouse button to start drawing a "..current_shape(), State.left+30,y)y = y + Line_height
love.graphics.print("* Press 'ctrl+2' to switch to drawing lines", Margin_left+30,y)if State.current_drawing_mode ~= 'line' thenlove.graphics.print("* Press 'ctrl+l' to switch to drawing lines", State.left+30,y)y = y + State.line_height
if Current_drawing_mode ~= 'line' thenlove.graphics.print("* Press 'ctrl+2' to switch to drawing lines", State.left+30,y)y = y + Line_height
love.graphics.print("* Press 'ctrl+m' to switch to drawing horizontal/vertical lines", Margin_left+30,y)if State.current_drawing_mode ~= 'manhattan' then
if Current_drawing_mode ~= 'manhattan' then
love.graphics.print("* Press 'ctrl+<digit>' to switch to drawing regular polygons", Margin_left+30,y)if State.current_drawing_mode ~= 'polygon' thenlove.graphics.print("* Press 'ctrl+g' to switch to drawing polygons", State.left+30,y)y = y + State.line_height
if Current_drawing_mode ~= 'polygon' thenlove.graphics.print("* Press 'ctrl+<digit>' to switch to drawing regular polygons", State.left+30,y)y = y + Line_height
love.graphics.print("* Press 'ctrl+r' to switch to drawing rectangles", Margin_left+30,y)if State.current_drawing_mode ~= 'rectangle' then
if Current_drawing_mode ~= 'rectangle' then
love.graphics.print("* Press 'ctrl+=' or 'ctrl+-' to zoom in or out, ctrl+0 to reset zoom", Margin_left+30,y)if State.current_drawing_mode ~= 'square' thenlove.graphics.print("* Press 'ctrl+s' to switch to drawing squares", State.left+30,y)y = y + State.line_height
love.graphics.print("* Press 'ctrl+=' or 'ctrl+-' to zoom in or out, ctrl+0 to reset zoom", State.left+30,y)love.graphics.print("Press 'esc' now to hide this message", State.left+30,y)
y = y + State.line_heightApp.color(Help_background_color)love.graphics.rectangle('fill', State.left,drawing.y, State.width, math.max(Drawing.pixels(drawing.h, State.width),y-drawing.y))
y = y + Line_heightlove.graphics.setColor(0,0.5,0, 0.1)love.graphics.rectangle('fill', State.left,drawing.y, State.right, math.max(Drawing.pixels(drawing.h),y-drawing.y))
love.graphics.print("You're currently drawing a "..current_shape(drawing.pending), Margin_left+30,y)love.graphics.print('Things you can do now:', Margin_left+30,y)love.graphics.print('* Release the mouse button to finish drawing the stroke', Margin_left+30,y)love.graphics.print('* Release the mouse button to finish drawing the line', Margin_left+30,y)
love.graphics.print('* Release the mouse button to finish drawing the regular polygon', Margin_left+30,y)y = y + State.line_heightelseif State.current_drawing_mode == 'polygon' thenlove.graphics.print('* Release the mouse button to finish drawing the polygon', State.left+30,y)y = y + State.line_heightlove.graphics.print("* Press 'p' to add a vertex to the polygon", State.left+30,y)y = y + State.line_heightelseif State.current_drawing_mode == 'rectangle' then
love.graphics.print('* Release the mouse button to finish drawing the rectangle', Margin_left+30,y)y = y + Line_heightlove.graphics.print("* Press 'p' to replace the second vertex of the rectangle", Margin_left+30,y)y = y + Line_height
love.graphics.print('* Release the mouse button to finish drawing the rectangle', State.left+30,y)y = y + State.line_heightlove.graphics.print("* Press 'p' to replace the second vertex of the rectangle", State.left+30,y)y = y + State.line_height
love.graphics.print("* Press 'esc' then release the mouse button to cancel the current shape", Margin_left+30,y)love.graphics.print("* Press '2' to switch to drawing lines", Margin_left+30,y)
y = y + State.line_heighty = y + State.line_heightif State.current_drawing_mode ~= 'line' thenlove.graphics.print("* Press 'l' to switch to drawing lines", State.left+30,y)y = y + State.line_height
y = y + Line_heighty = y + Line_heightif Current_drawing_mode ~= 'line' thenlove.graphics.print("* Press '2' to switch to drawing lines", State.left+30,y)y = y + Line_height
if Current_drawing_mode ~= 'manhattan' then
if State.current_drawing_mode ~= 'polygon' thenlove.graphics.print("* Press 'g' to switch to drawing polygons", State.left+30,y)y = y + State.line_heightif State.current_drawing_mode ~= 'rectangle' then
App.color(Help_background_color)love.graphics.rectangle('fill', State.left,drawing.y, State.width, math.max(Drawing.pixels(drawing.h, State.width),y-drawing.y))
love.graphics.setColor(0,0.5,0, 0.1)love.graphics.rectangle('fill', State.left,drawing.y, State.right, math.max(Drawing.pixels(drawing.h),y-drawing.y))
if State.current_drawing_mode ~= 'square' thenlove.graphics.print("* Press 's' to switch to drawing squares", State.left+30,y)y = y + State.line_heightlove.graphics.print("* Press 'p' to add a vertex to the rectangle", State.left+30,y)y = y + State.line_heightlove.graphics.print('* Release the mouse button to finish drawing the rectangle', State.left+30,y)y = y + State.line_heightlove.graphics.print("* Press 'p' to replace the second vertex of the rectangle", State.left+30,y)y = y + State.line_heightelseif State.current_drawing_mode == 'square' thenlove.graphics.print("* Press 'p' to add a vertex to the square", State.left+30,y)y = y + State.line_heightlove.graphics.print('* Release the mouse button to finish drawing the square', State.left+30,y)y = y + State.line_heightlove.graphics.print("* Press 'p' to replace the second vertex of the square", State.left+30,y)y = y + State.line_height
App.screen.init{width=Margin_width+256, height=300} -- drawing coordinates 1:1 with pixelsLines = load_array{'```lines', '```', ''}App.draw()check_eq(Current_drawing_mode, 'line', 'F - test_draw_polygon/baseline/drawing_mode')check_eq(#Lines, 2, 'F - test_draw_polygon/baseline/#lines')check_eq(Lines[1].mode, 'drawing', 'F - test_draw_polygon/baseline/mode')check_eq(Lines[1].y, Margin_top+Drawing_padding_top, 'F - test_draw_polygon/baseline/y')check_eq(Lines[1].h, 128, 'F - test_draw_polygon/baseline/y')check_eq(#Lines[1].shapes, 0, 'F - test_draw_polygon/baseline/#shapes')-- start a strokeApp.run_after_mouse_press(Margin_left+35, Margin_top+Drawing_padding_top+36, 1)-- switch to polygon modeApp.run_after_keychord('5')App.run_after_mouse_release(Margin_left+55, Margin_top+Drawing_padding_top+26, 1)local drawing = Lines[1]check_eq(#drawing.shapes, 1, 'F - test_draw_polygon/#shapes')check_eq(#drawing.points, 2, 'F - test_draw_polygon/vertices')local shape = drawing.shapes[1]check_eq(shape.mode, 'polygon', 'F - test_draw_polygon/shape_mode')check_eq(shape.num_vertices, 5, 'F - test_draw_polygon/vertices')
App.screen.init{width=Margin_left+256, height=300} -- drawing coordinates 1:1 with pixelsEditor_state = edit.initialize_state(Margin_top, Margin_left, App.screen.width) -- zero right marginEditor_state.lines = load_array{'```lines', '```', ''}edit.draw(Editor_state)check_eq(Editor_state.current_drawing_mode, 'line', 'F - test_draw_polygon/baseline/drawing_mode')check_eq(#Editor_state.lines, 2, 'F - test_draw_polygon/baseline/#lines')check_eq(Editor_state.lines[1].mode, 'drawing', 'F - test_draw_polygon/baseline/mode')check_eq(Editor_state.lines[1].y, Editor_state.top+Editor_state.drawing_padding_top, 'F - test_draw_polygon/baseline/y')check_eq(Editor_state.lines[1].h, 128, 'F - test_draw_polygon/baseline/y')check_eq(#Editor_state.lines[1].shapes, 0, 'F - test_draw_polygon/baseline/#shapes')local drawing = Editor_state.lines[1]
edit.run_after_mouse_press(Editor_state, Editor_state.left+5, Editor_state.top+Editor_state.drawing_padding_top+6, 1)edit.run_after_keychord(Editor_state, 'g') -- polygon modeApp.mouse_move(Editor_state.left+65, Editor_state.top+Editor_state.drawing_padding_top+36)edit.run_after_keychord(Editor_state, 'p') -- add pointedit.run_after_mouse_release(Editor_state, Editor_state.left+35, Editor_state.top+Editor_state.drawing_padding_top+26, 1)
-- start a strokeedit.run_after_mouse_press(Editor_state, Editor_state.left+35, Editor_state.top+Editor_state.drawing_padding_top+36, 1)-- switch to polygon modeedit.run_after_keychord(Editor_state, '5')edit.run_after_mouse_release(Editor_state, Editor_state.left+55, Editor_state.top+Editor_state.drawing_padding_top+26, 1)
check_eq(#drawing.shapes, 1, 'F - test_draw_polygon/#shapes')check_eq(#drawing.points, 2, 'F - test_draw_polygon/vertices')local shape = drawing.shapes[1]check_eq(shape.mode, 'polygon', 'F - test_draw_polygon/shape_mode')check_eq(shape.num_vertices, 5, 'F - test_draw_polygon/vertices')
App.screen.init{width=Margin_left+256, height=300} -- drawing coordinates 1:1 with pixelsEditor_state = edit.initialize_state(Margin_top, Margin_left, App.screen.width) -- zero right marginEditor_state.lines = load_array{'```lines', '```', ''}edit.draw(Editor_state)check_eq(Editor_state.current_drawing_mode, 'line', 'F - test_draw_square/baseline/drawing_mode')check_eq(#Editor_state.lines, 2, 'F - test_draw_square/baseline/#lines')check_eq(Editor_state.lines[1].mode, 'drawing', 'F - test_draw_square/baseline/mode')check_eq(Editor_state.lines[1].y, Editor_state.top+Editor_state.drawing_padding_top, 'F - test_draw_square/baseline/y')check_eq(Editor_state.lines[1].h, 128, 'F - test_draw_square/baseline/y')check_eq(#Editor_state.lines[1].shapes, 0, 'F - test_draw_square/baseline/#shapes')edit.run_after_mouse_press(Editor_state, Editor_state.left+35, Editor_state.top+Editor_state.drawing_padding_top+36, 1)edit.run_after_keychord(Editor_state, 's') -- square modeApp.mouse_move(Editor_state.left+42, Editor_state.top+Editor_state.drawing_padding_top+45)edit.run_after_keychord(Editor_state, 'p')App.mouse_move(Editor_state.left+65, Editor_state.top+Editor_state.drawing_padding_top+66)edit.run_after_keychord(Editor_state, 'p')edit.run_after_mouse_release(Editor_state, Editor_state.left+15, Editor_state.top+Editor_state.drawing_padding_top+26, 1)local drawing = Editor_state.lines[1]
App.screen.init{width=Margin_left+256, height=300} -- drawing coordinates 1:1 with pixelsEditor_state = edit.initialize_state(Margin_top, Margin_left, App.screen.width) -- zero right marginEditor_state.lines = load_array{'```lines', '```', ''}Editor_state.current_drawing_mode = 'line'edit.draw(Editor_state)edit.run_after_mouse_press(Editor_state, Editor_state.left+5, Editor_state.top+Editor_state.drawing_padding_top+6, 1)edit.run_after_keychord(Editor_state, 'g') -- polygon modeApp.mouse_move(Editor_state.left+65, Editor_state.top+Editor_state.drawing_padding_top+36)edit.run_after_keychord(Editor_state, 'p') -- add pointApp.mouse_move(Editor_state.left+35, Editor_state.top+Editor_state.drawing_padding_top+26)edit.run_after_keychord(Editor_state, 'p') -- add pointedit.run_after_mouse_release(Editor_state, Editor_state.left+14, Editor_state.top+Editor_state.drawing_padding_top+16, 1)local drawing = Editor_state.lines[1]App.mouse_move(Editor_state.left+35, Editor_state.top+Editor_state.drawing_padding_top+26)edit.run_after_keychord(Editor_state, 'C-d')App.screen.init{width=Margin_left+256, height=300} -- drawing coordinates 1:1 with pixelsEditor_state = edit.initialize_state(Margin_top, Margin_left, App.screen.width) -- zero right marginEditor_state.lines = load_array{'```lines', '```', ''}Editor_state.current_drawing_mode = 'line'edit.draw(Editor_state)edit.run_after_mouse_press(Editor_state, Editor_state.left+5, Editor_state.top+Editor_state.drawing_padding_top+6, 1)edit.run_after_keychord(Editor_state, 'g') -- polygon modeApp.mouse_move(Editor_state.left+65, Editor_state.top+Editor_state.drawing_padding_top+36)edit.run_after_keychord(Editor_state, 'p') -- add pointedit.run_after_mouse_release(Editor_state, Editor_state.left+14, Editor_state.top+Editor_state.drawing_padding_top+16, 1)local drawing = Editor_state.lines[1]App.mouse_move(Editor_state.left+65, Editor_state.top+Editor_state.drawing_padding_top+36)edit.run_after_keychord(Editor_state, 'C-d')
love.graphics.line(Drawing.pixels(prev.x, width)+left,Drawing.pixels(prev.y, width)+top, Drawing.pixels(curr.x, width)+left,Drawing.pixels(curr.y, width)+top)love.graphics.line(Drawing.pixels(prev.x, width)+left,Drawing.pixels(prev.y, width)+top, App.mouse_x(),App.mouse_y())
love.graphics.line(Drawing.pixels(first.x, width)+left,Drawing.pixels(first.y, width)+top, Drawing.pixels(second.x, width)+left,Drawing.pixels(second.y, width)+top)love.graphics.line(Drawing.pixels(second.x, width)+left,Drawing.pixels(second.y, width)+top, Drawing.pixels(thirdx, width)+left,Drawing.pixels(thirdy, width)+top)love.graphics.line(Drawing.pixels(thirdx, width)+left,Drawing.pixels(thirdy, width)+top, Drawing.pixels(fourthx, width)+left,Drawing.pixels(fourthy, width)+top)love.graphics.line(Drawing.pixels(fourthx, width)+left,Drawing.pixels(fourthy, width)+top, Drawing.pixels(first.x, width)+left,Drawing.pixels(first.y, width)+top)
local cx,cy = Drawing.pixels(center.x)+left, Drawing.pixels(center.y)+topDrawing.draw_polygon(Current_drawing_submode, cx,cy, App.mouse_x(),App.mouse_y())love.graphics.line(Drawing.pixels(first.x, width)+left,Drawing.pixels(first.y, width)+top, Drawing.pixels(second.x, width)+left,Drawing.pixels(second.y, width)+top)love.graphics.line(Drawing.pixels(second.x, width)+left,Drawing.pixels(second.y, width)+top, Drawing.pixels(thirdx, width)+left,Drawing.pixels(thirdy, width)+top)love.graphics.line(Drawing.pixels(thirdx, width)+left,Drawing.pixels(thirdy, width)+top, Drawing.pixels(fourthx, width)+left,Drawing.pixels(fourthy, width)+top)love.graphics.line(Drawing.pixels(fourthx, width)+left,Drawing.pixels(fourthy, width)+top, Drawing.pixels(first.x, width)+left,Drawing.pixels(first.y, width)+top)love.graphics.line(Drawing.pixels(first.x, width)+left,Drawing.pixels(first.y, width)+top, pmx,pmy)local mx,my = Drawing.coord(pmx-left, width), Drawing.coord(pmy-top, width)love.graphics.line(Drawing.pixels(first.x, width)+left,Drawing.pixels(first.y, width)+top, Drawing.pixels(second.x, width)+left,Drawing.pixels(second.y, width)+top)love.graphics.line(Drawing.pixels(second.x, width)+left,Drawing.pixels(second.y, width)+top, Drawing.pixels(thirdx, width)+left,Drawing.pixels(thirdy, width)+top)love.graphics.line(Drawing.pixels(thirdx, width)+left,Drawing.pixels(thirdy, width)+top, Drawing.pixels(fourthx, width)+left,Drawing.pixels(fourthy, width)+top)love.graphics.line(Drawing.pixels(fourthx, width)+left,Drawing.pixels(fourthy, width)+top, Drawing.pixels(first.x, width)+left,Drawing.pixels(first.y, width)+top)
local cx,cy = Drawing.pixels(center.x, width)+left, Drawing.pixels(center.y, width)+topDrawing.draw_polygon(State.current_drawing_submode, cx,cy, App.mouse_x(),App.mouse_y())
elseif Current_drawing_mode == 'rectangle' thenelseif Current_drawing_mode == 'polygon' thenlocal j = Drawing.insert_point(drawing.points, Drawing.coord(x-Margin_left), Drawing.coord(y-drawing.y))drawing.pending = {mode=Current_drawing_mode, num_vertices=Current_drawing_submode, center=j}
local j = Drawing.find_or_insert_point(drawing.points, Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width), State.width)
local j = Drawing.insert_point(drawing.points, Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width))
elseif State.current_drawing_mode == 'polygon' or State.current_drawing_mode == 'rectangle' or State.current_drawing_mode == 'square' thenlocal j = Drawing.find_or_insert_point(drawing.points, Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width), State.width)
elseif State.current_drawing_mode == 'rectangle' thenlocal j = Drawing.insert_point(drawing.points, Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width))
elseif State.current_drawing_mode == 'polygon' thenlocal j = Drawing.insert_point(drawing.points, Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width))drawing.pending = {mode=State.current_drawing_mode, num_vertices=State.current_drawing_submode, center=j}
local j = Drawing.find_or_insert_point(drawing.points, Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width), State.width)
local j = Drawing.insert_point(drawing.points, Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width))
local mx,my = Drawing.coord(x-Margin_left), Drawing.coord(y-drawing.y)drawing.pending.p1 = Drawing.insert_point(drawing.points, mx,my)
local mx,my = Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width)drawing.pending.p1 = Drawing.find_or_insert_point(drawing.points, mx,my, State.width)
drawing.pending.p1 = Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)
drawing.pending.p1 = Drawing.find_or_insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y, State.width)
State.current_drawing_mode = 'polygon'State.current_drawing_mode = 'polygon'local _,drawing = Drawing.current_drawing(State)
elseif App.mouse_down(1) and chord == 'p' and State.current_drawing_mode == 'polygon' thenlocal _,drawing = Drawing.current_drawing(State)elseif App.mouse_down(1) and chord == 'p' and Current_drawing_mode == 'rectangle' thenelseif App.mouse_down(1) and chord == 'p' and (State.current_drawing_mode == 'rectangle' or State.current_drawing_mode == 'square') thenlocal _,drawing = Drawing.current_drawing(State)
local mx,my = Drawing.coord(App.mouse_x()-State.left, State.width), Drawing.coord(App.mouse_y()-drawing.y, State.width)local j = Drawing.find_or_insert_point(drawing.points, mx,my, State.width)
drawing.pending.center = Drawing.insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y)
drawing.pending.center = Drawing.find_or_insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y, State.width)
local mx,my = Drawing.coord(App.mouse_x()-State.left, State.width), Drawing.coord(App.mouse_y()-drawing.y, State.width)local j = Drawing.find_or_insert_point(drawing.points, mx,my, State.width)drawing.pending.vertices = {Drawing.find_or_insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y, State.width)}drawing.pending.vertices = {Drawing.find_or_insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y, State.width)}State.current_drawing_mode = 'freehand'State.current_drawing_mode = 'line'local _,drawing = Drawing.current_drawing(State)State.current_drawing_mode = 'line'State.current_drawing_mode = 'manhattan'local drawing = Drawing.select_drawing_at_mouse(State)drawing.pending.p1 = Drawing.find_or_insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y, State.width)drawing.pending.p1 = Drawing.find_or_insert_point(drawing.points, drawing.pending.points[1].x, drawing.pending.points[1].y, State.width)table.insert(drawing.pending.vertices, Drawing.find_or_insert_point(drawing.points, thirdx,thirdy, State.width))table.insert(drawing.pending.vertices, Drawing.find_or_insert_point(drawing.points, fourthx,fourthy, State.width))local mx,my = Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width)table.insert(drawing.pending.vertices, Drawing.find_or_insert_point(drawing.points, mx,my, State.width))local mx,my = Drawing.coord(x-State.left, State.width), Drawing.coord(y-drawing.y, State.width)