From 07a0eb180872401b271de40190603df8f3ab3db2 Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Fri, 30 Jan 2015 00:09:23 +0200 Subject: specify search pattern for references --- aconf/model/init.lua | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) (limited to 'aconf/model/init.lua') diff --git a/aconf/model/init.lua b/aconf/model/init.lua index 663c7f8..01b4791 100644 --- a/aconf/model/init.lua +++ b/aconf/model/init.lua @@ -74,7 +74,8 @@ M.Reference = class(Field) function M.Reference:init(params) super(self, M.Reference):init( util.setdefaults( - params, {on_delete='restrict', scope='/', widget='reference'} + params, + {on_delete='restrict', scope='/', search='*', widget='reference'} ) ) self.dtype = 'reference' @@ -84,7 +85,7 @@ end function M.Reference:topology(context) local res = super(self, M.Reference):topology(context) - res[1].scope = self.scope + update(res[1], {scope=self.scope, search=self.search}) return res end @@ -92,34 +93,38 @@ function M.Reference:abs_scope(context) return M.path.to_absolute(self.scope, node.path(context.parent)) end --- assume one-level refs for now function M.Reference:_choice(context) local res = {} + local onelevel = self.search == '*' - local obj = relabel( - 'system', node.fetch, context.parent, self:abs_scope(context) - ) - assert(isinstance(obj, node.Collection)) + local obj = relabel('system', node.fetch, context.parent, self.scope) + assert(isinstance(obj, node.TreeNode)) - for k, v in pairs(obj) do + for _, v in ipairs(node.search(obj, self.search)) do local ch = {enabled=true} - if isinstance(v, node.TreeNode) then - ch.ref = node.path(v) - if M.path.is_subordinate(context.path, ch.ref) then ch = nil end - if ch then - ch['ui-value'] = M.path.name(ch.ref) - ch.be_value = M.path.escape(ch['ui-value']) - ch.value = self.dereference and ch.ref or ch.be_value + if isinstance(v.value, node.TreeNode) then + ch.ref = node.path(v.value) + if M.path.is_subordinate(context.path, ch.ref) then ch = nil + else + update( + ch, + { + be_value=v.path, + value=self.dereference and ch.ref or v.path, + ['ui-value']=onelevel and M.path.name(v.path) or v.path + } + ) if self.filter then - assert(isinstance(v, model.Model)) - if not v:match(self.filter) then ch.enabled = false end + assert(isinstance(v.value, model.Model)) + if not v.value:match(self.filter) then ch.enabled = false end end end else - local ep = M.path.escape(v) - update(ch, {be_value=ep, value=ep, ['ui-value']=v}) + assert(onelevel) + local ep = M.path.escape(v.value) + update(ch, {be_value=ep, value=ep, ['ui-value']=v.value}) end if ch then table.insert(res, ch) end -- cgit v1.2.3