diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2023-09-04 14:03:34 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2023-09-04 14:03:34 -0700 |
commit | f41513e718a007bbe6d0ae7ccd367f243a625751 (patch) | |
tree | 709a413b79553028027d25391125d8c7675f778d | |
parent | 502129809057bb2d06453b88ec368bee964556e7 (diff) | |
parent | adfe94b9fcf04cc52032467d8970aaf9cd4ea6dc (diff) | |
download | view.love-f41513e718a007bbe6d0ae7ccd367f243a625751.tar.gz |
Merge lines.love
-rw-r--r-- | app.lua | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/app.lua b/app.lua index 477a9b3..b520077 100644 --- a/app.lua +++ b/app.lua @@ -2,6 +2,7 @@ -- -- Most apps can just use the default shown in https://love2d.org/wiki/love.run, -- but we need to override it to: +-- * recover from errors (by switching to the source editor) -- * run all tests (functions starting with 'test_') on startup, and -- * save some state that makes it possible to switch between the main app -- and a source editor, while giving each the illusion of complete @@ -24,22 +25,36 @@ function love.run() return a or 0 end end - love.handlers[name](a,b,c,d,e,f) + xpcall(function() love.handlers[name](a,b,c,d,e,f) end, handle_error) end end dt = love.timer.step() - App.update(dt) + xpcall(function() App.update(dt) end, handle_error) love.graphics.origin() love.graphics.clear(love.graphics.getBackgroundColor()) - App.draw() + xpcall(App.draw, handle_error) love.graphics.present() love.timer.sleep(0.001) end end +function handle_error(err) + Error_message = debug.traceback('Error: ' .. tostring(err), --[[stack frame]]2):gsub('\n[^\n]+$', '') + print(Error_message) + if Current_app == 'run' then + Settings.current_app = 'source' + love.filesystem.write('config', json.encode(Settings)) + load_file_from_source_or_save_directory('main.lua') + App.undo_initialize() + App.run_tests_and_initialize() + else + love.event.quit() + end +end + -- The rest of this file wraps around various LÖVE primitives to support -- automated tests. Often tests will run with a fake version of a primitive -- that redirects to the real love.* version once we're done with tests. @@ -348,13 +363,29 @@ end nativefs = require 'nativefs' +local Keys_down = {} + -- call this once all tests are run -- can't run any tests after this function App.disable_tests() -- have LÖVE delegate all handlers to App if they exist for name in pairs(love.handlers) do if App[name] then - love.handlers[name] = App[name] + -- love.keyboard.isDown doesn't work on Android, so emulate it using + -- keypressed and keyreleased events + if name == 'keypressed' then + love.handlers[name] = function(key, scancode, isrepeat) + Keys_down[key] = true + return App.keypressed(key, scancode, isrepeat) + end + elseif name == 'keyreleased' then + love.handlers[name] = function(key, scancode) + Keys_down[key] = nil + return App.keyreleased(key, scancode) + end + else + love.handlers[name] = App[name] + end end end @@ -410,7 +441,7 @@ function App.disable_tests() App.get_time = love.timer.getTime App.get_clipboard = love.system.getClipboardText App.set_clipboard = love.system.setClipboardText - App.key_down = love.keyboard.isDown + App.key_down = function(key) return Keys_down[key] end App.mouse_move = love.mouse.setPosition App.mouse_down = love.mouse.isDown App.mouse_x = love.mouse.getX |