feat: fixed extend register issue
This commit is contained in:
parent
2d47b75b84
commit
c6491b626a
2 changed files with 104 additions and 48 deletions
|
|
@ -12,6 +12,7 @@ function module.init(shared)
|
||||||
local event = shared.event; ---@type quad_module_event
|
local event = shared.event; ---@type quad_module_event
|
||||||
local bind = event.bind;
|
local bind = event.bind;
|
||||||
local store = shared.store; ---@type quad_module_store
|
local store = shared.store; ---@type quad_module_store
|
||||||
|
local initStoreRegisterBinding = store.__initStoreRegisterBinding;
|
||||||
local addObject = store.addObject;
|
local addObject = store.addObject;
|
||||||
local storeNew = store.new;
|
local storeNew = store.new;
|
||||||
local mount = shared.mount; ---@type quad_module_mount
|
local mount = shared.mount; ---@type quad_module_mount
|
||||||
|
|
@ -98,45 +99,17 @@ function module.init(shared)
|
||||||
local indexType = typeof(index);
|
local indexType = typeof(index);
|
||||||
|
|
||||||
-- child
|
-- child
|
||||||
if indexType == "string" and valueType == "table" and value.t == "reg" then -- register (bind to store event)
|
if indexType == "string" and valueType == "table" and value.__type == "quad_register" then -- register (bind to store event)
|
||||||
processedProperty[index] = true; -- ignore next
|
processedProperty[index] = true; -- ignore next
|
||||||
-- store binding
|
-- store reading
|
||||||
local with = value.wfunc;
|
do
|
||||||
local tstore = value.store;
|
local setValue = value:calcWithDefault(item);
|
||||||
local rawKey = value.key;
|
setProperty(item,index,setValue,className);
|
||||||
local tween = value.tvalue;
|
|
||||||
local from = value.fvalue;
|
|
||||||
local add = value.avalue;
|
|
||||||
local set = tstore[rawKey];
|
|
||||||
if set ~= nil or (rawKey:match(",") and with) then
|
|
||||||
if add then
|
|
||||||
set = set + add;
|
|
||||||
end
|
|
||||||
if from then
|
|
||||||
set = from[set];
|
|
||||||
end
|
|
||||||
if with then
|
|
||||||
set = with(tstore,set,value.key,item);
|
|
||||||
end
|
|
||||||
setProperty(item,index,set,className);
|
|
||||||
else
|
|
||||||
local dset = value.dvalue;
|
|
||||||
if dset then
|
|
||||||
setProperty(item,index,dset,className);
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- adding event function
|
-- adding event function (bindding)
|
||||||
local function regFn(_,newValue,key)
|
local function regFn(_,newValue,key)
|
||||||
if add then
|
local setValue,tween = value:calcWithNewValue(item,newValue,key);
|
||||||
newValue = newValue + add;
|
|
||||||
end
|
|
||||||
if from then
|
|
||||||
newValue = from[newValue];
|
|
||||||
end
|
|
||||||
if with then
|
|
||||||
newValue = with(tstore,newValue,key,item);
|
|
||||||
end
|
|
||||||
if tween then
|
if tween then
|
||||||
if not advancedTween then
|
if not advancedTween then
|
||||||
return warn "[QUAD] module 'AdvancedTween' needs to be loaded for tween properties but it is not found on 'src.libs'. you should adding that to src.libs directory";
|
return warn "[QUAD] module 'AdvancedTween' needs to be loaded for tween properties but it is not found on 'src.libs'. you should adding that to src.libs directory";
|
||||||
|
|
@ -152,9 +125,9 @@ function module.init(shared)
|
||||||
tween.OnStepped(item,...);
|
tween.OnStepped(item,...);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
advancedTween.RunTween(item,tween,{[index] = newValue},ended,onStepped,setProperty,getProperty);
|
advancedTween.RunTween(item,tween,{[index] = setValue},ended,onStepped,setProperty,getProperty);
|
||||||
else
|
else
|
||||||
setProperty(item,index,newValue,className);
|
setProperty(item,index,setValue,className);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
value:register(regFn);
|
value:register(regFn);
|
||||||
|
|
@ -300,7 +273,7 @@ function module.init(shared)
|
||||||
--- make new object
|
--- make new object
|
||||||
function this.new(prop)
|
function this.new(prop)
|
||||||
-- make metatable
|
-- make metatable
|
||||||
prop = storeNew(prop);
|
prop = storeNew(prop,nil);
|
||||||
local parent = prop and (prop.Parent or prop.parent);
|
local parent = prop and (prop.Parent or prop.parent);
|
||||||
local self = {__prop = prop; __parent = parent};
|
local self = {__prop = prop; __parent = parent};
|
||||||
local init = this.init;
|
local init = this.init;
|
||||||
|
|
@ -308,6 +281,7 @@ function module.init(shared)
|
||||||
init(self,prop);
|
init(self,prop);
|
||||||
end
|
end
|
||||||
setmetatable(self,this);
|
setmetatable(self,this);
|
||||||
|
initStoreRegisterBinding(prop,this);
|
||||||
|
|
||||||
-- render that
|
-- render that
|
||||||
local object = self:render(prop);
|
local object = self:render(prop);
|
||||||
|
|
|
||||||
102
src/store.lua
102
src/store.lua
|
|
@ -134,6 +134,51 @@ function module.init(shared)
|
||||||
add = function (s,value)
|
add = function (s,value)
|
||||||
return setmetatable({avalue = value},{__index = s});
|
return setmetatable({avalue = value},{__index = s});
|
||||||
end;
|
end;
|
||||||
|
-- return init data
|
||||||
|
calcWithDefault = function (s,withItem)
|
||||||
|
local with = s.wfunc;
|
||||||
|
local tstore = s.store;
|
||||||
|
local rawKey = s.key;
|
||||||
|
local tween = s.tvalue or s.dtvalue;
|
||||||
|
local from = s.fvalue;
|
||||||
|
local add = s.avalue;
|
||||||
|
local set = tstore[rawKey];
|
||||||
|
if set ~= nil or (rawKey:match(",") and with) then
|
||||||
|
if add then
|
||||||
|
set = set + add;
|
||||||
|
end
|
||||||
|
if from then
|
||||||
|
set = from[set];
|
||||||
|
end
|
||||||
|
if with then
|
||||||
|
set = with(tstore,set,rawKey,withItem);
|
||||||
|
end
|
||||||
|
return set,tween;
|
||||||
|
else
|
||||||
|
local dset = s.dvalue;
|
||||||
|
if dset ~= nil then
|
||||||
|
return dset,tween;
|
||||||
|
end
|
||||||
|
warn "[Quad] no default value found.";
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
calcWithNewValue = function(s,withItem,newValue,key)
|
||||||
|
local with = s.wfunc;
|
||||||
|
local tstore = s.store;
|
||||||
|
local tween = s.tvalue or s.dtvalue;
|
||||||
|
local from = s.fvalue;
|
||||||
|
local add = s.avalue;
|
||||||
|
if add then
|
||||||
|
newValue = newValue + add;
|
||||||
|
end
|
||||||
|
if from then
|
||||||
|
newValue = from[newValue];
|
||||||
|
end
|
||||||
|
if with then
|
||||||
|
newValue = with(tstore,newValue,key,withItem);
|
||||||
|
end
|
||||||
|
return newValue,tween;
|
||||||
|
end
|
||||||
};
|
};
|
||||||
registerClass.__index = registerClass;
|
registerClass.__index = registerClass;
|
||||||
|
|
||||||
|
|
@ -148,6 +193,11 @@ function module.init(shared)
|
||||||
return store[key];
|
return store[key];
|
||||||
end
|
end
|
||||||
function store:__newindex(key,value)
|
function store:__newindex(key,value)
|
||||||
|
-- if got register, just copy data to self and connect
|
||||||
|
if type(value) == "table" and value.__type == "quad_register" then
|
||||||
|
warn "[Quad] adding register value on store is only allowed when init store. set value request was ignored";
|
||||||
|
return;
|
||||||
|
end
|
||||||
self.__self[key] = value;
|
self.__self[key] = value;
|
||||||
local event = self.__evt[key];
|
local event = self.__evt[key];
|
||||||
if event then
|
if event then
|
||||||
|
|
@ -156,17 +206,49 @@ function module.init(shared)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
-- init bindings
|
||||||
|
function new.__initStoreRegisterBinding(self,withItem)
|
||||||
|
local selfTweens = self.__tweens;
|
||||||
|
local selfValues = self.__self;
|
||||||
|
for key,item in pairs(selfValues) do
|
||||||
|
if type(item) == "table" and item.__type == "quad_register" then
|
||||||
|
-- fetch data from origin
|
||||||
|
do
|
||||||
|
local tstore = item.store;
|
||||||
|
for tkey in item.key:gmatch("^[,]") do
|
||||||
|
selfValues[tkey] = tstore[tkey];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- calc value
|
||||||
|
do
|
||||||
|
local setValue,tween = item:calcWithDefault(withItem);
|
||||||
|
selfValues[key] = setValue;
|
||||||
|
selfTweens[key] = tween;
|
||||||
|
end
|
||||||
|
|
||||||
|
-- make event connection
|
||||||
|
item:register(function (_,newValue,eventKey)
|
||||||
|
-- !HOLD IT SELF TO PREVENT THIS REGISTER BEGIN REMOVED FROM MEMORY
|
||||||
|
local setValue = item:calcWithNewValue(withItem,newValue,eventKey);
|
||||||
|
self[key] = setValue;
|
||||||
|
end);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- create register
|
||||||
function store:__call(key,func)
|
function store:__call(key,func)
|
||||||
local last = self.__self[key];
|
local last = self.__self[key];
|
||||||
if last and type(last) == "table" and getmetatable(last) == registerClass then
|
if last and type(last) == "table" and getmetatable(last) == registerClass then
|
||||||
return last;
|
return last;
|
||||||
end
|
end
|
||||||
local register = self.__reg[key];
|
local register = self.__reg[key];
|
||||||
|
local tweens = self.__tweens;
|
||||||
if not register then
|
if not register then
|
||||||
register = setmetatable({
|
register = setmetatable({
|
||||||
key = key;
|
key = key;
|
||||||
store = self;
|
store = self;
|
||||||
t = "reg";
|
dtvalue = tweens and tweens[key];
|
||||||
},registerClass);
|
},registerClass);
|
||||||
self.__reg[key] = register;
|
self.__reg[key] = register;
|
||||||
end
|
end
|
||||||
|
|
@ -184,22 +266,22 @@ function module.init(shared)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function new.new(self,id)
|
function new.new(self,id)
|
||||||
if id then
|
|
||||||
local old = storeIdSpace[id];
|
|
||||||
if old then
|
|
||||||
return old;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local this = setmetatable(
|
local this = setmetatable(
|
||||||
{__self = self or {},__evt = {},__reg = setmetatable({},week)},store
|
{
|
||||||
|
__self = self or {}, -- real value storage
|
||||||
|
__evt = {}, -- changed event handler functions (dict of array)
|
||||||
|
__reg = setmetatable({},week), -- save registers
|
||||||
|
__tweens = {} -- tweens (if inited with register, save tween and use as default tween data)
|
||||||
|
},store
|
||||||
);
|
);
|
||||||
if id then
|
if id then -- save in id space
|
||||||
storeIdSpace[id] = this;
|
storeIdSpace[id] = this;
|
||||||
end
|
end
|
||||||
return this;
|
return this;
|
||||||
end
|
end
|
||||||
|
local storeNew = new.new;
|
||||||
function new.getStore(id)
|
function new.getStore(id)
|
||||||
return storeIdSpace[id] or new.new({},id);
|
return storeIdSpace[id] or storeNew({},id);
|
||||||
end
|
end
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue