new.char[256]() to Json

Anti...

Активный
Автор темы
267
31
Версия MoonLoader
.026-beta
Реализовал создание imgui.InputText по кнопке, проще говоря, нажимаю на кнопку и создаются инпуты, каждый со своим буфером(индивидуальный). Могу так-же удалять их, без багов, благодаря imgui.PushIDInt сохраняю идентификатор этого элемента и по нему удаляю. Вопрос в том, как можно корректно эти инпуты сохранить в json файл? буфер new.char[256]() я же не смогу сохранить в json. Я понимаю, что сохранить нужно текст введённый в инпуте, декодировать и сохранить, но как быть с буферами, чтобы при обновлении скрипта инпуты остались? 😅нужно создать отдельную таблицу для буферов, но как это так "связать" между собой я не знаю..

Lua:
local imgui = require 'mimgui'
local ffi = require 'ffi'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local new = imgui.new
local renderWindow = new.bool(true)
local inputs = {}
local fileName = 'saveINPUT.json'

function json(filePath)
    local filePath = getWorkingDirectory()..'\\config\\'..(filePath:find('(.+).json') and filePath or filePath..'.json')
    local class = {}
    if not doesDirectoryExist(getWorkingDirectory()..'\\config') then
        createDirectory(getWorkingDirectory()..'\\config')
    end
   
    function class:Save(tbl)
        if tbl then
            local F = io.open(filePath, 'w')
            F:write(encodeJson(tbl) or {})
            F:close()
            return true, 'ok'
        end
        return false, 'table = nil'
    end

    function class:Load(defaultTable)
        if not doesFileExist(filePath) then
            class:Save(defaultTable or {})
        end
        local F = io.open(filePath, 'r+')
        local TABLE = decodeJson(F:read() or {})
        F:close()
        for def_k, def_v in next, defaultTable do
            if TABLE[def_k] == nil then
                TABLE[def_k] = def_v
            end
        end
        return TABLE
    end
    return class
end

local cfg = json(fileName):Load({})

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 200, 300
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        if imgui.Begin('Main Window', renderWindow) then
            if imgui.Button(u8'Create new input', imgui.ImVec2(-1, 0)) then
                table.insert(inputs, { buffer = new.char[256]() }) --ffi.new("char[256]")
                --table.insert(cfg, { buffer = new.char[256]() })
                --json(fileName):Save(cfg)
            end
            for i, input in ipairs(inputs) do
                imgui.PushIDInt(i)
                imgui.InputTextWithHint(u8'##input '..i, u8'Input '..i, input.buffer, ffi.sizeof(input.buffer))
                imgui.SameLine()
                if imgui.Button(u8'Remove') then
                    table.remove(inputs, i)
                    --table.remove(cfg, i)
                    --json(fileName):Save(cfg)
                end
                imgui.PopID()
            end
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('mimgui3', function()
        renderWindow[0] = not renderWindow[0]
    end)
    wait(-1)
end
 

moreveal

Известный
Проверенный
859
539
так при загрузке из json создавать им буффер заново, заполняя его сразу же сохраненным значением, размер то везде один у тебя вроде как, код не чекал - но если и разный, то сохраняешь помимо содержимого строки еще и размер, ничо сложного
Lua:
for _, buffer_text in ipairs(saved_buffers) do
    local buffer = new.char[256](buffer_text)
    table.insert(inputs, buffer)
end
 
  • Нравится
Реакции: Lance_Sterling