From 9dbdc8216774c14b5841e4c33bb8e290c1bdb87f Mon Sep 17 00:00:00 2001 From: Robert Jelic <36573031+NoryiE@users.noreply.github.com> Date: Thu, 30 Oct 2025 07:32:46 +0100 Subject: [PATCH] Reactive State Fix --- src/elements/DropDown.lua | 4 +-- src/plugins/reactive.lua | 65 ++++++++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/elements/DropDown.lua b/src/elements/DropDown.lua index 04d362d..146ee12 100644 --- a/src/elements/DropDown.lua +++ b/src/elements/DropDown.lua @@ -36,7 +36,7 @@ local tHex = require("libraries/colorHex") --- text = "Option 1", --- callback = function(self) --- -- Handle selection ---- basalt.debug("Selected Option 1") +--- basalt.LOGGER.debug("Selected Option 1") --- end --- }, --- { @@ -49,7 +49,7 @@ local tHex = require("libraries/colorHex") --- --- -- Listen for selections --- dropdown:onChange(function(self, value) ---- basalt.debug("Selected:", value) +--- basalt.LOGGER.debug("Selected:", value) --- end) --- --- basalt.run() diff --git a/src/plugins/reactive.lua b/src/plugins/reactive.lua index b7f9265..afea0e2 100644 --- a/src/plugins/reactive.lua +++ b/src/plugins/reactive.lua @@ -30,13 +30,13 @@ end local function parseExpression(expr, element, propName) local deps = analyzeDependencies(expr) - + if deps.parent and not element.parent then errorManager.header = "Reactive evaluation error" errorManager.error("Expression uses parent but no parent available") return function() return nil end end - + expr = expr:gsub("^{(.+)}$", "%1") expr = expr:gsub("([%w_]+)%$([%w_]+)", function(obj, prop) @@ -87,9 +87,34 @@ local function parseExpression(expr, element, propName) return nil end if objName == "self" then - return element.get(propName) + -- Check if property exists + if element._properties[propName] then + return element.get(propName) + end + if element._registeredStates and element._registeredStates[propName] then + return element:hasState(propName) + end + local states = element.get("states") + if states and states[propName] ~= nil then + return true + end + errorManager.header = "Reactive evaluation error" + errorManager.error("Property or state '" .. propName .. "' not found in element '" .. element:getType() .. "'") + return nil elseif objName == "parent" then - return element.parent.get(propName) + if element.parent._properties[propName] then + return element.parent.get(propName) + end + if element.parent._registeredStates and element.parent._registeredStates[propName] then + return element.parent:hasState(propName) + end + local states = element.parent.get("states") + if states and states[propName] ~= nil then + return true + end + errorManager.header = "Reactive evaluation error" + errorManager.error("Property or state '" .. propName .. "' not found in parent element") + return nil else local target = element.parent:getChild(objName) if not target then @@ -98,7 +123,19 @@ local function parseExpression(expr, element, propName) return nil end - return target.get(propName) + if target._properties[propName] then + return target.get(propName) + end + if target._registeredStates and target._registeredStates[propName] then + return target:hasState(propName) + end + local states = target.get("states") + if states and states[propName] ~= nil then + return true + end + errorManager.header = "Reactive evaluation error" + errorManager.error("Property or state '" .. propName .. "' not found in element '" .. objName .. "'") + return nil end end }, { __index = mathEnv }) @@ -176,14 +213,26 @@ local function setupObservers(element, expr, propertyName) end if target then + local isState = false + if target._properties[prop] then + isState = false + elseif target._registeredStates and target._registeredStates[prop] then + isState = true + else + local states = target.get("states") + if states and states[prop] ~= nil then + isState = true + end + end + local observer = { target = target, - property = prop, + property = isState and "states" or prop, callback = function() element:updateRender() end } - target:observe(prop, observer.callback) + target:observe(observer.property, observer.callback) table.insert(observers, observer) end end @@ -196,7 +245,7 @@ PropertySystem.addSetterHook(function(element, propertyName, value, config) if type(value) == "string" and value:match("^{.+}$") then local expr = value:gsub("^{(.+)}$", "%1") local deps = analyzeDependencies(expr) - + if deps.parent and not element.parent then return config.default end