From 1a889163ae03deba03e62ac2dd5f11896d46e167 Mon Sep 17 00:00:00 2001 From: Kazhnuz Date: Fri, 31 Dec 2021 14:27:35 +0100 Subject: [PATCH] feat: new subscreen system --- .../birb/modules/gui/screen/init.lua | 45 +++++++++++- .../birb/modules/gui/screen/screenset.lua | 69 +++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 sonic-radiance.love/birb/modules/gui/screen/screenset.lua diff --git a/sonic-radiance.love/birb/modules/gui/screen/init.lua b/sonic-radiance.love/birb/modules/gui/screen/init.lua index c9049c8..e4a3795 100644 --- a/sonic-radiance.love/birb/modules/gui/screen/init.lua +++ b/sonic-radiance.love/birb/modules/gui/screen/init.lua @@ -3,10 +3,10 @@ local ElementList = require "birb.modules.gui.mixins.elements" GuiScreen:implement(ElementList) local TweenManager = require "birb.classes.time" +local ScreenSet = require "birb.modules.gui.screen.screenset" local elementDataStruct = require "birb.structures.elementData" - function GuiScreen:new(name) self:initWrapper() self.name = name @@ -33,12 +33,29 @@ function GuiScreen:update(dt) end function GuiScreen:show() + self:showSimple() + --TODO: show parent if we show directly the child + if (self.set ~= nil) then + self.set.owner:show() + end +end + +function GuiScreen:showSimple() if (not self.isVisible) then self.isVisible = true if (self.transforms["show"] ~= nil) then self:playTransform("show") end + + if (self.subscreens ~= nil) then + self.subscreens:show() + end + + if (self.set ~= nil) then + self.set:setCurrentScreen(self.name) + end end + end function GuiScreen:hide() @@ -50,7 +67,12 @@ function GuiScreen:hide() self.isVisible = false end) end + + if (self.subscreens ~= nil) then + self.subscreens:hideCurrent() + end end + end function GuiScreen:addTransform(name, transform) @@ -97,4 +119,25 @@ function GuiScreen:createElements() -- Empty function end +function GuiScreen:setParentSet(set) + self.set = set +end + +function GuiScreen:addSubscreen(screen) + self:initSubscreen() + self.subscreens:add(screen) +end + +function GuiScreen:showSubscreen(screenname) + if (self.subscreens ~= nil) then + self.subscreens:show(screenname) + end +end + +function GuiScreen:initSubscreen() + if (self.subscreens == nil) then + self.subscreens = ScreenSet(self) + end +end + return GuiScreen \ No newline at end of file diff --git a/sonic-radiance.love/birb/modules/gui/screen/screenset.lua b/sonic-radiance.love/birb/modules/gui/screen/screenset.lua new file mode 100644 index 0000000..357ba3f --- /dev/null +++ b/sonic-radiance.love/birb/modules/gui/screen/screenset.lua @@ -0,0 +1,69 @@ +-- screens/screenset :: a set of exclusive screens +-- Useful to handle a complexe menu with several screens + +--[[ + 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 ScreenSet = Object:extend() + +function ScreenSet:new(owner) + self.set = {} + self.defaultScreen = "" + self.currentScreen = "" + self.owner = owner +end + +function ScreenSet:show(screenName) + local screenName = screenName + if (screenName == nil) then + if self.currentScreen == "" then + screenName = self.defaultScreen + else + return + end + end + if screenName ~= "" then + self.set[screenName]:showSimple() + end +end + +function ScreenSet:setCurrentScreen(screenName) + screenName = screenName or self.defaultScreen + self:hideCurrent() + self.currentScreen = screenName +end + +function ScreenSet:hideCurrent() + if (self.currentScreen ~= "") then + self.set[self.currentScreen]:hide() + self.currentScreen = "" + end +end + +function ScreenSet:add(screen, setAsDefault) + self.set[screen.name] = screen + if (setAsDefault == true or self.defaultScreen == "") then + self.defaultScreen = screen.name + end + screen:setParentSet(self) +end + +return ScreenSet \ No newline at end of file