Reactive State Fix

This commit is contained in:
Robert Jelic
2025-10-30 07:32:46 +01:00
parent 7099b5c548
commit 9dbdc82167
2 changed files with 59 additions and 10 deletions

View File

@@ -36,7 +36,7 @@ local tHex = require("libraries/colorHex")
--- text = "Option 1", --- text = "Option 1",
--- callback = function(self) --- callback = function(self)
--- -- Handle selection --- -- Handle selection
--- basalt.debug("Selected Option 1") --- basalt.LOGGER.debug("Selected Option 1")
--- end --- end
--- }, --- },
--- { --- {
@@ -49,7 +49,7 @@ local tHex = require("libraries/colorHex")
--- ---
--- -- Listen for selections --- -- Listen for selections
--- dropdown:onChange(function(self, value) --- dropdown:onChange(function(self, value)
--- basalt.debug("Selected:", value) --- basalt.LOGGER.debug("Selected:", value)
--- end) --- end)
--- ---
--- basalt.run() --- basalt.run()

View File

@@ -87,9 +87,34 @@ local function parseExpression(expr, element, propName)
return nil return nil
end end
if objName == "self" then 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 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 else
local target = element.parent:getChild(objName) local target = element.parent:getChild(objName)
if not target then if not target then
@@ -98,7 +123,19 @@ local function parseExpression(expr, element, propName)
return nil return nil
end 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
end end
}, { __index = mathEnv }) }, { __index = mathEnv })
@@ -176,14 +213,26 @@ local function setupObservers(element, expr, propertyName)
end end
if target then 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 = { local observer = {
target = target, target = target,
property = prop, property = isState and "states" or prop,
callback = function() callback = function()
element:updateRender() element:updateRender()
end end
} }
target:observe(prop, observer.callback) target:observe(observer.property, observer.callback)
table.insert(observers, observer) table.insert(observers, observer)
end end
end end