diff options
Diffstat (limited to 'acf2/model/node.lua')
-rw-r--r-- | acf2/model/node.lua | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/acf2/model/node.lua b/acf2/model/node.lua index 59c495d..d0d44cd 100644 --- a/acf2/model/node.lua +++ b/acf2/model/node.lua @@ -15,6 +15,7 @@ local super = object.super local pth = require('acf2.path') local util = require('acf2.util') +local copy = util.copy local update = util.update @@ -81,10 +82,13 @@ function M.TreeNode:init(context, dtype) function mt.get(k, options) return mt.load(k, options) end function mt.removable() return true end + function mt.member_removable(k) + local v = mt.load(k, {dereference=false}) + return not isinstance(v, M.TreeNode) or getmetatable(v).removable() + end + function mt.check_removable(k, v) - if v ~= nil then return end - local old = mt.load(k, {dereference=false}) - if isinstance(old, M.TreeNode) and not getmetatable(old).removable() then + if v == nil and not mt.member_removable(k) then raise(pth.join(mt.path, k), 'Cannot be deleted') end end @@ -204,9 +208,21 @@ function M.Collection:init(context, params, dtype) ) end + local meta = mt.meta + function mt.meta() + local res = copy(meta()) + res.removable = {} + for _, member in ipairs(mt.members()) do + if mt.member_removable(member) then + table.insert(res.removable, member) + end + end + return res + end + function mt.mmeta(name) local meta = mt.meta() - local res = util.copy(meta.members) + local res = copy(meta.members) if name ~= pth.wildcard then res['ui-name'] = meta['ui-member']..' '..name end |