Merge lines.love

This commit is contained in:
Kartik K. Agaram 2023-07-10 17:55:12 -07:00
commit 8482be9472
3 changed files with 55 additions and 118 deletions

50
run.lua
View File

@ -55,21 +55,28 @@ end
function run.load_settings()
love.graphics.setFont(love.graphics.newFont(Settings.font_height))
-- determine default dimensions and flags
App.screen.width, App.screen.height, App.screen.flags = App.screen.size()
-- set up desired window dimensions
-- set up desired window dimensions and make window resizable
_, _, App.screen.flags = App.screen.size()
App.screen.flags.resizable = true
App.screen.flags.minwidth = math.min(App.screen.width, 200)
App.screen.flags.minheight = math.min(App.screen.height, 200)
App.screen.width, App.screen.height = Settings.width, Settings.height
App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
App.screen.move(Settings.x, Settings.y, Settings.displayindex)
run.set_window_position_from_settings(Settings)
Editor_state = edit.initialize_state(Margin_top, Margin_left, App.screen.width-Margin_right, Settings.font_height, math.floor(Settings.font_height*1.3))
Editor_state.filename = Settings.filename
Editor_state.screen_top1 = Settings.screen_top
Editor_state.cursor1 = Settings.cursor
end
function run.set_window_position_from_settings(settings)
local os = love.system.getOS()
if os == 'Linux' then
-- love.window.setPosition doesn't quite seem to do what is asked of it on Linux.
App.screen.move(settings.x, settings.y-37, settings.displayindex)
else
App.screen.move(settings.x, settings.y, settings.displayindex)
end
end
function run.initialize_default_settings()
local font_height = 20
love.graphics.setFont(love.graphics.newFont(font_height))
@ -81,22 +88,17 @@ function run.initialize_default_settings()
end
function run.initialize_window_geometry(em_width)
local os = love.system.getOS()
if os == 'Android' or os == 'iOS' then
-- maximizing on iOS breaks text rendering: https://github.com/deltadaedalus/vudu/issues/7
-- no point second-guessing window dimensions on mobile
App.screen.width, App.screen.height, App.screen.flags = App.screen.size()
return
end
-- maximize window
App.screen.resize(0, 0) -- maximize
-- Initialize window width/height and make window resizable.
--
-- I get tempted to have opinions about window dimensions here, but they're
-- non-portable:
-- - maximizing doesn't work on mobile and messes things up
-- - maximizing keeps the title bar on screen in Linux, but off screen on
-- Windows. And there's no way to get the height of the title bar.
-- It seems more robust to just follow LÖVE's default window size until
-- someone overrides it.
App.screen.width, App.screen.height, App.screen.flags = App.screen.size()
-- shrink height slightly to account for window decoration
App.screen.height = App.screen.height-100
App.screen.width = 40*em_width
App.screen.flags.resizable = true
App.screen.flags.minwidth = math.min(App.screen.width, 200)
App.screen.flags.minheight = math.min(App.screen.height, 200)
App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
end
@ -148,12 +150,8 @@ function run.quit()
end
function run.settings()
if Settings == nil then
Settings = {}
end
if Current_app == 'run' then
Settings.x, Settings.y, Settings.displayindex = App.screen.position()
end
if Settings == nil then Settings = {} end
Settings.x, Settings.y, Settings.displayindex = App.screen.position()
return {
x=Settings.x, y=Settings.y, displayindex=Settings.displayindex,
width=App.screen.width, height=App.screen.height,

View File

@ -121,8 +121,11 @@ end
function source.load_settings()
local settings = Settings.source
love.graphics.setFont(love.graphics.newFont(settings.font_height))
source.resize_window_from_settings(settings)
--? print('loading source position', settings.x, settings.y, settings.displayindex)
-- set up desired window dimensions and make window resizable
_, _, App.screen.flags = App.screen.size()
App.screen.flags.resizable = true
App.screen.width, App.screen.height = settings.width, settings.height
App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
source.set_window_position_from_settings(settings)
Show_log_browser_side = settings.show_log_browser_side
local right = App.screen.width - Margin_right
@ -143,29 +146,14 @@ function source.load_settings()
end
end
function source.resize_window_from_settings(settings)
local os = love.system.getOS()
if os == 'Android' or os == 'iOS' then
-- maximizing on iOS breaks text rendering: https://github.com/deltadaedalus/vudu/issues/7
-- no point second-guessing window dimensions on mobile
App.screen.width, App.screen.height, App.screen.flags = App.screen.size()
return
end
-- maximize window to determine maximum allowable dimensions
App.screen.resize(0, 0) -- maximize
Display_width, Display_height, App.screen.flags = App.screen.size()
-- set up desired window dimensions
App.screen.flags.resizable = true
App.screen.flags.minwidth = math.min(Display_width, 200)
App.screen.flags.minheight = math.min(Display_height, 200)
App.screen.width, App.screen.height = settings.width, settings.height
--? print('setting window from settings:', App.screen.width, App.screen.height)
App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
end
function source.set_window_position_from_settings(settings)
-- love.window.setPosition doesn't quite seem to do what is asked of it on Linux.
App.screen.move(settings.x, settings.y-37, settings.displayindex)
local os = love.system.getOS()
if os == 'Linux' then
-- love.window.setPosition doesn't quite seem to do what is asked of it on Linux.
App.screen.move(settings.x, settings.y-37, settings.displayindex)
else
App.screen.move(settings.x, settings.y, settings.displayindex)
end
end
function source.initialize_default_settings()
@ -179,27 +167,18 @@ function source.initialize_default_settings()
end
function source.initialize_window_geometry(em_width)
local os = love.system.getOS()
if os == 'Android' or os == 'iOS' then
-- maximizing on iOS breaks text rendering: https://github.com/deltadaedalus/vudu/issues/7
-- no point second-guessing window dimensions on mobile
App.screen.width, App.screen.height, App.screen.flags = App.screen.size()
return
end
-- maximize window
App.screen.resize(0, 0) -- maximize
Display_width, Display_height, App.screen.flags = App.screen.size()
-- shrink height slightly to account for window decoration
App.screen.height = Display_height-100
App.screen.width = 40*em_width
-- Initialize window width/height and make window resizable.
--
-- I get tempted to have opinions about window dimensions here, but they're
-- non-portable:
-- - maximizing doesn't work on mobile and messes things up
-- - maximizing keeps the title bar on screen in Linux, but off screen on
-- Windows. And there's no way to get the height of the title bar.
-- It seems more robust to just follow LÖVE's default window size until
-- someone overrides it.
App.screen.width, App.screen.height, App.screen.flags = App.screen.size()
App.screen.flags.resizable = true
App.screen.flags.minwidth = math.min(App.screen.width, 200)
App.screen.flags.minheight = math.min(App.screen.height, 200)
App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
print('initializing source position')
if Settings == nil then Settings = {} end
if Settings.source == nil then Settings.source = {} end
Settings.source.x, Settings.source.y, Settings.source.displayindex = App.screen.position()
end
function source.resize(w, h)
@ -290,11 +269,9 @@ function source.quit()
end
function source.settings()
if Current_app == 'source' then
--? print('reading source window position')
Settings.source.x, Settings.source.y, Settings.source.displayindex = App.screen.position()
end
--? print('saving source settings', Settings.source.x, Settings.source.y, Settings.source.displayindex)
if Settings == nil then Settings = {} end
if Settings.source == nil then Settings.source = {} end
Settings.source.x, Settings.source.y, Settings.source.displayindex = App.screen.position()
File_navigation.cursors[Editor_state.filename] = {cursor1=Editor_state.cursor1, screen_top1=Editor_state.screen_top1}
return {
x=Settings.source.x, y=Settings.source.y, displayindex=Settings.source.displayindex,
@ -377,20 +354,15 @@ function source.keychord_press(chord, key)
--? print('C-l')
Show_log_browser_side = not Show_log_browser_side
if Show_log_browser_side then
App.screen.width = math.min(Display_width, App.screen.width*2)
Editor_state.right = App.screen.width/2 - Margin_right
Editor_state.width = Editor_state.right-Editor_state.left
Text.redraw_all(Editor_state)
Log_browser_state.left = App.screen.width/2 + Margin_left
Log_browser_state.right = App.screen.width - Margin_right
else
App.screen.width = Editor_state.right + Margin_right
end
--? print('setting window:', App.screen.width, App.screen.height)
App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
--? print('done setting window')
-- try to restore position if possible
-- if the window gets wider the window manager may not respect this
if not App.run_tests then
source.set_window_position_from_settings(Settings.source)
Editor_state.right = App.screen.width - Margin_right
Editor_state.width = Editor_state.right-Editor_state.left
Text.redraw_all(Editor_state)
end
return
end

View File

@ -19,7 +19,6 @@ end
function test_show_log_browser_side()
App.screen.init{width=300, height=300}
Display_width = App.screen.width
Current_app = 'source'
Editor_state = edit.initialize_test_state()
Editor_state.filename = 'foo'
@ -34,41 +33,9 @@ function test_show_log_browser_side()
check(Show_log_browser_side, 'check')
end
function test_show_log_browser_side_doubles_window_width_if_possible()
-- initialize screen dimensions to half width
App.screen.init{width=300, height=300}
Display_width = App.screen.width*2
-- initialize source app with left side occupying entire window (half the display)
Current_app = 'source'
Editor_state = edit.initialize_test_state()
Editor_state.filename = 'foo'
Editor_state.left = Margin_left
Editor_state.right = App.screen.width - Margin_right
local old_editor_right = Editor_state.right
Text.redraw_all(Editor_state)
Log_browser_state = edit.initialize_test_state()
-- log browser has some arbitrary margins
Log_browser_state.left = 200 + Margin_left
Log_browser_state.right = 400
Text.redraw_all(Log_browser_state)
log_browser.parse(Log_browser_state)
-- display log browser
Current_time = Current_time + 0.1
App.run_after_keychord('C-l')
-- window width is doubled
check_eq(App.screen.width, 600, 'display:width')
-- left side margins are unchanged
check_eq(Editor_state.left, Margin_left, 'edit:left')
check_eq(Editor_state.right, old_editor_right, 'edit:right')
-- log browser margins are adjusted
check_eq(Log_browser_state.left, App.screen.width/2 + Margin_left, 'log:left')
check_eq(Log_browser_state.right, App.screen.width - Margin_right, 'log:right')
end
function test_show_log_browser_side_resizes_both_sides_if_cannot_double_window_width()
function test_show_log_browser_side_splits_window_width()
-- initialize screen dimensions and indicate that it is maximized
App.screen.init{width=300, height=300}
Display_width = 300
-- initialize source app with left side occupying more than half the display
Current_app = 'source'
Editor_state = edit.initialize_test_state()