diff --git a/sonic-boost.love/core/modules/menusystem/grid.lua b/sonic-boost.love/core/modules/menusystem/grid.lua index e0657c6..841f7d9 100644 --- a/sonic-boost.love/core/modules/menusystem/grid.lua +++ b/sonic-boost.love/core/modules/menusystem/grid.lua @@ -3,13 +3,15 @@ local Menu = require(cwd .. "parent") local GridBox = Menu:extend() +local menuutils = require(cwd .. "widgets.utils") + function GridBox:new(menusystem, name, x, y, w, h, colNumber, lineNumber) self.view = {} self.view.slotNumber = colNumber * lineNumber self.view.colNumber = colNumber self.view.lineNumber = lineNumber + self.view.firstSlot = 1 GridBox.super.new(self, menusystem, name, x, y, w, h) - self.begin = 1 self.h = lineNumber * self.widget.h -- On fait en sorte que la hauteur self.w = colNumber * self.widget.w -- et la largeur -- soit un multiple du nombre de slot et de leur dimensions @@ -39,6 +41,19 @@ function GridBox:getWidgetSize(id) return self.widget.w * self.slots[slot].width, self.widget.h * self.slots[slot].height end +function GridBox:getWidgetID(slot) + if (self.slots[slot].isChild == 0) then + return self.slots[slot].widgetID + else + return self.slots[self.slots[slot].isChild].widgetID + end +end + +function GridBox:haveWidget(slot) + local id = self:getWidgetID(slot) + return self.widget.list[id] ~= nil +end + function GridBox:getWidgetSlot(widgetID) local slot = 0 for i,v in ipairs(self.slots) do @@ -51,7 +66,7 @@ function GridBox:getWidgetSlot(widgetID) end function GridBox:update(dt) - self.begin = 1 + self.view.firstSlot = 1 local slotID = self:getSlotbyCoord(self.cursor.x, self.cursor.y) if self.slots[slotID].isChild > 0 then slotID = self.slots[slotID].isChild @@ -173,14 +188,21 @@ end function GridBox:mousemoved(x, y) local col, line = self:getCoord(self.widget.selected) - local begincol, beginline = self:getCoord(self.begin) + local begincol, beginline = self:getCoord(self.view.firstSlot) local newcol, newline local newselect, slotID newline = beginline + math.floor(y / self.widget.h) newcol = math.floor(x / self.widget.w) - self.cursor.x = newcol - self.cursor.y = newline + newselect = (newline * self.view.colNumber) + newcol + 1 + + if self:haveWidget(newselect) then + self.cursor.x = newcol + self.cursor.y = newline + end + print(self:haveWidget(newselect), newselect) + + self:getFocus() if self.widget.selected < 1 then self.widget.selected = 1 @@ -193,7 +215,7 @@ end function GridBox:mousepressed(x, y, button, isTouch) local col, line = self:getCoord(self.widget.selected) - local begincol, beginline = self:getCoord(self.begin) + local begincol, beginline = self:getCoord(self.view.firstSlot) local newcol, newline local newselect, slotID @@ -201,6 +223,8 @@ function GridBox:mousepressed(x, y, button, isTouch) newcol = math.floor(x / self.widget.w) newselect = (newline * self.view.colNumber) + newcol + 1 + self:getFocus() + if self.slots[newselect].isChild > 0 then slotID = self.slots[newselect].isChild else @@ -249,4 +273,16 @@ function GridBox:draw() end end +function GridBox:drawCursor() + self:updateView() + local begincol, beginline = self:getCoord(self.view.firstSlot) + if (self.widget.selected >= 1 and self.widget.selected <= #self.widget.list) then + local w, h = self:getWidgetSize(self.widget.selected) + local col, line = self:getCoord(self.widget.selected) + local x = (col) * h + local y = (line - beginline) * h + menuutils.drawCursor(self.x + x, self.y + y, w, h) + end +end + return GridBox