lay out buttons based on device dimensions

This commit is contained in:
Kartik K. Agaram 2023-11-22 12:38:16 -08:00
parent 0d4500e41d
commit d98bc8cc7d
16 changed files with 163 additions and 45 deletions

View File

@ -1,5 +1,6 @@
on.draw = function()
Global_state.button_handlers = {}
Overflow_button = nil
love.graphics.setBackgroundColor(Background_color.r, Background_color.g, Background_color.b)
draw_canvas()
App.color(Foreground_color)

View File

@ -2,6 +2,7 @@ on.mouse_press = function(x,y, mouse_button)
if mouse_press_consumed_by_any_button_handler(Global_state, x,y, mouse_button) then
return
end
Show_overflow = false
if mouse_on_any_slider(x,y, mouse_button) then
return
end

View File

@ -1,33 +1,41 @@
draw_menu = function()
App.color(Menu_background)
love.graphics.rectangle('fill', 0,0, App.screen.width, Menu_bottom)
local x = Menu_left+5
-- settings button on right
local w = App.width('settings')
local r = Safe_width-w-10-5
settings_button(r, w)
local x, y = Menu_left+5, Menu_top+5
-- main menu on left
App.color(White)
love.graphics.print(Current_pane_index, x+5, Menu_top+5+2)
App.color(Normal_color)
x = x+5 + App.width(tostring(Current_pane_index)) + 10
-- main buttons
x = run_button(x)
x = stop_button(x)
x = run_button(x, y, r)
x = stop_button(x, y, r)
App.color{r=0.5, g=0.5, b=0.5}
love.graphics.print('code', x, Menu_top+5)
love.graphics.print('code', x, y)
x = x+App.width('code')+10
-- assume screen will always be wide enough to print this far without overflow
if Show_code then
x = hide_code_button(x)
x, y = hide_code_button(x, y, r)
else
x = show_code_button(x)
x, y = show_code_button(x, y, r)
end
x = copy_button(x)
x = paste_button(x)
x = clear_pane_button(x)
App.color{r=0.5, g=0.5, b=0.5}
love.graphics.print('screen', x, Menu_top+5)
x = x+App.width('screen')+10
x = new_pane_button(x)
x = delete_pane_button(x)
-- settings button on right
local w = App.width('settings')
settings_button(Safe_width-w-10-5, w)
x, y = copy_button(x, y, r)
x, y = paste_button(x, y, r)
x, y = clear_pane_button(x, y, r)
if not Overflow_button then
local w = App.width('screen')+10
local w2 = App.width('>>')+10
if x+w+10+w2+10 < r then
App.color{r=0.5, g=0.5, b=0.5}
love.graphics.print('screen', x, y)
x = x+App.width('screen')+10
end
end
x, y = new_pane_button(x, y, r)
x, y = delete_pane_button(x, y, r)
-- nav buttons along sides
if Current_pane_index > 1 then
previous_pane_button()

View File

@ -1,6 +1,6 @@
run_button = function(x)
run_button = function(x, y)
local w = App.width('run')+10
button(Global_state, 'run', {x=x, y=Menu_top+5, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
button(Global_state, 'run', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
@ -33,5 +33,5 @@ run_button = function(x)
love.graphics.setCanvas()
end,
})
return x+w+10
return x+w+10, y
end

View File

@ -1,6 +1,15 @@
new_pane_button = function(x)
new_pane_button = function(x, y, r)
local w = App.width('new')+10
button(Global_state, 'new', {x=x, y=Menu_top+5, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
local x2, y2 = maybe_draw_overflow_button(x, y, w, r)
if Overflow_button then
-- overflow
if not Show_overflow then
return x, y
else
y = y2
end
end
button(Global_state, 'new', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
@ -12,5 +21,9 @@ new_pane_button = function(x)
Current_pane = Panes[Current_pane_index]
end,
})
return x+w+10
if Overflow_button then
return x, y+Line_height
else
return x+w+10, y
end
end

View File

@ -1,6 +1,6 @@
show_code_button = function(x)
show_code_button = function(x, y)
local w = App.width('show')+10
button(Global_state, 'show', {x=x, y=Menu_top+5, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
button(Global_state, 'show', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
@ -10,5 +10,5 @@ show_code_button = function(x)
Show_code = true
end,
})
return x+w+10
return x+w+10, y+Line_height
end

View File

@ -1,6 +1,13 @@
hide_code_button = function(x)
hide_code_button = function(x, y, r)
local w = App.width('hide')+10
button(Global_state, 'hide', {x=x, y=Menu_top+5, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
local x2, y2 = maybe_draw_overflow_button(x, y, w, r)
if Overflow_button then
-- overflow
if not Show_overflow then
return x, y
end
end
button(Global_state, 'hide', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
@ -10,5 +17,9 @@ hide_code_button = function(x)
Show_code = false
end,
})
return x+w+10
if Overflow_button then
return x, y+Line_height
else
return x+w+10, y
end
end

View File

@ -1,6 +1,13 @@
copy_button = function(x)
copy_button = function(x, y, r)
local w = App.width('copy')+10
button(Global_state, 'copy', {x=x, y=Menu_top+5, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
local x2, y2 = maybe_draw_overflow_button(x, y, w, r)
if Overflow_button then
-- overflow
if not Show_overflow then
return x, y
end
end
button(Global_state, 'copy', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
@ -11,5 +18,9 @@ copy_button = function(x)
if s then App.set_clipboard(s) end
end,
})
return x+w+10
if Overflow_button then
return x, y+Line_height
else
return x+w+10, y
end
end

View File

@ -1,6 +1,15 @@
paste_button = function(x)
paste_button = function(x, y, r)
local w = App.width('paste')+10
button(Global_state, 'paste', {x=x, y=Menu_top+5, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
local x2, y2 = maybe_draw_overflow_button(x, y, w, r)
if Overflow_button then
-- overflow
if not Show_overflow then
return x, y
else
y = y2
end
end
button(Global_state, 'paste', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
@ -11,5 +20,10 @@ paste_button = function(x)
Text.insert_text(Current_pane.editor_state, s)
end,
})
return x+w+10
if Overflow_button then
-- we're past the overflow button; start drawing downward
return x, y+Line_height
else
return x+w+10, y
end
end

View File

@ -1,6 +1,15 @@
clear_pane_button = function(x)
clear_pane_button = function(x, y, r)
local w = App.width('clear')+10
button(Global_state, 'clear', {x=x, y=Menu_top+5, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
local x2, y2 = maybe_draw_overflow_button(x, y, w, r)
if Overflow_button then
-- overflow
if not Show_overflow then
return x, y
else
y = y2
end
end
button(Global_state, 'clear', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
@ -8,5 +17,9 @@ clear_pane_button = function(x)
end,
onpress1 = clear_pane,
})
return x+w+10
if Overflow_button then
return x, y+Line_height
else
return x+w+10, y
end
end

View File

@ -1,6 +1,15 @@
delete_pane_button = function(x)
delete_pane_button = function(x, y, r)
local w = App.width('delete')+10
button(Global_state, 'delete', {x=x, y=Menu_top+5, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
local x2, y2 = maybe_draw_overflow_button(x, y, w, r, --[[final button]] true)
if Overflow_button then
-- overflow
if Show_overflow then
y = y2
else
return x, y
end
end
button(Global_state, 'delete', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
@ -17,5 +26,9 @@ delete_pane_button = function(x)
Current_pane = Panes[Current_pane_index]
end,
})
return x+w+10
if Overflow_button then
return x, y+Line_height
else
return x+w+10, y
end
end

View File

@ -1,6 +1,6 @@
stop_button = function(x)
stop_button = function(x, y)
local w = App.width('stop')+10
button(Global_state, 'stop', {x=x, y=Menu_top+5, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
button(Global_state, 'stop', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
@ -8,5 +8,5 @@ stop_button = function(x)
end,
onpress1 = clear_handlers,
})
return x+w+10
return x+w+10, y
end

2
0107-Show_overflow Normal file
View File

@ -0,0 +1,2 @@
-- True if the overflow menu has been opened and we want to render buttons within it.
Show_overflow = false

1
0108-Overflow_button Normal file
View File

@ -0,0 +1 @@
Overflow_button = nil -- location and dimensions of the overflow button if it's been drawn this frame

14
0109-overflow_button Normal file
View File

@ -0,0 +1,14 @@
overflow_button = function(x, y)
local w = App.width('>>')+10
button(Global_state, 'overflow', {x=x, y=y, w=w, h=Line_height, bg={r=0.6, g=0.8, b=0.6},
icon = function(p)
App.color(Normal_color)
love.graphics.rectangle('line', p.x,p.y, p.w,p.h, 2,2)
love.graphics.print('>>', p.x+5,p.y+2)
end,
onpress1 = function()
Show_overflow = not Show_overflow
end,
})
return x+w+10, y+Line_height
end

View File

@ -0,0 +1,16 @@
maybe_draw_overflow_button = function(x, y, w, r, final_button)
if Overflow_button then return x, y end
local after = x+w+10
if not final_button then
local w2 = App.width('>>')+10
-- only draw a button if there's going to be at least space for the overflow button afterwards
after = after+w2+10
end
if after > r then
x, y = overflow_button(x, y)
Overflow_button = Global_state.button_handlers[#Global_state.button_handlers]
return x, y
else
return x, y
end
end