local cwd = (...):gsub('%.listbox$', '') .. "." local Menu = require(cwd .. "parent") local menuutils = require(cwd .. "widgets.utils") local ListBox = Menu:extend() function ListBox:new(menusystem, name, x, y, w, h, slotNumber) self.view = {} self.view.slotNumber = slotNumber self.view.firstSlot = 1 ListBox.super.new(self, menusystem, name, x, y, w, h) self.h = slotNumber * self.widget.h -- On fait en sorte que la hauteur -- soit un multiple du nombre de slot et de leur hauteur end function ListBox:updateWidgetSize() self.widget.h = math.floor( self.h / self.view.slotNumber ) self.widget.w = self.w end function ListBox:update(dt) self:updateView() end function ListBox:updateView() if self.widget.selected < self.view.firstSlot then self.view.firstSlot = self.widget.selected end if self.widget.selected > self.view.firstSlot + self.view.slotNumber - 1 then self.view.firstSlot = self.widget.selected - self.view.slotNumber + 1 end if self.view.firstSlot < 1 then self.view.firstSlot = 1 end end function ListBox: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 >= 1 and self.widget.selected <= #self.widget.list) then self.widget.list[self.widget.selected]:action() end end end function ListBox:mousemoved(x, y) local widget_selected = self.view.firstSlot + math.floor(y / self.widget.h) if widget_selected >= 1 and widget_selected <= #self.widget.list then self.widget.selected = widget_selected self:getFocus() end end function ListBox:mousepressed(x, y, button, isTouch) local widget_selected = self.view.firstSlot + math.floor(y / self.widget.h) if widget_selected >= 1 and widget_selected <= #self.widget.list then self.widget.selected = widget_selected self:getFocus() if #self.widget.list > 0 then self.widget.list[self.widget.selected]:action() end end end function ListBox:draw() self:updateView() local widgety = self.y for i,v in ipairs(self.widget.list) do if (i >= self.view.firstSlot) and (i < self.view.firstSlot + self.view.slotNumber) then v:draw(self.x, widgety, self.w, self.widget.h) if self.widget.selected == i and self:haveFocus() == true then v:drawSelected(self.x, widgety, self.w, self.widget.h) else v:draw(self.x, widgety, self.w, self.widget.h) end widgety = widgety + self.widget.h end end end function ListBox:drawCursor() self:updateView() if (self.widget.selected >= 1 and self.widget.selected <= #self.widget.list) then local w, h = self:getWidgetSize() local y = (self.widget.selected - self.view.firstSlot) * h menuutils.drawCursor(self.x,self.y + y, w, h) end end return ListBox