fix: remove stuff removed from Radiance's birb
This commit is contained in:
parent
5178ee0020
commit
a315fcebb5
12 changed files with 0 additions and 1810 deletions
|
@ -1,10 +0,0 @@
|
||||||
local Color = Object:extend()
|
|
||||||
|
|
||||||
Color.BLACK = Color(0,0,0)
|
|
||||||
Color.WHITE = Color(1,1,1)
|
|
||||||
|
|
||||||
function Color:new(r, g, b, a)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
return Color
|
|
|
@ -1,87 +0,0 @@
|
||||||
-- modules/gamesystem :: a simple save system, based on the Deserialization feature
|
|
||||||
|
|
||||||
--[[
|
|
||||||
Copyright © 2021 Kazhnuz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local GameSystem = require("birb.classes.serializable.serializer"):extend()
|
|
||||||
|
|
||||||
function GameSystem:new(varToSerialize, slotNumber)
|
|
||||||
self.slot = -1
|
|
||||||
self.slotNumber = slotNumber or 1
|
|
||||||
self.version = core.conf.gameversion or "N/A"
|
|
||||||
self.gametime = 0
|
|
||||||
varToSerialize = varToSerialize or {}
|
|
||||||
GameSystem.super.new(self, varToSerialize)
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:reload()
|
|
||||||
self:read(self.slot)
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:read(save_id)
|
|
||||||
self.slot = save_id
|
|
||||||
if (self.slot > 0) then
|
|
||||||
self:deserialize(self:getSaveName())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:deleteCurrentSave()
|
|
||||||
if (self.slot > 0) then
|
|
||||||
self:delete(self:getSaveName())
|
|
||||||
self.metadata:remove(self.slot)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:write()
|
|
||||||
if (self.slot > 0) then
|
|
||||||
self:serialize(self:getSaveName())
|
|
||||||
self.metadata:update()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:getSaveName(saveslot)
|
|
||||||
local saveslot = saveslot or self.slot
|
|
||||||
return "save" .. saveslot .. ".save"
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:resetSaves()
|
|
||||||
for i = 1, self.slotNumber do
|
|
||||||
self:delete(self:getSaveName(i))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:update(dt)
|
|
||||||
self.gametime = self.gametime + dt
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:getTime()
|
|
||||||
return utils.time.getFields(self.gametime)
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:getTimeString()
|
|
||||||
return utils.time.toString(self.gametime)
|
|
||||||
end
|
|
||||||
|
|
||||||
function GameSystem:printTime()
|
|
||||||
core.debug:print(self:getTimeString())
|
|
||||||
end
|
|
||||||
|
|
||||||
return GameSystem
|
|
|
@ -1,107 +0,0 @@
|
||||||
local GuiScreen = Object:extend()
|
|
||||||
local ElementList = require "birb.modules.gui.mixins.elements"
|
|
||||||
local ScreenList = require "birb.modules.gui.mixins.screens"
|
|
||||||
GuiScreen:implement(ScreenList)
|
|
||||||
GuiScreen:implement(ElementList)
|
|
||||||
|
|
||||||
local TweenManager = require "birb.classes.time"
|
|
||||||
|
|
||||||
local elementDataStruct = require "birb.structures.elementData"
|
|
||||||
|
|
||||||
|
|
||||||
function GuiScreen:new(name, controller)
|
|
||||||
self:initWrapper()
|
|
||||||
self.controller = controller or self.gui
|
|
||||||
self.name = name
|
|
||||||
self.isVisible = false
|
|
||||||
self.transforms = {}
|
|
||||||
self.tweens = TweenManager(self)
|
|
||||||
|
|
||||||
self:reset()
|
|
||||||
self:registerElements()
|
|
||||||
self.controller:addScreen(name, self)
|
|
||||||
end
|
|
||||||
|
|
||||||
function GuiScreen:initWrapper()
|
|
||||||
local scene = core.scenemanager:getScene()
|
|
||||||
self.scene = scene
|
|
||||||
self.gui = scene.gui
|
|
||||||
self.assets = scene.assets
|
|
||||||
end
|
|
||||||
|
|
||||||
function GuiScreen:update(dt)
|
|
||||||
self.tweens:update(dt)
|
|
||||||
for _, screen in pairs(self.screens) do
|
|
||||||
if (screen ~= nil) then
|
|
||||||
screen:update(dt)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GuiScreen:show()
|
|
||||||
if (not self.isVisible) then
|
|
||||||
self.isVisible = true
|
|
||||||
if (self.transforms["show"] ~= nil) then
|
|
||||||
self:playTransform("show")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GuiScreen:hide()
|
|
||||||
if (self.isVisible) then
|
|
||||||
if (self.transforms["hide"] ~= nil) then
|
|
||||||
local time = self:playTransform("hide")
|
|
||||||
print(time)
|
|
||||||
self.tweens:newFunc(time, "hide", function ()
|
|
||||||
self.isVisible = false
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GuiScreen:addTransform(name, transform)
|
|
||||||
self.transforms[name] = transform
|
|
||||||
end
|
|
||||||
|
|
||||||
function GuiScreen:playTransform(name, delay)
|
|
||||||
return self.gui:transform(self.transforms[name], delay)
|
|
||||||
end
|
|
||||||
|
|
||||||
function GuiScreen:reset()
|
|
||||||
self:initElements()
|
|
||||||
self:initScreens()
|
|
||||||
end
|
|
||||||
|
|
||||||
function GuiScreen:registerElements()
|
|
||||||
local elementList = self:createElements()
|
|
||||||
for _, rawElement in ipairs(elementList) do
|
|
||||||
if (rawElement.is ~= nil) then
|
|
||||||
self:addElement(rawElement.name, rawElement)
|
|
||||||
rawElement.screen = self
|
|
||||||
else
|
|
||||||
local elemData = utils.table.parse(rawElement, elementDataStruct, 3)
|
|
||||||
local element = elemData.element
|
|
||||||
self:addElement(element.name, element)
|
|
||||||
if (elemData.focus == true) then
|
|
||||||
element:getFocus()
|
|
||||||
end
|
|
||||||
if (elemData.delay > 0) then
|
|
||||||
element.isVisible = false
|
|
||||||
element:newSwitch(elemData.delay, {"isVisible"})
|
|
||||||
end
|
|
||||||
if (elemData.depth ~= nil) then
|
|
||||||
element.depth = elemData.depth
|
|
||||||
end
|
|
||||||
if (elemData.keypress ~= nil) then
|
|
||||||
element:setKeyPressAction(elemData.keypress)
|
|
||||||
end
|
|
||||||
element.screen = self
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GuiScreen:createElements()
|
|
||||||
-- Empty function
|
|
||||||
end
|
|
||||||
|
|
||||||
return GuiScreen
|
|
|
@ -1,231 +0,0 @@
|
||||||
-- flowbox :: flexible box menu, that handle in grid the widgets
|
|
||||||
|
|
||||||
--[[
|
|
||||||
Copyright © 2019 Kazhnuz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local cwd = (...):gsub('%.flowbox$', '') .. "."
|
|
||||||
|
|
||||||
local Menu = require(cwd .. "parent")
|
|
||||||
local FlowBox = Menu:extend()
|
|
||||||
|
|
||||||
local menuutils = require(cwd .. "widgets.utils")
|
|
||||||
|
|
||||||
-- INIT FUNCTIONS
|
|
||||||
-- Initialize and configure the flowbox
|
|
||||||
|
|
||||||
function FlowBox:new(menusystem, name, x, y, w, h, slots_hor, slots_vert)
|
|
||||||
self.view = {}
|
|
||||||
self.view.slotNumber = slots_hor * slots_vert
|
|
||||||
self.view.lineNumber = slots_vert
|
|
||||||
self.view.colNumber = slots_hor
|
|
||||||
self.view.firstSlot = 1
|
|
||||||
FlowBox.super.new(self, menusystem, name, x, y, w, h)
|
|
||||||
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
|
|
||||||
|
|
||||||
-- UPDATE FUNCTIONS
|
|
||||||
-- Update the menu and its view
|
|
||||||
|
|
||||||
function FlowBox:updateWidgetSize()
|
|
||||||
self.widget.h = math.floor( self.h / self.view.lineNumber )
|
|
||||||
self.widget.w = math.floor( self.w / self.view.colNumber )
|
|
||||||
end
|
|
||||||
|
|
||||||
function FlowBox:update(dt)
|
|
||||||
self:updateView()
|
|
||||||
self:updateSelectedWidget(dt)
|
|
||||||
end
|
|
||||||
|
|
||||||
function FlowBox:updateView()
|
|
||||||
local col, line = self:getCoord(self.widget.selected)
|
|
||||||
local begincol, beginline = self:getCoord(self.view.firstSlot)
|
|
||||||
|
|
||||||
if line < beginline then
|
|
||||||
beginline = line
|
|
||||||
end
|
|
||||||
|
|
||||||
if line > beginline + self.view.lineNumber - 1 then
|
|
||||||
beginline = line - self.view.lineNumber + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
if beginline < 0 then
|
|
||||||
beginline = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
self.view.firstSlot = beginline * self.view.colNumber + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
-- INFO FUNCTIONS
|
|
||||||
-- Get informations
|
|
||||||
|
|
||||||
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.view.colNumber)
|
|
||||||
col = id_selected - (line * self.view.colNumber)
|
|
||||||
return col, line
|
|
||||||
end
|
|
||||||
|
|
||||||
-- CURSOR FUNCTIONS
|
|
||||||
-- Handle the cursor in a 2D menu
|
|
||||||
|
|
||||||
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.view.colNumber - 1
|
|
||||||
end
|
|
||||||
|
|
||||||
if new_col == self.view.colNumber then
|
|
||||||
new_col = 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
self.widget.selected = (new_line * self.view.colNumber) + new_col + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
-- KEYS FUNCTIONS
|
|
||||||
-- Handle the keyboard/controller inputs
|
|
||||||
|
|
||||||
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
|
|
||||||
if (self.widget.selected >= 1 and self.widget.selected <= #self.widget.list) then
|
|
||||||
self.widget.list[self.widget.selected]:action("key")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- MOUSE FUNCTIONS
|
|
||||||
-- Handle the mouse/touch pointer
|
|
||||||
|
|
||||||
function FlowBox:mousemoved(x, y)
|
|
||||||
local col, line = self:getCoord(self.widget.selected)
|
|
||||||
local begincol, beginline = self:getCoord(self.view.firstSlot)
|
|
||||||
local newcol, newline, widget_selected
|
|
||||||
|
|
||||||
newline = beginline + math.floor(y / self.widget.h)
|
|
||||||
newcol = math.floor(x / self.widget.w)
|
|
||||||
widget_selected = (newline * self.view.colNumber) + 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.view.firstSlot)
|
|
||||||
local newline, newcol, widget_selected
|
|
||||||
|
|
||||||
newline = beginline + math.floor(y / self.widget.h)
|
|
||||||
newcol = math.floor(x / self.widget.w)
|
|
||||||
widget_selected = (newline * self.view.colNumber) + 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("pointer")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- DRAW FUNCTIONS
|
|
||||||
-- Draw the menu and its content
|
|
||||||
|
|
||||||
function FlowBox:draw()
|
|
||||||
self:updateView()
|
|
||||||
local widgety = self.y
|
|
||||||
local widgetx = self.x
|
|
||||||
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(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
|
|
||||||
|
|
||||||
function FlowBox: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()
|
|
||||||
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 FlowBox
|
|
|
@ -1,277 +0,0 @@
|
||||||
-- grid :: a menu with arbitrary widget placement and size on a grid.
|
|
||||||
|
|
||||||
--[[
|
|
||||||
Copyright © 2019 Kazhnuz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local cwd = (...):gsub('%.grid$', '') .. "."
|
|
||||||
|
|
||||||
local Menu = require(cwd .. "parent")
|
|
||||||
local GridBox = Menu:extend()
|
|
||||||
|
|
||||||
local menuutils = require(cwd .. "widgets.utils")
|
|
||||||
|
|
||||||
-- INIT FUNCTIONS
|
|
||||||
-- Initialize and configure the menu
|
|
||||||
|
|
||||||
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.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
|
|
||||||
self.cursor = {}
|
|
||||||
self.cursor.x = 0
|
|
||||||
self.cursor.y = 0
|
|
||||||
|
|
||||||
-- La gridbox possède la particularité de pouvoir fusioner des slots, on fait
|
|
||||||
-- donc une liste de slots disponibles, qui serviront par la suite.
|
|
||||||
self.slots = {}
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:addSlot(widgetID, x, y, w, h)
|
|
||||||
local slot = {}
|
|
||||||
slot.x = x
|
|
||||||
slot.y = y
|
|
||||||
slot.w = w
|
|
||||||
slot.h = h
|
|
||||||
slot.widgetID = widgetID
|
|
||||||
|
|
||||||
table.insert(self.slots, slot)
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:updateWidgetSize()
|
|
||||||
self.widget.h = math.floor( self.h / self.view.lineNumber )
|
|
||||||
self.widget.w = math.floor( self.w / self.view.colNumber )
|
|
||||||
end
|
|
||||||
|
|
||||||
-- INFO FUNCTIONS
|
|
||||||
-- Get the info of the widgets
|
|
||||||
|
|
||||||
function GridBox:getWidgetSize(id)
|
|
||||||
local slot = self:getWidgetSlot(id)
|
|
||||||
if slot == 0 then
|
|
||||||
return 1, 1
|
|
||||||
else
|
|
||||||
return self.widget.w * self.slots[slot].w, self.widget.h * self.slots[slot].h
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:getSlotHitbox(slot)
|
|
||||||
local x, y, w, h
|
|
||||||
x = self.slots[slot].x * self.widget.w
|
|
||||||
y = self.slots[slot].y * self.widget.h
|
|
||||||
w = self.slots[slot].w * self.widget.w
|
|
||||||
h = self.slots[slot].h * self.widget.h
|
|
||||||
|
|
||||||
return x, y, w, h
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:getSlotCenter(slot)
|
|
||||||
local x, y, w, h = self:getSlotHitbox(slot)
|
|
||||||
|
|
||||||
return x + (w/2), y + (h/2)
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:getWidgetID(slot)
|
|
||||||
local widgetID
|
|
||||||
if self.slots[slot] ~= nil then
|
|
||||||
widgetID = self.slots[slot].widgetID
|
|
||||||
else
|
|
||||||
widgetID = 0
|
|
||||||
end
|
|
||||||
return widgetID
|
|
||||||
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
|
|
||||||
if (self.slots[i].widgetID == widgetID) then
|
|
||||||
slot = i
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return slot
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:getWidgetAtPoint(x, y)
|
|
||||||
local x = x or 0
|
|
||||||
local y = y or 0
|
|
||||||
local widgetID = nil
|
|
||||||
|
|
||||||
for i,v in ipairs(self.slots) do
|
|
||||||
local xx, yy, ww, hh = self:getSlotHitbox(i)
|
|
||||||
if (x >= xx) and (y >= yy) and (x < xx + ww) and (y < yy + hh) then
|
|
||||||
widgetID = v.widgetID
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return widgetID
|
|
||||||
end
|
|
||||||
|
|
||||||
-- UPDATE FUNCTIONS
|
|
||||||
-- Update the Grid and its view
|
|
||||||
|
|
||||||
function GridBox:update(dt)
|
|
||||||
self.view.firstSlot = 1
|
|
||||||
self:updateSelectedWidget(dt)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- KEYS FUNCTIONS
|
|
||||||
-- Handle the keyboard/manette functions
|
|
||||||
|
|
||||||
function GridBox:keyreleased(key, code)
|
|
||||||
local slotID = self:getWidgetSlot(self.widget.selected)
|
|
||||||
local col, line = self.cursor.x, self.cursor.y
|
|
||||||
if key == 'left' then
|
|
||||||
self:moveCol(-1)
|
|
||||||
end
|
|
||||||
|
|
||||||
if key == 'right' then
|
|
||||||
self:moveCol(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
if key == 'up' then
|
|
||||||
self:moveLine(-1)
|
|
||||||
end
|
|
||||||
|
|
||||||
if key == 'down' then
|
|
||||||
self:moveLine(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
if key == "A" and self.widget.selected <= #self.widget.list then
|
|
||||||
self.widget.list[self.widget.selected]:action("key")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:moveCol(direction)
|
|
||||||
local orig_x, orig_y = self:getSlotCenter(self.widget.selected)
|
|
||||||
local distance = self.w -- on met directement à la distance max possible le système
|
|
||||||
local nearastWidget = 0
|
|
||||||
for i,v in ipairs(self.slots) do
|
|
||||||
local xx, yy = self:getSlotCenter(i)
|
|
||||||
-- On commence par vérifier si le slot est bien positionné par rapport au
|
|
||||||
-- widget de base
|
|
||||||
if utils.math.sign(xx - orig_x) == direction then
|
|
||||||
if utils.math.pointDistance(orig_x, orig_y, xx, yy) < distance then
|
|
||||||
distance = utils.math.pointDistance(orig_x, orig_y, xx, yy)
|
|
||||||
nearastWidget = v.widgetID
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if nearastWidget ~= 0 then
|
|
||||||
self.widget.selected = nearastWidget
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:moveLine(direction)
|
|
||||||
local orig_x, orig_y = self:getSlotCenter(self.widget.selected)
|
|
||||||
local distance = self.h -- on met directement à la distance max possible le système
|
|
||||||
local nearastWidget = 0
|
|
||||||
for i,v in ipairs(self.slots) do
|
|
||||||
local xx, yy = self:getSlotCenter(i)
|
|
||||||
-- On commence par vérifier si le slot est bien positionné par rapport au
|
|
||||||
-- widget de base
|
|
||||||
if utils.math.sign(yy - orig_y) == direction then
|
|
||||||
if utils.math.pointDistance(orig_x, orig_y, xx, yy) < distance then
|
|
||||||
distance = utils.math.pointDistance(orig_x, orig_y, xx, yy)
|
|
||||||
nearastWidget = v.widgetID
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if nearastWidget ~= 0 then
|
|
||||||
self.widget.selected = nearastWidget
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- MOUSE FUNCTIONS
|
|
||||||
-- Handle the mouse and activate the widgets with it
|
|
||||||
|
|
||||||
function GridBox:mousemoved(x, y)
|
|
||||||
local widgetID = self:getWidgetAtPoint(x, y)
|
|
||||||
|
|
||||||
if widgetID ~= nil then
|
|
||||||
self.widget.selected = widgetID
|
|
||||||
self:getFocus()
|
|
||||||
end
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:mousepressed(x, y, button, isTouch)
|
|
||||||
local widgetID = self:getWidgetAtPoint(x, y)
|
|
||||||
|
|
||||||
if widgetID ~= nil then
|
|
||||||
self.widget.selected = widgetID
|
|
||||||
self:getFocus()
|
|
||||||
|
|
||||||
if #self.widget.list > 0 and self.widget.selected > 1 and self.widget.selected <= #self.widget.list then
|
|
||||||
self.widget.list[self.widget.selected]:action("pointer")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- DRAW FUNCTIONS
|
|
||||||
-- Draw the menu and its content
|
|
||||||
|
|
||||||
function GridBox:draw()
|
|
||||||
|
|
||||||
for i,v in ipairs(self.slots) do
|
|
||||||
if self:haveWidget(i) then
|
|
||||||
local widgetx = self.x + (v.x * self.widget.w)
|
|
||||||
local widgety = self.y + (v.y * self.widget.h)
|
|
||||||
if self.widget.selected == v.widgetID and self:haveFocus() == true then
|
|
||||||
self.widget.list[v.widgetID]:drawSelected(widgetx, widgety)
|
|
||||||
else
|
|
||||||
self.widget.list[v.widgetID]:draw(widgetx, widgety)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function GridBox:drawCursor()
|
|
||||||
self:updateView()
|
|
||||||
if (self.widget.selected >= 1 and self.widget.selected <= #self.widget.list) then
|
|
||||||
local slot = self:getWidgetSlot(self.widget.selected)
|
|
||||||
local w, h = self:getWidgetSize(slot)
|
|
||||||
local x = self.slots[slot].x * self.widget.w
|
|
||||||
local y = self.slots[slot].y * self.widget.h
|
|
||||||
menuutils.drawCursor(self.x + x, self.y + y, w, h)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return GridBox
|
|
|
@ -1,149 +0,0 @@
|
||||||
-- hlistbox : add an horizontal list of widgets.
|
|
||||||
|
|
||||||
--[[
|
|
||||||
Copyright © 2019 Kazhnuz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local cwd = (...):gsub('%.hlistbox$', '') .. "."
|
|
||||||
|
|
||||||
local Menu = require(cwd .. "parent")
|
|
||||||
local HListBox = Menu:extend()
|
|
||||||
|
|
||||||
local menuutils = require(cwd .. "widgets.utils")
|
|
||||||
|
|
||||||
-- INIT FUNCTIONS
|
|
||||||
-- Initialize and configure functions.
|
|
||||||
|
|
||||||
function HListBox:new(menusystem, name, x, y, w, h, slotNumber)
|
|
||||||
self.view = {}
|
|
||||||
self.view.slotNumber = slotNumber
|
|
||||||
self.view.firstSlot = 1
|
|
||||||
HListBox.super.new(self, menusystem, name, x, y, w, h)
|
|
||||||
self.w = slotNumber * self.widget.w -- On fait en sorte que la hauteur
|
|
||||||
-- soit un multiple du nombre de slot et de leur hauteur
|
|
||||||
end
|
|
||||||
|
|
||||||
-- UPDATE FUNCTIONS
|
|
||||||
-- Update the menu every step.
|
|
||||||
|
|
||||||
function HListBox:updateWidgetSize()
|
|
||||||
self.widget.h = self.h
|
|
||||||
self.widget.w = math.floor( self.w / self.view.slotNumber )
|
|
||||||
end
|
|
||||||
|
|
||||||
function HListBox:update(dt)
|
|
||||||
self:updateView()
|
|
||||||
self:updateSelectedWidget(dt)
|
|
||||||
end
|
|
||||||
|
|
||||||
function HListBox: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
|
|
||||||
|
|
||||||
-- KEYBOARD FUNCTIONS
|
|
||||||
-- Handle key check.
|
|
||||||
|
|
||||||
function HListBox:keyreleased(key, code)
|
|
||||||
|
|
||||||
if key == 'left' then
|
|
||||||
self:moveCursor(self.widget.selected - 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
if key == 'right' 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("key")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if key == "B" then
|
|
||||||
if (self.widget.cancel >= 1 and self.widget.cancel <= #self.widget.list) then
|
|
||||||
self.widget.list[self.widget.cancel]:action("key")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- MOUSE FUNCTIONS
|
|
||||||
-- Click and stuff like that.
|
|
||||||
|
|
||||||
function HListBox:mousemoved(x, y)
|
|
||||||
local widget_selected = self.view.firstSlot + math.floor(x / self.widget.w)
|
|
||||||
|
|
||||||
if widget_selected >= 1 and widget_selected <= #self.widget.list then
|
|
||||||
self.widget.selected = widget_selected
|
|
||||||
self:getFocus()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function HListBox:mousepressed(x, y, button, isTouch)
|
|
||||||
local widget_selected = self.view.firstSlot + math.floor(x / self.widget.w)
|
|
||||||
|
|
||||||
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("pointer")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- DRAW FUNCTIONS
|
|
||||||
-- Draw the menu and its content
|
|
||||||
|
|
||||||
function HListBox:draw()
|
|
||||||
self:updateView()
|
|
||||||
local widgetx = self.x
|
|
||||||
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(widgetx, self.y, self.widget.w, self.h)
|
|
||||||
if self.widget.selected == i and self:haveFocus() == true then
|
|
||||||
v:drawSelected(widgetx, self.y, self.widget.w, self.h)
|
|
||||||
else
|
|
||||||
v:draw(widgetx, self.y, self.widget.w, self.h)
|
|
||||||
end
|
|
||||||
widgetx = widgetx + self.widget.w
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function HListBox:drawCursor()
|
|
||||||
self:updateView()
|
|
||||||
if (self.widget.selected >= 1 and self.widget.selected <= #self.widget.list) then
|
|
||||||
local w, h = self:getWidgetSize()
|
|
||||||
local x = (self.widget.selected - self.view.firstSlot) * w
|
|
||||||
menuutils.drawCursor(self.x + x,self.y, w, h)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return HListBox
|
|
|
@ -1,290 +0,0 @@
|
||||||
-- menusystem :: the controller of the menu system. This object handle the
|
|
||||||
-- different menu objects
|
|
||||||
|
|
||||||
--[[
|
|
||||||
Copyright © 2019 Kazhnuz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local cwd = (...):gsub('%.init$', '') .. "."
|
|
||||||
|
|
||||||
local MenuSystem = Object:extend()
|
|
||||||
|
|
||||||
-- Load the differents menu object to get an easy access
|
|
||||||
MenuSystem.Parent = require(cwd .. "parent")
|
|
||||||
MenuSystem.ListBox = require(cwd .. "listbox")
|
|
||||||
MenuSystem.FlowBox = require(cwd .. "flowbox")
|
|
||||||
MenuSystem.Grid = require(cwd .. "grid")
|
|
||||||
|
|
||||||
-- load widgets object
|
|
||||||
MenuSystem.Widget = require(cwd .. "widgets")
|
|
||||||
|
|
||||||
-- INIT FUNCTIONS
|
|
||||||
-- Initialize and configure the menu controller
|
|
||||||
|
|
||||||
function MenuSystem:new(scene)
|
|
||||||
self.scene = scene
|
|
||||||
self.menus = {}
|
|
||||||
self.focusedMenu = ""
|
|
||||||
self.isActive = true
|
|
||||||
self.lockWorld = false
|
|
||||||
self.lockAssets = false
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:reset()
|
|
||||||
self.menus = {}
|
|
||||||
end
|
|
||||||
|
|
||||||
-- ACTIVATION FUNCTIONS
|
|
||||||
-- Activate and deactivate the whole menusystem
|
|
||||||
|
|
||||||
function MenuSystem:activate()
|
|
||||||
self.isActive = true
|
|
||||||
|
|
||||||
if (self.lockWorld) then
|
|
||||||
if (self.scene.world ~= nil) then
|
|
||||||
self.scene.world:setActivity(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if (self.lockAssets) then
|
|
||||||
if (self.scene.assets ~= nil) then
|
|
||||||
self.scene.assets:setActivity(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:deactivate()
|
|
||||||
self.isActive = false
|
|
||||||
|
|
||||||
if (self.lockWorld) then
|
|
||||||
if (self.scene.world ~= nil) then
|
|
||||||
self.scene.world:setActivity(true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if (self.lockAssets) then
|
|
||||||
if (self.scene.assets ~= nil) then
|
|
||||||
self.scene.assets:setActivity(true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:getActiveState()
|
|
||||||
return self.isActive
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:lockWorldWhenActive(state)
|
|
||||||
self.lockWorld = state
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:lockAssetsWhenActive(state)
|
|
||||||
self.lockAssets = state
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- MENUS FUNCTIONS
|
|
||||||
-- Controle the menus of the menusystem
|
|
||||||
|
|
||||||
function MenuSystem:addMenu(name, menu)
|
|
||||||
self.menus[name] = menu
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:menuExist(name)
|
|
||||||
return (self.menus[name] ~= nil)
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:switchMenu(menu)
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
if k == menu then
|
|
||||||
v:getFocus()
|
|
||||||
v:setVisibility(true)
|
|
||||||
v:setActivity(true)
|
|
||||||
else
|
|
||||||
v:setVisibility(false)
|
|
||||||
v:setActivity(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:lockMenu(menu, lock)
|
|
||||||
local lock = lock or true
|
|
||||||
if self:menuExist(menu) then
|
|
||||||
self.menus[menu]:lock(lock)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:lockMenuVisibility(menu, lock)
|
|
||||||
local lock = lock or true
|
|
||||||
if self:menuExist(menu) then
|
|
||||||
self.menus[menu]:lockVisibility(lock)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:setMenuActivity(menu, activity)
|
|
||||||
local activity = activity or true
|
|
||||||
if self:menuExist(menu) then
|
|
||||||
self.menus[menu]:setActivity(activity)
|
|
||||||
if activity == true then
|
|
||||||
-- if we make the menu active, he have to be visible too
|
|
||||||
self.menus[menu]:setVisibility(true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:setMenuVisibility(menu, visibility)
|
|
||||||
local visibility = visibility or true
|
|
||||||
if self:menuExist(menu) then
|
|
||||||
self.menus[menu]:setVisibility(visibility)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:setAllMenuVisibility(visibility)
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
v:setVisibility(visibility)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:setAllMenuActivity(activity)
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
v.isActive = activity
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:removeDestroyedMenus()
|
|
||||||
-- On retire les entitées marquées comme supprimées
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
if (v.isDestroyed == true) then
|
|
||||||
self.menus[k] = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- SOUND FUNCTIONS
|
|
||||||
-- Add sounds to every menus
|
|
||||||
|
|
||||||
function MenuSystem:setSoundFromSceneAssets(soundname)
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
v:setSoundFromSceneAssets(soundname)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:setSound(soundasset)
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
v:setSound(soundasset)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- UPDATE FUNCTIONS
|
|
||||||
-- Update the menus of the menusystem
|
|
||||||
|
|
||||||
function MenuSystem:update(dt)
|
|
||||||
if (self.isActive) then
|
|
||||||
self:removeDestroyedMenus()
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
v:update(dt)
|
|
||||||
v:updateWidgets(dt)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:keycheck()
|
|
||||||
if (self.isActive) then
|
|
||||||
if self.menus[self.focusedMenu] ~= nil then
|
|
||||||
-- Only check buttons if the current focused menu is actually active
|
|
||||||
if self.menus[self.focusedMenu].isActive then
|
|
||||||
for k,v in pairs(self.keys) do
|
|
||||||
if self.keys[k].isPressed then
|
|
||||||
self.menus[self.focusedMenu]:keyreleased(k)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- MOUSE FUNCTIONS
|
|
||||||
-- Send mouse inputs to the menu
|
|
||||||
|
|
||||||
function MenuSystem:mousemoved(x, y, dx, dy)
|
|
||||||
if (self.isActive) then
|
|
||||||
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
if v.isActive then
|
|
||||||
if (x > v.x) and (x < v.x + v.w) and (y > v.y) and (y < v.y + v.h) then
|
|
||||||
v:mousemoved(x - v.x, y - v.y)
|
|
||||||
break;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:mousepressed( x, y, button, istouch )
|
|
||||||
if (self.isActive) then
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
if v.isActive then
|
|
||||||
if (x > v.x) and (x < v.x + v.w) and (y > v.y) and (y < v.y + v.h) then
|
|
||||||
v:mousepressed(x - v.x, y - v.y, button, istouch )
|
|
||||||
break;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- DRAW FUNCTIONS
|
|
||||||
-- All functions to draw the menus of the menusystem
|
|
||||||
|
|
||||||
function MenuSystem:getDrawList()
|
|
||||||
local drawList = {}
|
|
||||||
for k,v in pairs(self.menus) do
|
|
||||||
local drawObject = {}
|
|
||||||
drawObject.name = k
|
|
||||||
drawObject.depth = v.depth
|
|
||||||
table.insert(drawList, drawObject)
|
|
||||||
end
|
|
||||||
table.sort(drawList, function(a,b) return a.depth > b.depth end)
|
|
||||||
|
|
||||||
return drawList
|
|
||||||
end
|
|
||||||
|
|
||||||
function MenuSystem:draw(dt)
|
|
||||||
if (self.isActive) then
|
|
||||||
-- Draw all the menus
|
|
||||||
self.drawList = self:getDrawList()
|
|
||||||
|
|
||||||
for i,v in ipairs(self.drawList) do
|
|
||||||
local v2 = self.menus[v.name]
|
|
||||||
if (v2.isVisible) then
|
|
||||||
v2:draw(dt)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if self.menus[self.focusedMenu] ~= nil then
|
|
||||||
if (self.menus[self.focusedMenu].isVisible) then
|
|
||||||
self.menus[self.focusedMenu]:drawCursor()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return MenuSystem
|
|
|
@ -1,147 +0,0 @@
|
||||||
-- listbox : add a vertical list of widgets.
|
|
||||||
|
|
||||||
--[[
|
|
||||||
Copyright © 2019 Kazhnuz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local cwd = (...):gsub('%.listbox$', '') .. "."
|
|
||||||
local Menu = require(cwd .. "parent")
|
|
||||||
|
|
||||||
local ListBox = Menu:extend()
|
|
||||||
|
|
||||||
local menuutils = require(cwd .. "widgets.utils")
|
|
||||||
|
|
||||||
-- INIT FUNCTIONS
|
|
||||||
-- Initialize and configure functions.
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
-- UPDATE FUNCTIONS
|
|
||||||
-- Update the menu every step.
|
|
||||||
|
|
||||||
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()
|
|
||||||
self:updateSelectedWidget(dt)
|
|
||||||
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
|
|
||||||
|
|
||||||
-- KEYBOARD FUNCTIONS
|
|
||||||
-- Handle input from keyboard/controllers.
|
|
||||||
|
|
||||||
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("key")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if key == "B" then
|
|
||||||
self:cancelAction()
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- MOUSE FUNCTIONS
|
|
||||||
-- Handle input from pointers.
|
|
||||||
|
|
||||||
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("pointer")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- DRAW FUNCTIONS
|
|
||||||
-- draw the menu and the rest of content.
|
|
||||||
|
|
||||||
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
|
|
||||||
if self.widget.selected == i and self:haveFocus() == true then
|
|
||||||
v:drawSelected(self.x, widgety, self.w, self.widget.h)
|
|
||||||
else
|
|
||||||
utils.graphics.resetColor()
|
|
||||||
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
|
|
|
@ -1,302 +0,0 @@
|
||||||
-- parent.lua : The parent of the functions.
|
|
||||||
|
|
||||||
--[[
|
|
||||||
Copyright © 2019 Kazhnuz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local Menu = Object:extend()
|
|
||||||
|
|
||||||
local function updateWidgetByOrder(a, b)
|
|
||||||
if a.order ~= b.order then
|
|
||||||
return a.order < b.order
|
|
||||||
else
|
|
||||||
return a.creationID < b.creationID
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- INIT FUNCTIONS
|
|
||||||
-- Initialize and configure functions.
|
|
||||||
|
|
||||||
function Menu:new(menusystem, name, x, y, w, h)
|
|
||||||
self.menusystem = menusystem
|
|
||||||
self.name = name
|
|
||||||
|
|
||||||
self.x = x
|
|
||||||
self.y = y
|
|
||||||
self.w = w
|
|
||||||
self.h = h
|
|
||||||
|
|
||||||
self.widget = {}
|
|
||||||
self.widget.list = {}
|
|
||||||
self.widget.selected = 0
|
|
||||||
self.widget.selectedPrevious = 0
|
|
||||||
self.widget.cancel = 0
|
|
||||||
self:updateWidgetSize()
|
|
||||||
|
|
||||||
self.isDestroyed = false
|
|
||||||
self.isVisible = true
|
|
||||||
self.isActive = true
|
|
||||||
self.isLocked = false
|
|
||||||
self.isAlwaysVisible = false
|
|
||||||
|
|
||||||
self.depth = 0
|
|
||||||
|
|
||||||
self:resetSound()
|
|
||||||
|
|
||||||
self:register()
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:setDepth(depth)
|
|
||||||
self.depth = depth or 0
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:setVisibility(visibility)
|
|
||||||
if self.isLocked == false and self.isAlwaysVisible == false then
|
|
||||||
-- if the menu is locked (thus is always active), it should also
|
|
||||||
-- be always visible.
|
|
||||||
self.isVisible = visibility
|
|
||||||
else
|
|
||||||
self.isVisible = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:setActivity(activity)
|
|
||||||
if self.isLocked == false then
|
|
||||||
self.isActive = activity
|
|
||||||
else
|
|
||||||
self.isActive = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:lock(lock)
|
|
||||||
self.isLocked = lock
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:lockVisibility(lock)
|
|
||||||
self.isAlwaysVisible = lock
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:getFocus()
|
|
||||||
self.menusystem.focusedMenu = self.name
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:haveFocus()
|
|
||||||
return (self.menusystem.focusedMenu == self.name)
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:register()
|
|
||||||
self.menusystem:addMenu(self.name, self)
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:setCancelWidget(id)
|
|
||||||
self.widget.cancel = #self.widget.list
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:updateWidgetSize()
|
|
||||||
self.widget.h = 0
|
|
||||||
self.widget.w = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:getWidgetSize(id)
|
|
||||||
return self.widget.w, self.widget.h
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:getWidgetNumber()
|
|
||||||
return #self.widget.list
|
|
||||||
end
|
|
||||||
|
|
||||||
-- ACTION FUNCTIONS
|
|
||||||
-- Send actions to the widgets
|
|
||||||
|
|
||||||
function Menu:cancelAction()
|
|
||||||
if (self.widget.cancel >= 1 and self.widget.cancel <= #self.widget.list) then
|
|
||||||
self.widget.list[self.widget.cancel]:action("key")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:clear()
|
|
||||||
self.widget.list = {}
|
|
||||||
self.widget.cancel = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:resize(x,y,w,h)
|
|
||||||
self.x = x
|
|
||||||
self.y = y
|
|
||||||
self.w = w
|
|
||||||
self.h = h
|
|
||||||
|
|
||||||
self:updateWidgetSize()
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:destroy()
|
|
||||||
self.isDestroyed = true
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:updateWidgetsOrder()
|
|
||||||
table.sort(self.widget.list, updateWidgetByOrder)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- UPDATE FUNCTIONS
|
|
||||||
-- Update the menu every game update
|
|
||||||
|
|
||||||
function Menu:update(dt)
|
|
||||||
-- Cette fonction ne contient rien par défaut
|
|
||||||
self:updateSelectedWidget(dt)
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:updateSelectedWidget(dt)
|
|
||||||
if (self.widget.selected ~= self.widget.previous) and (self.isActive) then
|
|
||||||
if (self.widget.list[self.widget.selected] ~= nil) then
|
|
||||||
self.widget.list[self.widget.selected]:selectAction()
|
|
||||||
self.widget.previous = self.widget.selected
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if (self.widget.list[self.widget.selected] ~= nil) then
|
|
||||||
self.widget.list[self.widget.selected]:updateSelected(dt)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- DRAW FUNCTIONS
|
|
||||||
-- Draw the menu and its content
|
|
||||||
|
|
||||||
function Menu:draw()
|
|
||||||
-- nothing here
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:drawCursor()
|
|
||||||
-- nothing here
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:drawCanvas()
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- KEYBOARD FUNCTIONS
|
|
||||||
-- Handle key press
|
|
||||||
|
|
||||||
function Menu:keyreleased(key)
|
|
||||||
-- Cette fonction ne contient rien par défaut
|
|
||||||
end
|
|
||||||
|
|
||||||
-- MOUSE FUNCTIONS
|
|
||||||
-- Handle pointers (clic/touch)
|
|
||||||
|
|
||||||
function Menu:mousemoved(x, y)
|
|
||||||
-- Cette fonction ne contient rien par défaut
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:mousepressed( x, y, button, istouch )
|
|
||||||
-- Cette fonction ne contient rien par défaut
|
|
||||||
end
|
|
||||||
|
|
||||||
-- WIDGET FUNCTIONS
|
|
||||||
-- Handle widgets of the functions
|
|
||||||
|
|
||||||
function Menu:addWidget(newwidget)
|
|
||||||
if #self.widget.list == 0 then
|
|
||||||
self.widget.selected = 1
|
|
||||||
end
|
|
||||||
table.insert(self.widget.list, newwidget)
|
|
||||||
self:updateWidgetsID()
|
|
||||||
self:updateWidgetsOrder()
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:updateWidgets(dt)
|
|
||||||
self:removeDestroyedWidgets()
|
|
||||||
for i,v in ipairs(self.widget.list) do
|
|
||||||
v.id = i
|
|
||||||
v:update(dt)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:updateWidgetsID()
|
|
||||||
for i,v in ipairs(self.widget.list) do
|
|
||||||
v.id = i
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:removeDestroyedWidgets() -- On retire les widgets marquées comme supprimées
|
|
||||||
for i,v in ipairs(self.widget.list) do
|
|
||||||
if (v.destroyed == true) then
|
|
||||||
table.remove(self.widget.list, i)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- CURSOR FUNCTIONS
|
|
||||||
-- Set or move the cursor of the menu
|
|
||||||
|
|
||||||
function Menu:setCursor(cursorid)
|
|
||||||
self.widget.selected = cursorid --math.max(1, math.min(cursorid, #self.widget.list))
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:moveCursor(new_selected)
|
|
||||||
self:playNavigationSound()
|
|
||||||
if new_selected < 1 then
|
|
||||||
self.widget.selected = #self.widget.list + new_selected
|
|
||||||
else
|
|
||||||
if new_selected > #self.widget.list then
|
|
||||||
self.widget.selected = new_selected - #self.widget.list
|
|
||||||
else
|
|
||||||
self.widget.selected = new_selected
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- SOUND FUNCTION
|
|
||||||
-- Handle SFX
|
|
||||||
|
|
||||||
function Menu:resetSound()
|
|
||||||
self.sound = {}
|
|
||||||
self.sound.active = false
|
|
||||||
self.sound.asset = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:setSoundFromSceneAssets(name)
|
|
||||||
self:setSound(self.menusystem.scene.assets.sfx[name])
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:setSound(soundasset)
|
|
||||||
self.sound.active = true
|
|
||||||
self.sound.asset = soundasset
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:playNavigationSound()
|
|
||||||
if self.sound.active == true then
|
|
||||||
self.sound.asset:play()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- VIEW FUNCTIONS
|
|
||||||
-- Handle the view of the menu
|
|
||||||
|
|
||||||
function Menu:resetView()
|
|
||||||
-- ne sert à rien ici, c'est juste pour éviter des crash
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:updateView()
|
|
||||||
-- ne sert à rien ici, c'est juste pour éviter des crash
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:moveView()
|
|
||||||
-- ne sert à rien ici, c'est juste pour éviter des crash
|
|
||||||
end
|
|
||||||
|
|
||||||
return Menu
|
|
|
@ -1,153 +0,0 @@
|
||||||
-- widgets :: basic widget object
|
|
||||||
|
|
||||||
--[[
|
|
||||||
Copyright © 2019 Kazhnuz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local Widget = {}
|
|
||||||
|
|
||||||
local BaseWidget = Object:extend()
|
|
||||||
local TextWidget = BaseWidget:extend()
|
|
||||||
|
|
||||||
-- INIT FUNCTIONS
|
|
||||||
-- Initialize and configure the widget
|
|
||||||
|
|
||||||
function BaseWidget:new(menu)
|
|
||||||
self.menu = menu
|
|
||||||
|
|
||||||
self.destroyed = false
|
|
||||||
self.selectable = false
|
|
||||||
self.selection_margin = 0
|
|
||||||
self.margin = 2
|
|
||||||
|
|
||||||
self.canvas = {}
|
|
||||||
self.canvas.texture = nil
|
|
||||||
self.canvas.needRedraw = true
|
|
||||||
|
|
||||||
self.ox = 0
|
|
||||||
self.oy = 0
|
|
||||||
|
|
||||||
self.order = 0
|
|
||||||
self:register()
|
|
||||||
end
|
|
||||||
|
|
||||||
function BaseWidget:register()
|
|
||||||
self.creationID = self.menu:getWidgetNumber()
|
|
||||||
self.menu:addWidget(self)
|
|
||||||
end
|
|
||||||
|
|
||||||
function BaseWidget:redrawCanvas()
|
|
||||||
self.width, self.height = self.menu:getWidgetSize(self.id)
|
|
||||||
|
|
||||||
local canvas = love.graphics.newCanvas(self.width * 2, self.height * 2)
|
|
||||||
love.graphics.setCanvas( canvas )
|
|
||||||
|
|
||||||
self:drawCanvas()
|
|
||||||
self.canvas.needRedraw = false
|
|
||||||
|
|
||||||
love.graphics.setCanvas( )
|
|
||||||
local imageData = canvas:newImageData( )
|
|
||||||
self.canvas.texture = love.graphics.newImage( imageData )
|
|
||||||
canvas:release( )
|
|
||||||
imageData:release( )
|
|
||||||
end
|
|
||||||
|
|
||||||
function BaseWidget:invalidateCanvas()
|
|
||||||
self.canvas.needRedraw = true
|
|
||||||
end
|
|
||||||
|
|
||||||
function BaseWidget:drawCanvas()
|
|
||||||
self.r = love.math.random(128)/256
|
|
||||||
self.g = love.math.random(128)/256
|
|
||||||
self.b = love.math.random(128)/256
|
|
||||||
|
|
||||||
love.graphics.setColor(self.r, self.g, self.b, 70)
|
|
||||||
love.graphics.rectangle("fill", 0, 0, self.width, self.height)
|
|
||||||
love.graphics.setColor(self.r, self.g, self.b)
|
|
||||||
love.graphics.rectangle("line", 0, 0, self.width, self.height)
|
|
||||||
utils.graphics.resetColor()
|
|
||||||
end
|
|
||||||
|
|
||||||
function BaseWidget:selectAction()
|
|
||||||
-- Do nothing
|
|
||||||
end
|
|
||||||
|
|
||||||
function BaseWidget:updateSelected(dt)
|
|
||||||
-- Do nothing
|
|
||||||
end
|
|
||||||
|
|
||||||
-- DRAW WIDGETS
|
|
||||||
-- Draw the widget
|
|
||||||
|
|
||||||
function BaseWidget:draw(x, y)
|
|
||||||
if self.canvas.texture ~= nil then
|
|
||||||
love.graphics.draw(self.canvas.texture, x - self.ox, y - self.oy)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function BaseWidget:drawSelected(x,y,w,h)
|
|
||||||
self:draw(x, y, w, h)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- UPDATE FUNCTIONS
|
|
||||||
-- Update the widget
|
|
||||||
|
|
||||||
function BaseWidget:update(dt)
|
|
||||||
if (self.canvas.needRedraw) then
|
|
||||||
self:redrawCanvas()
|
|
||||||
end
|
|
||||||
-- N/A
|
|
||||||
end
|
|
||||||
|
|
||||||
-- ACTION FUNCTION
|
|
||||||
-- Functions to handle actions and selection.
|
|
||||||
|
|
||||||
function BaseWidget:action(source)
|
|
||||||
--self:destroy()
|
|
||||||
end
|
|
||||||
|
|
||||||
function BaseWidget:destroy()
|
|
||||||
self.destroyed = true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- TEXT WIDGET
|
|
||||||
-- Simple text widget
|
|
||||||
|
|
||||||
function TextWidget:new(menu, font, label, color)
|
|
||||||
TextWidget.super.new(self, menu)
|
|
||||||
self.font = font
|
|
||||||
self.label = label
|
|
||||||
self.color = color or {1, 1, 1}
|
|
||||||
end
|
|
||||||
|
|
||||||
function TextWidget:drawCanvas()
|
|
||||||
local w, h
|
|
||||||
w = math.floor(self.width / 2)
|
|
||||||
h = math.floor(self.height / 2) - (self.font:getHeight() / 2)
|
|
||||||
self.font:setColor(self.color[1], self.color[2], self.color[3], 1)
|
|
||||||
self.font:draw(self.label, w, h, -1, "center")
|
|
||||||
self.font:setColor(1, 1, 1, 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Add the widget as subvariable to the returned table
|
|
||||||
Widget.Base = BaseWidget
|
|
||||||
Widget.Text = TextWidget
|
|
||||||
|
|
||||||
return Widget
|
|
|
@ -1,57 +0,0 @@
|
||||||
-- widgets/utils :: basic utility functions for the widgets
|
|
||||||
|
|
||||||
--[[
|
|
||||||
Copyright © 2019 Kazhnuz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
]]
|
|
||||||
|
|
||||||
local menuUtils = {}
|
|
||||||
|
|
||||||
function menuUtils.drawCursor(x, y, w, h)
|
|
||||||
love.graphics.setColor(0,0,0)
|
|
||||||
|
|
||||||
love.graphics.rectangle("fill", x, y, 4, 8)
|
|
||||||
love.graphics.rectangle("fill", x, y, 8, 4)
|
|
||||||
|
|
||||||
love.graphics.rectangle("fill", x + w, y, -4, 8)
|
|
||||||
love.graphics.rectangle("fill", x + w, y, -8, 4)
|
|
||||||
|
|
||||||
love.graphics.rectangle("fill", x, y + h, 4, -8)
|
|
||||||
love.graphics.rectangle("fill", x, y + h, 8, -4)
|
|
||||||
|
|
||||||
love.graphics.rectangle("fill", x + w, y + h, -4, -8)
|
|
||||||
love.graphics.rectangle("fill", x + w, y + h, -8, -4)
|
|
||||||
|
|
||||||
love.graphics.setColor(255,255,255)
|
|
||||||
|
|
||||||
love.graphics.rectangle("fill", x + 1, y + 1, 2, 6)
|
|
||||||
love.graphics.rectangle("fill", x + 1, y + 1, 6, 2)
|
|
||||||
|
|
||||||
love.graphics.rectangle("fill", x + w - 1, y + 1, -2, 6)
|
|
||||||
love.graphics.rectangle("fill", x + w - 1, y + 1, -6, 2)
|
|
||||||
|
|
||||||
love.graphics.rectangle("fill", x + 1, y + h - 1, 2, -6)
|
|
||||||
love.graphics.rectangle("fill", x + 1, y + h - 1, 6, -2)
|
|
||||||
|
|
||||||
love.graphics.rectangle("fill", x + w - 1, y + h - 1, -2, -6)
|
|
||||||
love.graphics.rectangle("fill", x + w - 1, y + h - 1, -6, -2)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
return menuUtils
|
|
Loading…
Reference in a new issue