b3febf0fb3
Don't let every menus handle themselves if they have focus, it should be the menu system role to handle that
164 lines
4.2 KiB
Lua
164 lines
4.2 KiB
Lua
local cwd = (...):gsub('%.flowbox$', '') .. "."
|
|
local Menu = require(cwd .. "parent")
|
|
|
|
FlowBox = Menu:extend()
|
|
|
|
function FlowBox:new(menusystem, name, x, y, w, h, slots_hor, slots_vert)
|
|
self.slots = slots_hor * slots_vert
|
|
self.slots_hor = slots_hor
|
|
self.slots_vert = slots_vert
|
|
ListBox.super.new(self, menusystem, name, x, y, w, h)
|
|
self.begin = 1
|
|
self.widget.h = math.floor( self.h / slots_vert )
|
|
self.widget.w = math.floor( self.w / slots_hor )
|
|
self.h = slots_vert * self.widget.h -- On fait en sorte que la hauteur
|
|
self.w = slots_hor * self.widget.w -- et la largeur
|
|
-- soit un multiple du nombre de slot et de leur dimensions
|
|
end
|
|
|
|
function FlowBox:updateWidgetSize()
|
|
self.widget.h = math.floor( self.h / self.slots_vert )
|
|
self.widget.w = math.floor( self.w / self.slots_hor )
|
|
end
|
|
|
|
function FlowBox:update(dt)
|
|
local col, line = self:getCoord(self.widget.selected)
|
|
local begincol, beginline = self:getCoord(self.begin)
|
|
|
|
if line < beginline then
|
|
beginline = line
|
|
end
|
|
|
|
if line > beginline + self.slots_vert - 1 then
|
|
beginline = line - self.slots_vert + 1
|
|
end
|
|
|
|
if beginline < 0 then
|
|
beginline = 0
|
|
end
|
|
|
|
self.begin = beginline * self.slots_hor + 1
|
|
end
|
|
|
|
function FlowBox:getCoord(id_selected)
|
|
id_selected = id_selected - 1 -- On simplifie les calcul en prenant 0 comme départ
|
|
local line, col
|
|
line = math.floor(id_selected / self.slots_hor)
|
|
col = id_selected - (line * self.slots_hor)
|
|
return col, line
|
|
end
|
|
|
|
function FlowBox:moveCursor(new_col, new_line)
|
|
local col, line = self:getCoord(self.widget.selected)
|
|
local lastcol, lastline = self:getCoord(#self.widget.list)
|
|
|
|
|
|
if new_line < 0 then
|
|
new_line = lastline
|
|
end
|
|
|
|
if new_line > lastline then
|
|
new_line = 0
|
|
end
|
|
|
|
if (new_line == lastline) then
|
|
if new_col < 0 then
|
|
new_col = lastcol
|
|
end
|
|
|
|
if new_col > lastcol then
|
|
if (line == lastline) then
|
|
new_col = 0
|
|
else
|
|
new_col = lastcol
|
|
end
|
|
end
|
|
else
|
|
if new_col < 0 then
|
|
new_col = self.slots_hor - 1
|
|
end
|
|
|
|
if new_col == self.slots_hor then
|
|
new_col = 0
|
|
end
|
|
end
|
|
|
|
self.widget.selected = (new_line * self.slots_hor) + new_col + 1
|
|
end
|
|
|
|
function FlowBox:keyreleased(key, code)
|
|
local col, line = self:getCoord(self.widget.selected)
|
|
if key == 'left' then
|
|
self:moveCursor(col - 1, line)
|
|
end
|
|
|
|
if key == 'right' then
|
|
self:moveCursor(col + 1, line)
|
|
end
|
|
|
|
if key == 'up' then
|
|
self:moveCursor(col, line - 1)
|
|
end
|
|
|
|
if key == 'down' then
|
|
self:moveCursor(col, line + 1)
|
|
end
|
|
|
|
if key == "A" then
|
|
self.widget.list[self.widget.selected]:action()
|
|
end
|
|
end
|
|
|
|
function FlowBox:mousemoved(x, y)
|
|
local col, line = self:getCoord(self.widget.selected)
|
|
local begincol, beginline = self:getCoord(self.begin)
|
|
local newcol, newline, widget_selected
|
|
|
|
newline = beginline + math.floor(y / self.widget.h)
|
|
newcol = math.floor(x / self.widget.w)
|
|
widget_selected = (newline * self.slots_hor) + newcol + 1
|
|
|
|
if widget_selected >= 1 and widget_selected <= #self.widget.list then
|
|
self.widget.selected = widget_selected
|
|
self:getFocus()
|
|
end
|
|
end
|
|
|
|
function FlowBox:mousepressed(x, y, button, isTouch)
|
|
local col, line = self:getCoord(self.widget.selected)
|
|
local begincol, beginline = self:getCoord(self.begin)
|
|
local newline, newcol, widget_selected
|
|
|
|
newline = beginline + math.floor(y / self.widget.h)
|
|
newcol = math.floor(x / self.widget.w)
|
|
widget_selected = (newline * self.slots_hor) + newcol + 1
|
|
|
|
if widget_selected >= 1 and widget_selected <= #self.widget.list then
|
|
self.widget.selected = widget_selected
|
|
self:getFocus()
|
|
self.widget.list[self.widget.selected]:action()
|
|
end
|
|
|
|
end
|
|
|
|
function FlowBox:draw()
|
|
local widgety = self.y
|
|
local widgetx = self.x
|
|
for i,v in ipairs(self.widget.list) do
|
|
if (i >= self.begin) and (i < self.begin + self.slots) then
|
|
v:draw(widgetx, widgety, self.widget.w, self.widget.h)
|
|
if self.widget.selected == i and self:haveFocus() == true then
|
|
v:drawSelected(widgetx, widgety, self.widget.w, self.widget.h)
|
|
else
|
|
v:draw(widgetx, widgety, self.widget.w, self.widget.h)
|
|
end
|
|
widgetx = widgetx + self.widget.w
|
|
if widgetx == (self.x + self.w) then
|
|
widgetx = self.x
|
|
widgety = widgety + self.widget.h
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return FlowBox
|