OEJIDMZ2F2WEV7N7PSLMJL3RG55ZHI552AQJUTCG27XRT4VZTRUAC P7G3PKCOZKP6FIY3UL423QE3VU6B7JMDBIZUB7WSZG7GFIQR6RXQC FWZXTL7BUJAGF5I3X4G74KWRT2BFBH3TMYQNCODGNTQ2S74GJRXAC 4W2NJTC3NV4T3OF4KGGR2ADSXCCTV5GVQMN6TR6D5N4QESFWYY4QC HTAB35N62YXTFGITVQAK6DNEKKAUKJQQ27RYO7BBVQKIHXBH6NMQC TZNPEHB3BRUHATVYAODURZUR45TYV62HYWQK5SUXHAOLVGYJVP7AC QJAYOFWY7V4BWVLJMEDCCBC2HX4BDAZI6PQVLWCLYRHWGMOBFTVAC 54Y4QQG3ETC4YMUDDJBQO4SLFMX3NOLI5PRGVHUY2DVGZAUJBZVAC 7TQAF4BYIK75EEYCCK7VEUSZHNCWMWIA3HZGQKIILYESUZ5ZZRVQC NGSVO24RFXJA5NUZSN6X5JPE5XFE6T2A57UGO72AGEPOI32SSZJAC ZE4ZEF4NITAK6MMQQ74AYYBGM7NRQZWQY2MW4I2QWAOMTLITCCCAC R5HNWYMH47LWVHS5VVXNR6TCBDXDURVXZ6RCUNFTTTMIXF275ULQC OELP2MAL5RGZ3AZ42V6H7RLGX52JLNHGUD7GV6YIVZ3ACOK5SFSQC CCMG4VMKBKBL5ZCUBAVJWCBOGRHS34VB2OH2A24PHALBITX3TNBAC 2H66EGYD5ZDUW6LY6TPY3MNJ6NKX3CWSFYHYBVROORGLFSUI4B6QC ZHEJFKSLMORNRVOM7ZY7P4WAXIKGTQ5JVRJRWICXNXKF6HJWEFCQC KNNHAHIBSWRPCQ2DIUO22F2JSSQCHEQ5DP4R6YE4XCA3ALC4BSUAC 7KX3WBFEXMIHNKWNF4NUOBW5HO3PEL3ZEFFMTAXFOQG6V7BYXZ3AC OF4P6TYQA7SUF4N2KPDN7LRTIRNXME2IZJHRLFGF3EMDTWZSGOYAC GDLMJBFEGWDV26RASORGCAQSJQULYPDIRL6CGXB7EJV7567CH7WAC ND7NVNRKX2ZUTQ35Y324YMBM6R5HML2FC63AT547JUGJ36BQTYMQC JIBCE66ZTWM5WEHEHNKKTRWBJQSQWBDDWPMOJIJR5Q676OSHYCNAC ZXQ2MMPAOIA4TN3TWMFPXZUL7NUE3EWXLV2JHBQXEINE7WCKFSIQC WKMW7PCE75A5CFXF5GPL5HQ4ZNASFOFQFHASOQ7LABSQKWU3KEGAC K6ZDYZKXSLTLCCHWYK6K6WOCNXBZOXEDKDVNNJVCZUFOLLSUO5UAC SUPHTPXYKS4JBDPASHAYA5OBVJ45QT7ZV2HYNTF7OJYOKKS6DW5QC 6C3UZDESM2HPFIHAW5YIPUV6VXO4YV5DIEY574HUGP2DGOQNUVOAC 6KFND4SU2O7UDJVSS74YI3PI453ZFCBM72P6TWLI7DSKFEVUQVFQC KAGTD334AIWFI34VE34OARC44BZDUJRP5R3ZTT6JCQGSYYC3GTVQC QZA5SWQKZDFIKPD72DUNGRUJM7F3DB4IAF74AYMGM4FIMQMMQQFQC BF7TW3EKRIDYC6J2Q2J4YOBAVQF55Y3H6KGZIHNXMH4N72MR6GXQC XRAQBRS4CZ6T6TSQLCMTS4OENCCGWYEBZ52RK42PV6NMMNZZPKUAC 7P3EK7K2AWA3YDMQBFWJY4TVIKGJ5LI7E4P4F7Z2CVAGVETA3JHAC MAI7M665OPEDNICH67IUYSIVLRDL4JPC5BO2EWG2JVQTXATU72MAC 5HBC66CSFQ257TO3DJYBUNKE5RKR47CUJNMYP6Y4F7T6W7LNRV4AC 5TTD5NPQPH2XMC552EMPP4WY7GVHR3RM5LCVZWXBQXOOACZMTUNAC CWDOQLMNGY6BP3QCSQCQ7NG5XZN3QIKPZ5YMQHS3AC53J6QZ5RUQC TBPJ5WSRM5IKQH7FTAVYTWWUBWW7G2CLT5M6FN7CMPLD6Y77YIWQC ZSXRELZMBQAH2SURKXJW7XR42WGT6L6DQBBMBMHAHJCVKAANK5HQC TBB7GHINPHDTKI3B6U3M2OF7UGQ5V5DUHODB7UNKNZMBA4NWKUFAC E6LI4DSVQTJOWXBPO4JIZ2FUSIJFCXQFK3TRRYGAE6SY46O24LKQC X7HYGAL2QVKG7M5EMZ2VSH37UYWGE3EPUXYQBJOVL6IGJFZ2I5AAC WVWSJFCXLID3WSA52K7DIMAHY2HFZIBCJ3NR6FQ5ZC4TJLBR4V4QC KV64IWA3DKR4FL6E4BIG5SFCRQJ3DZFEJOUELCD5TC7DDVJQ6SWAC UGWH4VEHN5G6REWZU6BCXZ57AFU7PGK4MULMMHMJCMEMVVEDH2KAC Q2C4QGRCXKMCWMEQJT2OJMC5A3OIYKWPQBU4U3QWICEJHFXO6LPQC FBDRJ53NJ5BWDQGU2GWZ6NEYHKCCRD7RODMIG7QQZBRFUB4HR7OAC DCEZF23IB4LTMH6MPAWVUO47YZX5RUHOV2HMNOMNTFM3H3YM63MAC TK73HJVXQCBEEN4ATMLSSG4DI2XZJAQEJICJ472E3YAW55EFAT5AC ZANGJNNX6EITFBOF6NWCF2EM5BDQDEIOD4UPWMF5I6SKAURRTIHAC -- continue the pipeline
love.graphics.rectangle(obj.drawmode or 'fill', vx(obj.x),vy(obj.y), scale(obj.w),scale(obj.h), scale(obj.rx or 0),scale(obj.ry or obj.rx or 0))love.graphics.line(unpack(obj.zdata))love.graphics.circle(obj.drawmode or 'fill', vx(obj.x), vy(obj.y), scale(obj.radius))love.graphics.arc(obj.drawmode or 'line', obj.arctype or 'open', vx(obj.x), vy(obj.y), scale(obj.radius), obj.angle1, obj.angle2, obj.segments)love.graphics.ellipse(obj.drawmode or 'fill', vx(obj.x), vy(obj.y), scale(obj.radiusx), scale(obj.radiusy))love.graphics.line(unpack(obj.zdata))love.graphics.draw(obj.text, vx(obj.x), vy(obj.y))end
local old_top = {line=Cursor_node.editor.screen_top1.line, pos=Cursor_node.editor.screen_top1.pos}edit.keychord_press(Cursor_node.editor, chord, key)if not eq(Cursor_node.editor.screen_top1, old_top) thenViewport.y = Cursor_node.y + y_of_schema1(Cursor_node.editor, Cursor_node.editor.screen_top1)endif chord == 'return' then
-- Most of the time, we update the screen_top of nodes from Viewport.y.-- But here we went the other way.-- It's very important to avoid creating a recurrence, to avoid running-- both sides of this feedback loop in a single frame. These apps are-- not very numerically precise (e.g. we force text lines to start at-- integer pixels regardless of zoom, because that keeps text crisp),-- and the computations of Viewport.y and node.top will almost certainly-- not converge. The resulting bugs are extremely difficult to chase-- down.-- The optional skip_updating_screen_top_for arg ensures we don't run-- the other side of the feedback loop.A(--[[skip updating screen_top for]] Cursor_node)return
A()elseif chord == 'C-z' thendump_state()elseif chord == 'C-g' then-- special Expose-like 'global zoom' modeif Zoomed_out == nil thenzoom_out()elseundo_zoom_out()endelseif chord == 'C-q' thenlive.send_to_app('QUIT')elseif Manifest_navigator.show thenkeychord_press_on_manifest_navigator(chord, key)elseif chord == 'C-n' thennew_definition()A()elseif chord == 'C-l' thenManifest_navigator.show = trueManifest_navigator.for_delete = falseinitialize_manifest_navigator()elseif chord == 'C-d' thenManifest_navigator.show = trueManifest_navigator.for_delete = trueinitialize_manifest_navigator()local definition_name = live.get_definition_name_from_buffer(live.definition_to_string(Cursor_node.editor))maybe_update_key_in_definitions(old_definition_name, definition_name, Cursor_node)-- Most of the time, we update the screen_top of nodes from Viewport.y.-- But here we went the other way.-- It's very important to avoid creating a recurrence, to avoid running-- both sides of this feedback loop in a single frame. These apps are-- not very numerically precise (e.g. we force text lines to start at-- integer pixels regardless of zoom, because that keeps text crisp),-- and the computations of Viewport.y and node.top will almost certainly-- not converge. The resulting bugs are extremely difficult to chase-- down.-- The optional skip_updating_screen_top_for arg ensures we don't run-- the other side of the feedback loop.A(--[[skip updating screen_top for]] Cursor_node)return