2023-09-11 05:45:59 +01:00
-- Entrypoint for the app. You can edit this file from within the app if
-- you're careful.
2022-07-12 21:40:53 +01:00
2022-09-03 22:13:22 +01:00
-- files that come with LÖVE; we can't edit those from within the app
utf8 = require ' utf8 '
2022-05-02 16:20:30 +01:00
2022-09-03 22:13:22 +01:00
function load_file_from_source_or_save_directory ( filename )
local contents = love.filesystem . read ( filename )
local code , err = loadstring ( contents , filename )
if code == nil then
error ( err )
end
return code ( )
end
2022-06-18 06:24:46 +01:00
2022-09-03 22:13:22 +01:00
json = load_file_from_source_or_save_directory ( ' json.lua ' )
2022-07-12 06:14:59 +01:00
2022-09-03 22:13:22 +01:00
load_file_from_source_or_save_directory ( ' app.lua ' )
load_file_from_source_or_save_directory ( ' test.lua ' )
2022-07-12 21:45:38 +01:00
2022-09-03 22:13:22 +01:00
load_file_from_source_or_save_directory ( ' keychord.lua ' )
load_file_from_source_or_save_directory ( ' button.lua ' )
2022-08-24 21:27:04 +01:00
2022-09-03 22:13:22 +01:00
-- both sides require (different parts of) the logging framework
load_file_from_source_or_save_directory ( ' log.lua ' )
2022-07-01 05:59:15 +01:00
2022-09-05 19:28:03 +01:00
-- both sides use drawings
load_file_from_source_or_save_directory ( ' icons.lua ' )
load_file_from_source_or_save_directory ( ' drawing.lua ' )
load_file_from_source_or_save_directory ( ' geom.lua ' )
load_file_from_source_or_save_directory ( ' help.lua ' )
load_file_from_source_or_save_directory ( ' drawing_tests.lua ' )
2022-09-03 22:13:22 +01:00
-- but some files we want to only load sometimes
function App . load ( )
2022-09-18 04:37:40 +01:00
log_new ( ' session ' )
2022-07-01 06:46:45 +01:00
if love.filesystem . getInfo ( ' config ' ) then
2022-09-03 22:13:22 +01:00
Settings = json.decode ( love.filesystem . read ( ' config ' ) )
Current_app = Settings.current_app
2022-05-18 03:15:12 +01:00
end
2022-06-07 21:35:56 +01:00
2022-09-03 22:13:22 +01:00
if Current_app == nil then
Current_app = ' run '
2022-06-07 21:35:56 +01:00
end
2022-06-09 16:15:32 +01:00
2022-09-03 22:13:22 +01:00
if Current_app == ' run ' then
load_file_from_source_or_save_directory ( ' file.lua ' )
load_file_from_source_or_save_directory ( ' run.lua ' )
load_file_from_source_or_save_directory ( ' edit.lua ' )
load_file_from_source_or_save_directory ( ' text.lua ' )
load_file_from_source_or_save_directory ( ' search.lua ' )
load_file_from_source_or_save_directory ( ' select.lua ' )
load_file_from_source_or_save_directory ( ' undo.lua ' )
load_file_from_source_or_save_directory ( ' text_tests.lua ' )
load_file_from_source_or_save_directory ( ' run_tests.lua ' )
2022-09-05 20:38:11 +01:00
elseif Current_app == ' source ' then
2022-09-03 22:13:22 +01:00
load_file_from_source_or_save_directory ( ' source_file.lua ' )
load_file_from_source_or_save_directory ( ' source.lua ' )
load_file_from_source_or_save_directory ( ' commands.lua ' )
load_file_from_source_or_save_directory ( ' source_edit.lua ' )
load_file_from_source_or_save_directory ( ' log_browser.lua ' )
load_file_from_source_or_save_directory ( ' source_text.lua ' )
load_file_from_source_or_save_directory ( ' search.lua ' )
2022-09-06 18:05:20 +01:00
load_file_from_source_or_save_directory ( ' source_select.lua ' )
2022-09-03 22:13:22 +01:00
load_file_from_source_or_save_directory ( ' source_undo.lua ' )
load_file_from_source_or_save_directory ( ' colorize.lua ' )
load_file_from_source_or_save_directory ( ' source_text_tests.lua ' )
load_file_from_source_or_save_directory ( ' source_tests.lua ' )
2022-09-05 20:38:11 +01:00
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
2022-06-09 16:15:32 +01:00
end
2022-07-01 06:46:45 +01:00
end
2023-10-10 04:00:36 +01:00
function App . version_check ( )
-- available modes: run, error
Error_message = nil
Error_count = 0
-- we'll reuse error mode on load for an initial version check
local supported_versions = { ' 11.4 ' , ' 12.0 ' } -- put the recommended version first
local minor_version
Major_version , minor_version = love.getVersion ( )
Version = Major_version .. ' . ' .. minor_version
if array.find ( supported_versions , Version ) == nil then
Current_app = ' error '
Error_message = ( " This app doesn't support version %s; please use version %s. Press any key to try it with this version anyway. " ) : format ( Version , supported_versions [ 1 ] )
print ( Error_message )
-- continue initializing everything; hopefully we won't have errors during initialization
end
end
2022-09-03 22:13:22 +01:00
function App . initialize_globals ( )
if Current_app == ' run ' then
run.initialize_globals ( )
elseif Current_app == ' source ' then
source.initialize_globals ( )
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
2022-07-01 06:46:45 +01:00
2022-09-03 22:13:22 +01:00
-- for hysteresis in a few places
2022-11-04 04:02:31 +00:00
Current_time = 0
Last_focus_time = 0 -- https://love2d.org/forums/viewtopic.php?p=249700
Last_resize_time = 0
2022-07-01 06:46:45 +01:00
end
2022-05-02 05:55:57 +01:00
2022-09-03 22:13:22 +01:00
function App . initialize ( arg )
2023-01-16 17:48:06 +00:00
love.keyboard . setTextInput ( true ) -- bring up keyboard on touch screen
love.keyboard . setKeyRepeat ( true )
love.graphics . setBackgroundColor ( 1 , 1 , 1 )
2022-09-03 22:13:22 +01:00
if Current_app == ' run ' then
run.initialize ( arg )
elseif Current_app == ' source ' then
source.initialize ( arg )
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
2022-06-07 21:24:43 +01:00
end
2022-09-03 22:13:22 +01:00
function App . resize ( w , h )
if Current_app == ' run ' then
if run.resize then run.resize ( w , h ) end
elseif Current_app == ' source ' then
if source.resize then source.resize ( w , h ) end
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
2022-11-04 04:02:31 +00:00
Last_resize_time = Current_time
2022-06-07 21:19:17 +01:00
end
2022-05-23 02:27:48 +01:00
function App . filedropped ( file )
2022-09-03 22:13:22 +01:00
if Current_app == ' run ' then
2022-12-24 01:16:19 +00:00
if run.file_drop then run.file_drop ( file ) end
2022-09-03 22:13:22 +01:00
elseif Current_app == ' source ' then
2022-12-24 01:16:19 +00:00
if source.file_drop then source.file_drop ( file ) end
2022-09-03 22:13:22 +01:00
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
end
function App . focus ( in_focus )
if in_focus then
2022-11-04 04:02:31 +00:00
Last_focus_time = Current_time
2022-09-03 22:13:22 +01:00
end
if Current_app == ' run ' then
if run.focus then run.focus ( in_focus ) end
elseif Current_app == ' source ' then
if source.focus then source.focus ( in_focus ) end
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
2022-05-16 23:26:22 +01:00
end
2022-05-23 02:27:48 +01:00
function App . draw ( )
2023-10-10 04:00:36 +01:00
if Current_app == ' error ' then
love.graphics . setColor ( 0 , 0 , 1 )
love.graphics . rectangle ( ' fill ' , 0 , 0 , App.screen . width , App.screen . height )
love.graphics . setColor ( 1 , 1 , 1 )
love.graphics . printf ( Error_message , 40 , 40 , 600 )
elseif Current_app == ' run ' then
2022-09-03 22:13:22 +01:00
run.draw ( )
elseif Current_app == ' source ' then
source.draw ( )
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
2022-05-02 05:55:57 +01:00
end
2022-05-23 02:27:48 +01:00
function App . update ( dt )
2022-11-04 04:02:31 +00:00
Current_time = Current_time + dt
2022-07-12 21:45:38 +01:00
-- some hysteresis while resizing
2022-11-04 04:02:31 +00:00
if Current_time < Last_resize_time + 0.1 then
2022-07-25 23:23:01 +01:00
return
2022-07-12 21:45:38 +01:00
end
2022-09-03 22:13:22 +01:00
--
if Current_app == ' run ' then
run.update ( dt )
elseif Current_app == ' source ' then
source.update ( dt )
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
2022-05-14 21:08:33 +01:00
end
2022-12-24 01:16:19 +00:00
function App . keychord_press ( chord , key )
2022-09-03 22:13:22 +01:00
-- ignore events for some time after window in focus (mostly alt-tab)
2022-11-04 04:02:31 +00:00
if Current_time < Last_focus_time + 0.01 then
2022-09-03 22:13:22 +01:00
return
end
--
2023-10-10 04:00:36 +01:00
if Current_app == ' error ' then
if chord == ' C-c ' then
love.system . setClipboardText ( Error_message )
end
return
end
2022-09-03 22:13:22 +01:00
if chord == ' C-e ' then
-- carefully save settings
if Current_app == ' run ' then
local source_settings = Settings.source
Settings = run.settings ( )
Settings.source = source_settings
if run.quit then run.quit ( ) end
Current_app = ' source '
2023-09-04 23:07:54 +01:00
-- preserve any Error_message when going from run to source
2022-09-03 22:13:22 +01:00
elseif Current_app == ' source ' then
Settings.source = source.settings ( )
if source.quit then source.quit ( ) end
Current_app = ' run '
2023-09-04 23:07:54 +01:00
Error_message = nil
2022-09-03 22:13:22 +01:00
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
Settings.current_app = Current_app
love.filesystem . write ( ' config ' , json.encode ( Settings ) )
-- reboot
load_file_from_source_or_save_directory ( ' main.lua ' )
App.undo_initialize ( )
App.run_tests_and_initialize ( )
return
end
if Current_app == ' run ' then
2022-12-24 01:16:19 +00:00
if run.keychord_press then run.keychord_press ( chord , key ) end
2022-09-03 22:13:22 +01:00
elseif Current_app == ' source ' then
2022-12-24 01:16:19 +00:00
if source.keychord_press then source.keychord_press ( chord , key ) end
2022-09-03 22:13:22 +01:00
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
2022-07-25 23:33:06 +01:00
end
end
2022-05-23 02:27:48 +01:00
function App . textinput ( t )
2023-10-10 04:00:36 +01:00
if Current_app == ' error ' then return end
2022-09-03 22:13:22 +01:00
-- ignore events for some time after window in focus (mostly alt-tab)
2022-11-04 04:02:31 +00:00
if Current_time < Last_focus_time + 0.01 then
2022-07-25 23:33:06 +01:00
return
end
2022-09-03 22:13:22 +01:00
--
if Current_app == ' run ' then
2022-12-24 01:16:19 +00:00
if run.text_input then run.text_input ( t ) end
2022-09-03 22:13:22 +01:00
elseif Current_app == ' source ' then
2022-12-24 01:16:19 +00:00
if source.text_input then source.text_input ( t ) end
2022-09-03 22:13:22 +01:00
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
2022-05-21 22:03:06 +01:00
end
2022-12-24 04:43:37 +00:00
function App . keyreleased ( key , scancode )
2023-10-10 04:00:36 +01:00
if Current_app == ' error ' then return end
2022-09-03 22:13:22 +01:00
-- ignore events for some time after window in focus (mostly alt-tab)
2022-11-04 04:02:31 +00:00
if Current_time < Last_focus_time + 0.01 then
2022-07-25 23:33:06 +01:00
return
end
2022-09-03 22:13:22 +01:00
--
if Current_app == ' run ' then
2022-12-24 04:43:37 +00:00
if run.key_release then run.key_release ( key , scancode ) end
2022-09-03 22:13:22 +01:00
elseif Current_app == ' source ' then
2022-12-24 04:43:37 +00:00
if source.key_release then source.key_release ( key , scancode ) end
2022-09-03 22:13:22 +01:00
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
2022-05-12 06:29:21 +01:00
end
2022-09-03 22:13:22 +01:00
function App . mousepressed ( x , y , mouse_button )
2023-10-10 04:00:36 +01:00
if Current_app == ' error ' then return end
2022-09-03 22:13:22 +01:00
--? print('mouse press', x,y)
if Current_app == ' run ' then
2022-12-24 04:43:30 +00:00
if run.mouse_press then run.mouse_press ( x , y , mouse_button ) end
2022-09-03 22:13:22 +01:00
elseif Current_app == ' source ' then
2022-12-24 04:43:30 +00:00
if source.mouse_press then source.mouse_press ( x , y , mouse_button ) end
2022-09-03 22:13:22 +01:00
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
end
function App . mousereleased ( x , y , mouse_button )
2023-10-10 04:00:36 +01:00
if Current_app == ' error ' then return end
2022-09-03 22:13:22 +01:00
if Current_app == ' run ' then
2022-12-24 01:16:19 +00:00
if run.mouse_release then run.mouse_release ( x , y , mouse_button ) end
2022-09-03 22:13:22 +01:00
elseif Current_app == ' source ' then
2022-12-24 01:16:19 +00:00
if source.mouse_release then source.mouse_release ( x , y , mouse_button ) end
2022-09-03 22:13:22 +01:00
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
2022-07-25 23:33:06 +01:00
end
2022-05-02 16:20:30 +01:00
end
2022-08-24 21:27:04 +01:00
2023-03-24 04:00:09 +00:00
function App . wheelmoved ( dx , dy )
2023-10-10 04:00:36 +01:00
if Current_app == ' error ' then return end
2023-03-24 04:00:09 +00:00
if Current_app == ' run ' then
if run.mouse_wheel_move then run.mouse_wheel_move ( dx , dy ) end
elseif Current_app == ' source ' then
if source.mouse_wheel_move then source.mouse_wheel_move ( dx , dy ) end
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
end
end
2022-09-03 22:13:22 +01:00
function love . quit ( )
2023-10-10 04:00:36 +01:00
if Current_app == ' error ' then return end
2022-09-03 22:13:22 +01:00
if Current_app == ' run ' then
local source_settings = Settings.source
Settings = run.settings ( )
Settings.source = source_settings
else
Settings.source = source.settings ( )
end
Settings.current_app = Current_app
love.filesystem . write ( ' config ' , json.encode ( Settings ) )
if Current_app == ' run ' then
if run.quit then run.quit ( ) end
elseif Current_app == ' source ' then
if source.quit then source.quit ( ) end
else
assert ( false , ' unknown app " ' .. Current_app .. ' " ' )
2022-08-24 21:27:04 +01:00
end
end