187 lines
4.8 KiB
Lua
187 lines
4.8 KiB
Lua
--UI for selecting a saved game.
|
|
local love = love
|
|
local loadGame = {}
|
|
local _Update
|
|
local _Draw
|
|
local _MousePressed
|
|
local _MouseMoved
|
|
local _Resize
|
|
local _KeyPressed
|
|
|
|
local function RestoreMainState()
|
|
love.update = _Update
|
|
love.draw = _Draw
|
|
love.mousepressed = _MousePressed
|
|
love.mousemoved = _MouseMoved
|
|
love.keypressed = _KeyPressed
|
|
love.resize = _Resize
|
|
love.mousemoved = nil
|
|
love.mouse.setRelativeMode( true )
|
|
end
|
|
|
|
local selectedGame = 1
|
|
local scrollOffset = 1
|
|
local deleteGame = false
|
|
local gameList = assert( love.filesystem.getDirectoryItems( "demos" ) )
|
|
local mouseX, mouseY = 0, 0
|
|
local w, h = love.graphics.getDimensions()
|
|
local canvas = love.graphics.newCanvas( w, h * (1 + #gameList) / 10.0 )
|
|
local font = love.graphics.newFont( 36 )
|
|
local deleteIcon = love.graphics.newImage( "sitelenpona/ala.png" )
|
|
local playIcon = love.graphics.newImage( "sitelenpona/li.png" )
|
|
local OnClick
|
|
|
|
|
|
local function DeleteLeft()
|
|
return love.graphics.getWidth() * 0.75 + 15 + 6
|
|
end
|
|
|
|
local function DeleteRight()
|
|
return DeleteLeft() + h / 10 - 12
|
|
end
|
|
|
|
local function DrawSelection( )
|
|
love.graphics.rectangle( "fill", 15, selectedGame * h / 10 )
|
|
end
|
|
|
|
local function PopulateGameList()
|
|
scrollOffset = 0
|
|
gameList = assert( love.filesystem.getDirectoryItems( "demos" ) )
|
|
|
|
local w, h = love.graphics.getDimensions()
|
|
|
|
canvas = love.graphics.newCanvas( w, h * (1 + #gameList) / 10.0 )
|
|
love.graphics.setCanvas( canvas )
|
|
love.graphics.clear()
|
|
love.graphics.setColor( 1, 1, 1, 1 )
|
|
love.graphics.setLineWidth( 3 )
|
|
|
|
for i, name in ipairs( gameList ) do
|
|
local x, y = 15, i * h / 10
|
|
|
|
love.graphics.printf( gameList[i], font, x + 10, y, 0.75 * w, "left" )
|
|
love.graphics.draw( deleteIcon, DeleteLeft() - 8, y - 8, 0, 0.25, 0.25 )
|
|
end
|
|
|
|
love.graphics.setCanvas()
|
|
end
|
|
|
|
|
|
local resizeLoadMenu = function( newWidth, newHeight )
|
|
_Resize(newWidth, newHeight )
|
|
w, h = love.graphics.getDimensions()
|
|
canvas = love.graphics.newCanvas( w, h * (1 + #gameList) / 10.0 )
|
|
return PopulateGameList()
|
|
end
|
|
|
|
local updateLoadMenu = function() end
|
|
|
|
local drawLoadGameMenu = function()
|
|
local w, h = love.graphics.getDimensions()
|
|
love.graphics.setColor( 1, 1, 1, 1 )
|
|
if options["high contrast"].value then
|
|
love.graphics.setColor( 0,0,0, 1 )
|
|
end
|
|
love.graphics.draw( canvas, 0, 15 - scrollOffset * h / 10 )
|
|
|
|
|
|
|
|
love.graphics.setColor( 1.0, 1.0, 1.0, 1.0 )
|
|
love.graphics.rectangle( "fill", 0, 0, w, 10 + h / 10 - 6 )
|
|
love.graphics.setColor( 91 / 255, 206 / 255, 250 / 255 )--
|
|
love.graphics.print( "BACK")
|
|
|
|
if not selectedGame then return end
|
|
love.graphics.setColor( 1, 1, 1, 0.4 )
|
|
if deleteGame then
|
|
love.graphics.rectangle( "fill",
|
|
DeleteLeft(), 15 + ( selectedGame - scrollOffset ) * h / 10,
|
|
48, 48,
|
|
10, 10 )
|
|
else
|
|
love.graphics.rectangle( "fill", 15, 15 + ( selectedGame - scrollOffset ) * h / 10, w * 0.75,
|
|
--h / 10 - 12, 10, 10 )
|
|
48, 10, 10)
|
|
end
|
|
|
|
|
|
end
|
|
|
|
local mouseMoved = function( x, y, dx, dy, istouch)
|
|
deleteGame = ( x > DeleteLeft() )
|
|
selectedGame = math.max( math.min( #gameList, scrollOffset + math.floor( 10 * ( y - 15 ) / h ) ), 1)
|
|
if y < 4 + h / 10 then selectedGame = nil end
|
|
end
|
|
|
|
local KeyPress = function( key, code, isRepeat )
|
|
if code == "return" then
|
|
return OnClick()
|
|
end
|
|
|
|
if not selectedGame then selectedGame = 1 end
|
|
|
|
if code == "down" then
|
|
|
|
if selectedGame < #gameList then
|
|
if selectedGame > 8 then
|
|
scrollOffset = scrollOffset + 1
|
|
end
|
|
selectedGame = selectedGame + 1
|
|
end
|
|
return
|
|
end
|
|
if code == "up" then
|
|
if selectedGame > 9 then
|
|
scrollOffset = scrollOffset - 1
|
|
end
|
|
if selectedGame > 1 then
|
|
selectedGame = selectedGame - 1
|
|
end
|
|
return
|
|
end
|
|
if code == "left" then deleteGame = false end
|
|
if code == "right" then deleteGame = true end
|
|
if code == "escape" or code == "backspace" then return RestoreMainState() end
|
|
end
|
|
|
|
|
|
OnClick = function( x, y, button, istouch, presses )
|
|
if y and y < 4 + h / 10 then return RestoreMainState() end
|
|
if not selectedGame then return end
|
|
if #gameList < 1 then return end
|
|
|
|
if deleteGame then
|
|
love.filesystem.remove( "demos/"..gameList[selectedGame] )
|
|
return PopulateGameList()
|
|
end
|
|
|
|
--Restore main state.
|
|
RestoreMainState()
|
|
return "demos/"..gameList[selectedGame]
|
|
|
|
end
|
|
|
|
|
|
local wheelMoved = function(x, y)
|
|
--scrollOffset = math.max( 0, math.min( #gameList, scrollOffset - y * 0.1 ) )
|
|
end
|
|
|
|
local function LoadGameMenu()
|
|
_Update = love.update
|
|
_Draw = love.draw
|
|
_MousePressed = love.mousepressed
|
|
_MouseMoved = love.mousemoved
|
|
_Resize = love.resize
|
|
_KeyPressed = love.keypressed
|
|
love.mouse.setRelativeMode( false )
|
|
|
|
love.wheelmoved = wheelMoved
|
|
love.mousemoved = mouseMoved
|
|
love.draw = drawLoadGameMenu
|
|
love.update = updateLoadMenu
|
|
love.resize = resizeLoadMenu
|
|
PopulateGameList()
|
|
|
|
end
|
|
|
|
return { OnClick = OnClick, KeyPress = KeyPress, LoadGameMenu = LoadGameMenu } |