222 lines
4.9 KiB
Lua
222 lines
4.9 KiB
Lua
|
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
|