From 4ff85e2cc130b4010bf1ba9c315e43b9c143b6ba Mon Sep 17 00:00:00 2001 From: Kazhnuz Date: Fri, 4 Dec 2020 12:00:43 +0100 Subject: [PATCH] feat: add views for 1D and 2D menus --- .../modules/menusystem/menus/utils/view1D.lua | 44 +++++++++++++ .../modules/menusystem/menus/utils/view2D.lua | 61 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 birb/modules/menusystem/menus/utils/view1D.lua create mode 100644 birb/modules/menusystem/menus/utils/view2D.lua diff --git a/birb/modules/menusystem/menus/utils/view1D.lua b/birb/modules/menusystem/menus/utils/view1D.lua new file mode 100644 index 0000000..686dc1e --- /dev/null +++ b/birb/modules/menusystem/menus/utils/view1D.lua @@ -0,0 +1,44 @@ +-- view1D.lua : A basic 1D view for menus. +-- Must be used as a subobject of a Menu + +--[[ + 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 View1D = Object:extend() + +function View1D:new(slotNumber) + self.slotNumber = slotNumber + self.firstSlot = 1 +end + +function View1D:updateFirstSlot(widgetID) + self.firstSlot = math.max(1, widgetID - (self.slotNumber - 1), math.min(widgetID, self.firstSlot)) +end + +function View1D:isBeforeView(x) + return (x < self.firstSlot) +end + +function View1D:isAfterView(x) + return (x >= (self.firstSlot + self.slotNumber)) +end + +return View1D \ No newline at end of file diff --git a/birb/modules/menusystem/menus/utils/view2D.lua b/birb/modules/menusystem/menus/utils/view2D.lua new file mode 100644 index 0000000..0e510bf --- /dev/null +++ b/birb/modules/menusystem/menus/utils/view2D.lua @@ -0,0 +1,61 @@ +-- view2D.lua : A basic 2D view for menus. +-- Must be used as a subobject of a Menu + +--[[ + 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 View1D = require "birb.modules.menusystem.menus.utils.menumodel" +local View2D = View1D:extend() + +function View2D:new(colNumber, lineNumber) + self.colNumber = colNumber + self.lineNumber = lineNumber + View2D.super.new(self, (colNumber * lineNumber)) +end + +function View2D:updateFirstSlot(widgetID) + local _, line = self:getCoord(widgetID) + local _, beginline = self:getCoord(self.firstSlot) + + beginline = math.min(line, math.max(0, beginline, line - (self.lineNumber - 1))) + self.view.firstSlot = (beginline * self.view.colNumber) + 1 +end + +-- INFO FUNCTIONS +-- Get informations + +function View2D:getCoord(x) + -- On simplifie les calcul en prenant 0 comme départ + local x = x - 1 + + local line, col + line = math.floor(x / self.view.colNumber) + col = x - (line * self.view.colNumber) + + return col, line +end + +function View2D:getFromCoord(col, line) + local _, beginline = self.view:getCoord(self.view.firstSlot) + local line = beginline + line + return (line * self.view.colNumber) + col + 1 +end + +return View2D