Заполнение списка iup из таблицы lua - PullRequest
0 голосов
/ 06 января 2019

Я создаю набор вспомогательных функций диалога 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.

1 Ответ

0 голосов
/ 14 января 2019

В случае, если это кому-нибудь поможет, то, что я наконец-то сделал (воспользовавшись индексированными и неиндексированными списками):

    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
...