diff --git a/src/elements/BaseElement.lua b/src/elements/BaseElement.lua index a7e4cac..47bc637 100644 --- a/src/elements/BaseElement.lua +++ b/src/elements/BaseElement.lua @@ -232,6 +232,7 @@ function BaseElement:setState(stateName, priority) end states[stateName] = priority or 0 + self.set("states", states) return self end @@ -299,7 +300,9 @@ end function BaseElement:updateConditionalStates() for stateName, stateInfo in pairs(self._registeredStates) do if stateInfo.condition then - if stateInfo.condition(self) then + local result = stateInfo.condition(self) + + if result then self:setState(stateName, stateInfo.priority) else self:unsetState(stateName) diff --git a/src/plugins/reactive.lua b/src/plugins/reactive.lua index bf0b1e2..2a464dc 100644 --- a/src/plugins/reactive.lua +++ b/src/plugins/reactive.lua @@ -90,7 +90,7 @@ local function parseExpression(expr, element, propName) if objName == "self" then -- Check if property exists if element._properties[propName] then - return element.get(propName) + return element.getResolved(propName) end if element._registeredStates and element._registeredStates[propName] then return element:hasState(propName) @@ -104,7 +104,7 @@ local function parseExpression(expr, element, propName) return nil elseif objName == "parent" then if element.parent._properties[propName] then - return element.parent.get(propName) + return element.parent.getResolved(propName) end if element.parent._registeredStates and element.parent._registeredStates[propName] then return element.parent:hasState(propName) @@ -125,7 +125,7 @@ local function parseExpression(expr, element, propName) end if target._properties[propName] then - return target.get(propName) + return target.getResolved(propName) end if target._registeredStates and target._registeredStates[propName] then return target:hasState(propName) diff --git a/src/propertySystem.lua b/src/propertySystem.lua index 0c85b0b..9f7bf34 100644 --- a/src/propertySystem.lua +++ b/src/propertySystem.lua @@ -335,12 +335,16 @@ function PropertySystem:__init() end self.getResolved = function(name, ...) - local currentState = self:getCurrentState() - local value + local activeStates = self:getActiveStates() + local value = nil + for _, stateInfo in ipairs(activeStates) do + if self._states and self._states[stateInfo.name] and self._states[stateInfo.name][name] ~= nil then + value = self._states[stateInfo.name][name] + break + end + end - if currentState and self._states and self._states[currentState] and self._states[currentState][name] ~= nil then - value = self._states[currentState][name] - else + if value == nil then value = self._values[name] end