从 Lua 表中填充 iup 列表

我正在建立一组 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() messing arguments,因此只有表中的第一项被添加到列表中。

我也尝试过

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 模块。

点赞
用户1943174
用户1943174

在这里只是为帮助大家,我最终做的是(适用于索引和非索引列表):

    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
2019-01-14 12:58:06