sonic-bluestreak/sonic-bluestreak.love/core/modules/menusystem/textmenu.lua

222 lines
4.9 KiB
Lua
Raw Normal View History

local cwd = (...):gsub('%.textmenu$', '') .. "."
local Menu = require(cwd .. "parent")
local TextMenu = Menu:extend()
function TextMenu:new(menusystem, name, x, y, font, slots)
self.slots = slots
TextMenu.super.new(self, menusystem, name, x, y, 0, 0)
self.ox = x
self.oy = y
self.font = font
self.align = "left"
self.begin = 1
self:getBoundingBox()
end
function TextMenu:getBoundingBox()
self:setWidthAuto()
self.widget.h = self.font:getHeight()
self.h = self.widget.h * self.slots
if self.align == "right" then
self.x = self.ox - self.w
elseif self.align == "center" then
self.x = self.ox - self.w / 2
else
self.x = self.ox
end
self.y = self.oy
end
function TextMenu:centerText()
self:setAlign("center")
end
function TextMenu:setAlign(align)
self.align = align
self.font:setAlign("center")
end
function TextMenu:update(dt)
self:getBoundingBox()
if self.widget.selected ~= 0 then
if self.widget.selected < self.begin then
self.begin = self.widget.selected
end
if self.widget.selected > self.begin + self.slots - 1 then
self.begin = self.widget.selected - self.slots + 1
end
end
if self.begin < 1 then
self.begin = 1
end
end
function TextMenu:setWidthAuto()
local width = self.w
for i,v in ipairs(self.widget.list) do
local stringWidth = self.font:getWidth(v.beginlabel .. v.label .. v.endlabel)
width = math.max(stringWidth, width)
end
if width ~= self.w then
self.canvas.needRedraw = true
end
self.w = width
end
function TextMenu:getWidth()
self:setWidthAuto()
return self.w
end
function TextMenu:getHeight()
return self.h
end
function TextMenu:keyreleased(key, code)
if key == 'up' then
self:moveCursor(self.widget.selected - 1)
end
if key == 'down' then
self:moveCursor(self.widget.selected + 1)
end
if key == "A" then
if (self.widget.selected > 0) and (self.widget.selected <= #self.widget.list) then
self.widget.list[self.widget.selected]:action()
end
end
if key == "B" then
self:cancelAction()
end
end
function TextMenu:mousemoved(x, y)
local selectedPrevous = self.widget.selected
self.widget.selected = self.begin + math.floor(y / self.widget.h)
if self.widget.selected < 1 then
self.widget.selected = 1
end
if self.widget.selected > #self.widget.list then
self.widget.selected = #self.widget.list
end
if self.widget.selected ~= selectedPrevious then
self.canvas.needRedraw = true
end
end
function TextMenu:mousepressed(x, y, button, isTouch)
self.widget.selected = self.begin + math.floor(y / self.widget.h)
if self.widget.selected < 1 then
self.widget.selected = 1
end
if self.widget.selected > #self.widget.list then
self.widget.selected = #self.widget.list
end
if #self.widget.list > 0 then
self.widget.list[self.widget.selected]:action()
end
if self.widget.selected ~= selectedPrevious then
self.canvas.needRedraw = true
end
end
function TextMenu:drawCanvas()
print("redraw menu")
self.canvas.texture = love.graphics.newCanvas(self.w, self.h)
love.graphics.setCanvas( self.canvas.texture )
local ox, x
local widgety = 0
local ox = self.w / 2
local x = 0
self.font:set()
for i, v in ipairs(self.widget.list) do
if (i >= self.begin) and (i < self.begin + self.slots) then
self:drawWidget(i, widgety)
widgety = widgety + self.widget.h
end
end
utils.draw.resetColor()
love.graphics.setCanvas( )
end
function TextMenu:drawWidget(widgetID, y)
local widget = self.widget.list[widgetID]
print(widget)
if widget.canvas.needRedraw == true then
self:drawWidgetCanvas(widget)
widget.canvas.needRedraw = false
end
if self.widget.selected == widgetID and self.focus == true then
love.graphics.setColor(1, 1, 0, 1)
else
love.graphics.setColor(1, 1, 1, 1)
end
love.graphics.draw(widget.canvas.texture, 0, y)
end
function TextMenu:drawWidgetCanvas(widget)
widget.canvas.texture = love.graphics.newCanvas(self.w, self.widget.h)
love.graphics.setCanvas( widget.canvas.texture )
self.font:draw(widget.label, math.floor(self.w / 2), 0, -1, self.align)
self.font:draw(widget.beginlabel, math.floor(0), 0, -1, "left")
self.font:draw(widget.endlabel, math.floor(self.w), 0, -1, "right")
love.graphics.setCanvas( self.canvas.texture )
end
function TextMenu:resetView()
self.begin = 1
self.canvas.needRedraw = true
end
function Menu:moveView(begin, absolute)
--local absolute = absolute or true
self.widget.selected = 0
if (absolute) then
self.begin = begin
else
self.begin = self.begin + begin
end
-- ne sert à rien ici, c'est juste pour éviter des crash
self.canvas.needRedraw = true
end
function Menu:getView()
return self.begin
end
function Menu:isViewAtBeggining()
return (self.begin <= 1)
end
function Menu:isViewAtEnd()
return ((self.begin + self.slots) > (#self.widget.list))
end
return TextMenu