Skip to content

Commit 9dbdc82

Browse files
committed
Reactive State Fix
1 parent 7099b5c commit 9dbdc82

2 files changed

Lines changed: 59 additions & 10 deletions

File tree

src/elements/DropDown.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ local tHex = require("libraries/colorHex")
3636
--- text = "Option 1",
3737
--- callback = function(self)
3838
--- -- Handle selection
39-
--- basalt.debug("Selected Option 1")
39+
--- basalt.LOGGER.debug("Selected Option 1")
4040
--- end
4141
--- },
4242
--- {
@@ -49,7 +49,7 @@ local tHex = require("libraries/colorHex")
4949
---
5050
--- -- Listen for selections
5151
--- dropdown:onChange(function(self, value)
52-
--- basalt.debug("Selected:", value)
52+
--- basalt.LOGGER.debug("Selected:", value)
5353
--- end)
5454
---
5555
--- basalt.run()

src/plugins/reactive.lua

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ end
3030

3131
local function parseExpression(expr, element, propName)
3232
local deps = analyzeDependencies(expr)
33-
33+
3434
if deps.parent and not element.parent then
3535
errorManager.header = "Reactive evaluation error"
3636
errorManager.error("Expression uses parent but no parent available")
3737
return function() return nil end
3838
end
39-
39+
4040
expr = expr:gsub("^{(.+)}$", "%1")
4141

4242
expr = expr:gsub("([%w_]+)%$([%w_]+)", function(obj, prop)
@@ -87,9 +87,34 @@ local function parseExpression(expr, element, propName)
8787
return nil
8888
end
8989
if objName == "self" then
90-
return element.get(propName)
90+
-- Check if property exists
91+
if element._properties[propName] then
92+
return element.get(propName)
93+
end
94+
if element._registeredStates and element._registeredStates[propName] then
95+
return element:hasState(propName)
96+
end
97+
local states = element.get("states")
98+
if states and states[propName] ~= nil then
99+
return true
100+
end
101+
errorManager.header = "Reactive evaluation error"
102+
errorManager.error("Property or state '" .. propName .. "' not found in element '" .. element:getType() .. "'")
103+
return nil
91104
elseif objName == "parent" then
92-
return element.parent.get(propName)
105+
if element.parent._properties[propName] then
106+
return element.parent.get(propName)
107+
end
108+
if element.parent._registeredStates and element.parent._registeredStates[propName] then
109+
return element.parent:hasState(propName)
110+
end
111+
local states = element.parent.get("states")
112+
if states and states[propName] ~= nil then
113+
return true
114+
end
115+
errorManager.header = "Reactive evaluation error"
116+
errorManager.error("Property or state '" .. propName .. "' not found in parent element")
117+
return nil
93118
else
94119
local target = element.parent:getChild(objName)
95120
if not target then
@@ -98,7 +123,19 @@ local function parseExpression(expr, element, propName)
98123
return nil
99124
end
100125

101-
return target.get(propName)
126+
if target._properties[propName] then
127+
return target.get(propName)
128+
end
129+
if target._registeredStates and target._registeredStates[propName] then
130+
return target:hasState(propName)
131+
end
132+
local states = target.get("states")
133+
if states and states[propName] ~= nil then
134+
return true
135+
end
136+
errorManager.header = "Reactive evaluation error"
137+
errorManager.error("Property or state '" .. propName .. "' not found in element '" .. objName .. "'")
138+
return nil
102139
end
103140
end
104141
}, { __index = mathEnv })
@@ -176,14 +213,26 @@ local function setupObservers(element, expr, propertyName)
176213
end
177214

178215
if target then
216+
local isState = false
217+
if target._properties[prop] then
218+
isState = false
219+
elseif target._registeredStates and target._registeredStates[prop] then
220+
isState = true
221+
else
222+
local states = target.get("states")
223+
if states and states[prop] ~= nil then
224+
isState = true
225+
end
226+
end
227+
179228
local observer = {
180229
target = target,
181-
property = prop,
230+
property = isState and "states" or prop,
182231
callback = function()
183232
element:updateRender()
184233
end
185234
}
186-
target:observe(prop, observer.callback)
235+
target:observe(observer.property, observer.callback)
187236
table.insert(observers, observer)
188237
end
189238
end
@@ -196,7 +245,7 @@ PropertySystem.addSetterHook(function(element, propertyName, value, config)
196245
if type(value) == "string" and value:match("^{.+}$") then
197246
local expr = value:gsub("^{(.+)}$", "%1")
198247
local deps = analyzeDependencies(expr)
199-
248+
200249
if deps.parent and not element.parent then
201250
return config.default
202251
end

0 commit comments

Comments
 (0)