[mimgui] Как добавить значение в конец Json

EX4MPLYCH

Участник
Автор темы
42
5
Версия MoonLoader
.026-beta
Делаю биндер и не пойму как при нажатий кнопки "+" добавить новый массив в конец json с заданными параметрами

Тут у меня цикл в котором он рендерит поля для ввода и задержки с методом
Lua:
imgui.BeginChild('binds_edit', imgui.ImVec2(680, 250), false)
        local itemsList = {u8"Отправить серверу", u8"-Отправить клиенту SAMP", u8"-Написать в чат и закрыть его", u8"Написать в чат", u8"В локальный чат", u8"-В активное диалоговое окно", u8"-Скопировать в буфер обмена", u8"-В консоль SF и биндера", u8"-В уведомления", u8"-Без отправки"}
        local items = imgui.new['const char*'][#itemsList](itemsList)
        for l = 1, #tbinder[PickedTab].binds[Pickedbind].lines do
                lines = l
                BindLinesEdit = imgui.new.char[256](str(tbinder[PickedTab].binds[Pickedbind].lines[lines].text))
                BindDelayEdit = imgui.new.char[128](encodeJson(tbinder[PickedTab].binds[Pickedbind].lines[lines].delay))
                current = imgui.new.int(tbinder[PickedTab].binds[Pickedbind].lines[lines].method)
                imgui.PushItemWidth(400)
                if imgui.InputText("###BindLinesEdit"..l, BindLinesEdit, sizeof(BindLinesEdit)) then
                --1
                tbinder[PickedTab].binds[Pickedbind].lines[lines].text = str(BindLinesEdit)
                end
                imgui.SameLine()
                imgui.PushItemWidth(120)
                if imgui.InputText("###BindDelayEdit"..l, BindDelayEdit, sizeof(BindDelayEdit)) then
                --2
                tbinder[PickedTab].binds[Pickedbind].lines[lines].delay = decodeJson(str(BindDelayEdit))
                end
                imgui.SameLine()
                imgui.PushItemWidth(120)
                --3
                if imgui.Combo("###method"..l, current, items, #itemsList) then
                tbinder[PickedTab].binds[Pickedbind].lines[lines].method = current[0]
                end
        end
        --При нажатий кнопки должны добавиться значения 1, 2, 3 только пустые
        if imgui.Button("+") then

        end
imgui.EndChild()

Вот как выглядит сам цикл:

Сама таблица json выглядит так:
Json:
[
  {
    "binds": [
      {
          --Cюда в lines дожен прибавиться еще один массив в конец с пустыми значениями method, delay, text
        "lines": [
          {
            "method": 0,
            "delay": 1900,
            "text": "/me достал из кармана бейджик"
          },
          {
            "method": 0,
            "text": "/me надел бейджик",
            "delay": 1900
          },
          {
            "method": 0,
            "text": "/do На бейджике: Доктор Фамилия | Хирург",
            "delay": 1900
          },
          {
            "method": 0,
            "text": "/clist 9",
            "delay": 1900
          }
        ],
        "name": "Бейджик [надеть]",
        "cmd": "нбэйдж",
        "key": {
          "v": {}
        }
      }
    ]
  }
]
 
Решение
Lua:
local some_table = {
    addresses = {
        _k = 1, -- стандартный ключ
        _d = { -- стандартное значение, может быть чем угодно
            host = "", -- IP or domain
            is_domain = false, -- if true then host is domain, else host is ip
            port = 7777,
        }
    },
   
    save = nil,
    load = nil,
}

function table.copy(t, _seen)
   if type(t) ~= "table" then return t end

   local seen = _seen or {}
   if seen[t] then return seen[t] end

   local _copy = setmetatable({}, getmetatable(t))
   seen[t] = _copy

   for k, v in pairs(t) do _copy[k] = table.copy(v, seen) end

   return _copy
end

где надо добавить
Lua:
table.insert(some_table.addresses, table.copy(some_table.addresses._d))
...

RedHolms

Известный
Проверенный
617
360
Lua:
local some_table = {
    addresses = {
        _k = 1, -- стандартный ключ
        _d = { -- стандартное значение, может быть чем угодно
            host = "", -- IP or domain
            is_domain = false, -- if true then host is domain, else host is ip
            port = 7777,
        }
    },
   
    save = nil,
    load = nil,
}

function table.copy(t, _seen)
   if type(t) ~= "table" then return t end

   local seen = _seen or {}
   if seen[t] then return seen[t] end

   local _copy = setmetatable({}, getmetatable(t))
   seen[t] = _copy

   for k, v in pairs(t) do _copy[k] = table.copy(v, seen) end

   return _copy
end

где надо добавить
Lua:
table.insert(some_table.addresses, table.copy(some_table.addresses._d))

p.s. учитывай, что при итерации нужно игнорировать _k & _d
пример:
Lua:
for k, v in pairs(t) do
    if k == "_k" or k == "_d" then goto continue end
    
    -- ...
    
    ::continue::
end
 

EX4MPLYCH

Участник
Автор темы
42
5
Lua:
local some_table = {
    addresses = {
        _k = 1, -- стандартный ключ
        _d = { -- стандартное значение, может быть чем угодно
            host = "", -- IP or domain
            is_domain = false, -- if true then host is domain, else host is ip
            port = 7777,
        }
    },
  
    save = nil,
    load = nil,
}

function table.copy(t, _seen)
   if type(t) ~= "table" then return t end

   local seen = _seen or {}
   if seen[t] then return seen[t] end

   local _copy = setmetatable({}, getmetatable(t))
   seen[t] = _copy

   for k, v in pairs(t) do _copy[k] = table.copy(v, seen) end

   return _copy
end

где надо добавить
Lua:
table.insert(some_table.addresses, table.copy(some_table.addresses._d))

p.s. учитывай, что при итерации нужно игнорировать _k & _d
пример:
Lua:
for k, v in pairs(t) do
    if k == "_k" or k == "_d" then goto continue end
   
    -- ...
   
    ::continue::
end
Спасибо большое

изображение_2023-01-18_234026967.png