- Added a new system to dynamically require source from multiple locations (including web)

- Added the Collection Element and moved parts of the List logic to collection
- Added a State Management System
- Added a better system to change the position/size of elements
- Removed the state plugin
This commit is contained in:
Robert Jelic
2025-10-27 08:25:58 +01:00
parent 565209d63e
commit b96875a3e9
19 changed files with 1699 additions and 521 deletions

View File

@@ -88,6 +88,17 @@ function PropertySystem.defineProperty(class, name, config)
self:_updateProperty(name, value)
return self
end
class["get" .. capitalizedName .. "State"] = function(self, state, ...)
expect(1, self, "element")
return self.getPropertyState(name, state, ...)
end
class["set" .. capitalizedName .. "State"] = function(self, state, value, ...)
expect(1, self, "element")
self.setPropertyState(name, state, value, ...)
return self
end
end
--- Combines multiple properties into a single getter and setter
@@ -251,6 +262,7 @@ end
function PropertySystem:__init()
self._values = {}
self._observers = {}
self._states = {}
self.set = function(name, value, ...)
local oldValue = self._values[name]
@@ -281,6 +293,65 @@ function PropertySystem:__init()
return config.getter and config.getter(self, value, ...) or value
end
self.setPropertyState = function(name, state, value, ...)
local config = self._properties[name]
if(config~=nil)then
if(config.setter) then
value = config.setter(self, value, ...)
end
value = applyHooks(self, name, value, config)
if not self._states[state] then
self._states[state] = {}
end
self._states[state][name] = value
local currentState = self._values.currentState
if currentState == state then
if config.canTriggerRender then
self:updateRender()
end
if self._observers[name] then
for _, callback in ipairs(self._observers[name]) do
callback(self, value, nil)
end
end
end
end
end
self.getPropertyState = function(name, state, ...)
local stateValue = self._states and self._states[state] and self._states[state][name]
local value = stateValue ~= nil and stateValue or self._values[name]
local config = self._properties[name]
if(config==nil)then errorManager.error("Property not found: "..name) return end
if type(value) == "function" and config.type ~= "function" then
value = value(self)
end
return config.getter and config.getter(self, value, ...) or value
end
self.getResolved = function(name, ...)
local currentState = self:getCurrentState()
local value
if currentState and self._states and self._states[currentState] and self._states[currentState][name] ~= nil then
value = self._states[currentState][name]
else
value = self._values[name]
end
local config = self._properties[name]
if(config==nil)then errorManager.error("Property not found: "..name) return end
if type(value) == "function" and config.type ~= "function" then
value = value(self)
end
return config.getter and config.getter(self, value, ...) or value
end
local properties = {}
local currentClass = getmetatable(self).__index
@@ -439,6 +510,8 @@ function PropertySystem:removeProperty(name)
local capitalizedName = name:sub(1,1):upper() .. name:sub(2)
self["get" .. capitalizedName] = nil
self["set" .. capitalizedName] = nil
self["get" .. capitalizedName .. "State"] = nil
self["set" .. capitalizedName .. "State"] = nil
return self
end