core/menusystem: add cursor in gridbox
This commit is contained in:
parent
fe7f4b1f87
commit
92bea8c2cd
1 changed files with 42 additions and 6 deletions
|
@ -3,13 +3,15 @@ local Menu = require(cwd .. "parent")
|
||||||
|
|
||||||
local GridBox = Menu:extend()
|
local GridBox = Menu:extend()
|
||||||
|
|
||||||
|
local menuutils = require(cwd .. "widgets.utils")
|
||||||
|
|
||||||
function GridBox:new(menusystem, name, x, y, w, h, colNumber, lineNumber)
|
function GridBox:new(menusystem, name, x, y, w, h, colNumber, lineNumber)
|
||||||
self.view = {}
|
self.view = {}
|
||||||
self.view.slotNumber = colNumber * lineNumber
|
self.view.slotNumber = colNumber * lineNumber
|
||||||
self.view.colNumber = colNumber
|
self.view.colNumber = colNumber
|
||||||
self.view.lineNumber = lineNumber
|
self.view.lineNumber = lineNumber
|
||||||
|
self.view.firstSlot = 1
|
||||||
GridBox.super.new(self, menusystem, name, x, y, w, h)
|
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.h = lineNumber * self.widget.h -- On fait en sorte que la hauteur
|
||||||
self.w = colNumber * self.widget.w -- et la largeur
|
self.w = colNumber * self.widget.w -- et la largeur
|
||||||
-- soit un multiple du nombre de slot et de leur dimensions
|
-- 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
|
return self.widget.w * self.slots[slot].width, self.widget.h * self.slots[slot].height
|
||||||
end
|
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)
|
function GridBox:getWidgetSlot(widgetID)
|
||||||
local slot = 0
|
local slot = 0
|
||||||
for i,v in ipairs(self.slots) do
|
for i,v in ipairs(self.slots) do
|
||||||
|
@ -51,7 +66,7 @@ function GridBox:getWidgetSlot(widgetID)
|
||||||
end
|
end
|
||||||
|
|
||||||
function GridBox:update(dt)
|
function GridBox:update(dt)
|
||||||
self.begin = 1
|
self.view.firstSlot = 1
|
||||||
local slotID = self:getSlotbyCoord(self.cursor.x, self.cursor.y)
|
local slotID = self:getSlotbyCoord(self.cursor.x, self.cursor.y)
|
||||||
if self.slots[slotID].isChild > 0 then
|
if self.slots[slotID].isChild > 0 then
|
||||||
slotID = self.slots[slotID].isChild
|
slotID = self.slots[slotID].isChild
|
||||||
|
@ -173,14 +188,21 @@ end
|
||||||
|
|
||||||
function GridBox:mousemoved(x, y)
|
function GridBox:mousemoved(x, y)
|
||||||
local col, line = self:getCoord(self.widget.selected)
|
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 newcol, newline
|
||||||
local newselect, slotID
|
local newselect, slotID
|
||||||
|
|
||||||
newline = beginline + math.floor(y / self.widget.h)
|
newline = beginline + math.floor(y / self.widget.h)
|
||||||
newcol = math.floor(x / self.widget.w)
|
newcol = math.floor(x / self.widget.w)
|
||||||
|
newselect = (newline * self.view.colNumber) + newcol + 1
|
||||||
|
|
||||||
|
if self:haveWidget(newselect) then
|
||||||
self.cursor.x = newcol
|
self.cursor.x = newcol
|
||||||
self.cursor.y = newline
|
self.cursor.y = newline
|
||||||
|
end
|
||||||
|
print(self:haveWidget(newselect), newselect)
|
||||||
|
|
||||||
|
self:getFocus()
|
||||||
|
|
||||||
if self.widget.selected < 1 then
|
if self.widget.selected < 1 then
|
||||||
self.widget.selected = 1
|
self.widget.selected = 1
|
||||||
|
@ -193,7 +215,7 @@ end
|
||||||
|
|
||||||
function GridBox:mousepressed(x, y, button, isTouch)
|
function GridBox:mousepressed(x, y, button, isTouch)
|
||||||
local col, line = self:getCoord(self.widget.selected)
|
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 newcol, newline
|
||||||
local newselect, slotID
|
local newselect, slotID
|
||||||
|
|
||||||
|
@ -201,6 +223,8 @@ function GridBox:mousepressed(x, y, button, isTouch)
|
||||||
newcol = math.floor(x / self.widget.w)
|
newcol = math.floor(x / self.widget.w)
|
||||||
newselect = (newline * self.view.colNumber) + newcol + 1
|
newselect = (newline * self.view.colNumber) + newcol + 1
|
||||||
|
|
||||||
|
self:getFocus()
|
||||||
|
|
||||||
if self.slots[newselect].isChild > 0 then
|
if self.slots[newselect].isChild > 0 then
|
||||||
slotID = self.slots[newselect].isChild
|
slotID = self.slots[newselect].isChild
|
||||||
else
|
else
|
||||||
|
@ -249,4 +273,16 @@ function GridBox:draw()
|
||||||
end
|
end
|
||||||
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
|
return GridBox
|
||||||
|
|
Loading…
Reference in a new issue