From 90911ebf91fad6d3201765aae468a9e356f00791 Mon Sep 17 00:00:00 2001 From: Robert Jelic <36573031+NoryiE@users.noreply.github.com> Date: Sat, 19 Apr 2025 06:19:02 +0200 Subject: [PATCH] :destroy fix for frame's with childrens with reactive properties --- src/elements/BaseElement.lua | 4 ++++ src/elements/Container.lua | 17 +++++++++++------ src/propertySystem.lua | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/elements/BaseElement.lua b/src/elements/BaseElement.lua index da72ada..b2c0c6c 100644 --- a/src/elements/BaseElement.lua +++ b/src/elements/BaseElement.lua @@ -1,5 +1,6 @@ local PropertySystem = require("propertySystem") local uuid = require("libraries/utils").uuid +local errorManager = require("errorManager") ---@configDescription The base class for all UI elements in Basalt. --- The base class for all UI elements in Basalt. This class provides basic properties and event handling functionality. @@ -252,6 +253,9 @@ end --- Destroys the element and cleans up all references --- @shortDescription Destroys the element and cleans up all references function BaseElement:destroy() + self._destroyed = true + self:removeAllObservers() + self:setFocused(false) for event in pairs(self._registeredEvents) do self:listenEvent(event, false) end diff --git a/src/elements/Container.lua b/src/elements/Container.lua index 7acf7ca..cc2a1d8 100644 --- a/src/elements/Container.lua +++ b/src/elements/Container.lua @@ -110,6 +110,7 @@ end --- @return boolean boolean the child is visible function Container:isChildVisible(child) if(child.get("visible") == false)then return false end + if(child._destroyed)then return false end local containerW, containerH = self.get("width"), self.get("height") local offsetX, offsetY = self.get("offsetX"), self.get("offsetY") @@ -273,7 +274,7 @@ end function Container:unregisterChildEvent(child, eventName) if self._values.childrenEvents[eventName] then for i, listener in ipairs(self._values.childrenEvents[eventName]) do - if listener == child then + if listener.get("id") == child.get("id") then table.remove(self._values.childrenEvents[eventName], i) self._values.eventListenerCount[eventName] = self._values.eventListenerCount[eventName] - 1 @@ -300,7 +301,8 @@ end --- @return Container self The container instance function Container:removeChild(child) for i,v in ipairs(self._values.children) do - if v == child then + if v.get("id") == child.get("id") then + self.basalt.LOGGER.debug("Removing child: "..child:getType()) table.remove(self._values.children, i) child.parent = nil break @@ -676,11 +678,14 @@ end --- @private function Container:destroy() - for _, child in ipairs(self._values.children) do - child:destroy() + if not self:isType("BaseFrame") then + self.set("childrenSorted", false) + VisualElement.destroy(self) + return self + else + errorManager.header = "Basalt Error" + errorManager.error("Cannot destroy a BaseFrame.") end - VisualElement.destroy(self) - return self end return Container \ No newline at end of file diff --git a/src/propertySystem.lua b/src/propertySystem.lua index df15068..ba283ee 100644 --- a/src/propertySystem.lua +++ b/src/propertySystem.lua @@ -405,7 +405,7 @@ end --- Removes all observers from a property --- @shortDescription Removes all observers from a property ---- @param name string The name of the property +--- @param name? string The name of the property --- @return table self The PropertySystem function PropertySystem:removeAllObservers(name) if name then