从 lua 表填充 iup 列表

问题描述 投票:0回答:2

我正在构建一组 IUP 对话框“帮助程序”函数——我可以将其包含在 Lua 代码中的样板,以便以一致的方式快速实现常用的界面功能。

我有一个函数可以使用回调创建“标准”iup 列表:

function MakeList(funcSelect)
    return iup.list{
        valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", editbox = "NO",
        expand = "YES", visibleitems = "5"}
end

但我现在想增强它以选择性地使用静态值列表填充它,以便我可以调用例如

mylist = MakeList(myFunction, {"X", "B", "Q"})
,其中函数规范为
function MakeList(funcSelect, tblVals)
并返回填充的列表(如果值表给出为) (相当于)

iup.list{"X", "B", "Q";
        valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", editbox = "NO",
        expand = "YES", visibleitems = "5"}

但是(最终)如果值表未指定或为空,则不会填充——这是问题的第二阶段。

列表将在映射之前填充;我知道如何在使用

myList.APPENDITEM
进行映射后执行此操作,但对于静态列表来说,这不是必需的(应该吗?)

我已经尝试过了

function MakeStaticList(funcSelect, tblVals)
    return iup.list{table.unpack(tblVals);
        valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", 
        editbox = "NO", expand = "YES", visibleitems = "5"}
end

但这会导致这种行为:Lua unpack() 搞乱参数,因此只有表中的第一项被添加到列表中。

我也尝试过

function MakeStaticList(funcSelect, tblVals)
    l = iup.list{valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", editbox = "NO", expand = "YES", visibleitems = "5"}
      for i, v in ipairs(tblVals) do
            l[tostring(i)]=v
      end
    return l
end

这确实有效,但是有没有更简洁的方法呢?

我想先解决填充问题,然后再讨论值表的可选性。

环境是 Lua 5.1,带有 compat-5.3 模块。

lua iup
2个回答
0
投票

如果它对任何人有帮助,我最终所做的是(满足索引和非索引列表):

    local function PopulateList(l, tblVals)
        local is_indexed = (rawget( tblVals, 1 ) ~= nil)
        if not is_indexed then
            local i=1
            for k, _ in pairs(tblVals) do
                l[tostring(i)]=k
                i=i+1
            end
        else
            for i, v in ipairs(tblVals) do
                l[tostring(i)]=v
            end 
        end
    end

0
投票

具有多个返回值的函数应放在表的末尾,否则将被截断。

local function foo() return 1,2,3,4,5 end
local t1 = {foo();}--{1,2,3,4,5}
local t2 = {foo();x="x"}--{[1]=1,x="x"}
local t3 = {x= "x",y="y",foo();}--{[1]=1,[2]=2,[3]=3,[4]=4,[5]=5,x="x",y="y"}
© www.soinside.com 2019 - 2024. All rights reserved.