[mimgui] Выбор элементов

_Dino_

Активный
Автор темы
135
51
Версия MoonLoader
.026-beta
Как можно сделать чтобы то что я выбирал пропадало из списка ниже, и добавлялось в список выше. И после новой загрузки скрипта вся последовательность выбранного сохранялась?

HelpMePlease:
local itemsTuning = {
    {name = "Тут моё название1", category = "кейсики", id = 5},
    {name = "Тут моё название2", category = "игрушки", id = 8},
    {name = "Тут моё название3", category = "кейсики", id = 9},
    {name = "Тут моё название4", category = "игрушки", id = 11},
    {name = "Тут моё название5", category = "игрушки", id = 13},
    {name = "Тут моё название6", category = "кейсики", id = 15},
    {name = "Тут моё название7", category = "игрушки", id = 18},
    {name = "Тут моё название8", category = "игрушки", id = 21},
    {name = "Тут моё название9", category = "кейсики", id = 33},
    {name = "Тут моё название10", category = "игрушки", id = 75},
    {name = "Тут моё название11", category = "игрушки", id = 76},
    {name = "Тут моё название12", category = "кейсики", id = 77},
    {name = "Тут моё название13", category = "игрушки", id = 80},
    {name = "Тут моё название14", category = "игрушки", id = 91},
    {name = "Тут моё название15", category = "игрушки", id = 96},
    {name = "Тут моё название16", category = "кейсики", id = 98},
    {name = "Тут моё название17", category = "игрушки", id = 122},
    {name = "Тут моё название18", category = "игрушки", id = 124},
    {name = "Тут моё название19", category = "кейсики", id = 134},
    {name = "Тут моё название20", category = "игрушки", id = 161},
    ...
}

imgui.CenterText(u8"{A4FFA4}То что уже выбранно") imgui.PushFont(font_size[11])
imgui.CenterText(u8"{AFAFAF}То что Вы видите первым в списке, то используется соответственно первым.") imgui.PopFont()
local cSize = imgui.ImVec2(imgui.GetWindowSize().x - 10, 165) imgui.SetCursorPosX(5)
imgui.BeginChild("use", cSize, true, imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoScrollWithMouse)
imgui.EndChild()

imgui.CenterText(u8"{FFA4A4}То что осталось") imgui.PushFont(font_size[11])
imgui.CenterText(u8"{AFAFAF}Выберите из списка, что вы хотите.") imgui.PopFont()
local cSize = imgui.ImVec2(imgui.GetWindowSize().x - 10, 165) imgui.SetCursorPosX(5)
imgui.BeginChild("unUse", cSize, true, imgui.WindowFlags.NoScrollbar)
    local itemsPerRow, itemHeight, padding = 2, 35, 5
    local itemWidth = (cSize.x - 10 - (itemsPerRow - 1) * 5) / itemsPerRow
    for k, v in ipairs(itemsTuning) do
        local row = math.floor((k - 1) / itemsPerRow)
        local col = (k - 1) % itemsPerRow
        local posX = col * (itemWidth + 5) + padding
        local posY = row * (itemHeight + 5) + padding
        local pos = imgui.ImVec2(posX, posY)

        imgui.SetCursorPos(pos)
        if imgui.Button(u8(v.name).." ("..v.category..")", imgui.ImVec2(itemWidth, itemHeight)) then
            table.insert(settings.param.id, tonumber(v.id))
        end
    end
imgui.EndChild()

--| К примеру: settings.param.id = [161, 11, 122, 33, ..]
 

tfornik

Известный
309
222
сохранять надо в json, а не так.
потом парсишь json таблицу и удаляешь элементы
Вот стандарт функи, если хочешь без dksjson - замени строку "file:write(json.encode(table, {indent = 4}))" на "file:write(json.encode(table))" и убери "local json = require('dkjson')
Lua:
local json = require('dkjson')

function setjson()
    local f = {}
    function f:read(filename)
        local f = io.open(filename, 'r')
        local table = json.decode(f:read('*a'))
        f:close()
        return table
    end
    function f:write(table, filename)
        local file = io.open(filename, 'w')
        file:write(json.encode(table, {indent = 4}))
        file:close()
    end
end
 

_Dino_

Активный
Автор темы
135
51
сохранять надо в json, а не так.
потом парсишь json таблицу и удаляешь элементы
Вот стандарт функи, если хочешь без dksjson - замени строку "file:write(json.encode(table, {indent = 4}))" на "file:write(json.encode(table))" и убери "local json = require('dkjson')
Lua:
local json = require('dkjson')

function setjson()
    local f = {}
    function f:read(filename)
        local f = io.open(filename, 'r')
        local table = json.decode(f:read('*a'))
        f:close()
        return table
    end
    function f:write(table, filename)
        local file = io.open(filename, 'w')
        file:write(json.encode(table, {indent = 4}))
        file:close()
    end
end
не пойму для чего мне это сохранение в конфиг если у меня уже есть подобная функция, ну и сохранять мне нужно только иды
 

_Dino_

Активный
Автор темы
135
51
ты создаёшь переменную, и хочешь чтобы она после перезагрузки скрипта сохранялась в том виде , в котором ты отгружал скрипт? ( выходил из игры например )
либо я тебя не правильно понял, либо ты. У меня есть функция для сохранения/чтение настроек, в котором я их храню события по иду (только так мне нужно), и в самом скрипте есть таблица в которой написаны эти элементы с их идом. По сути их можно и сравнивать по этому ид, мне нужно только понять как сделать это в мимгуи чтобы то что я выбрал попадало в список сверху и наоборот если нажму на него из списка сверху оно убиралось и на его место ставилось то что после него, если оно было
 

Z3roKwq

Известный
294
157
либо я тебя не правильно понял, либо ты. У меня есть функция для сохранения/чтение настроек, в котором я их храню события по иду (только так мне нужно), и в самом скрипте есть таблица в которой написаны эти элементы с их идом. По сути их можно и сравнивать по этому ид, мне нужно только понять как сделать это в мимгуи чтобы то что я выбрал попадало в список сверху и наоборот если нажму на него из списка сверху оно убиралось и на его место ставилось то что после него, если оно было
Создаеш 2 массива, один у тебя уже есть и он должен быть константным, во втором же ты будеш хранить индексы элементов первого массива, которые ты выбрал, а чтоб они пропадали из списка сравнивай, "первый массив индекс != второй массив индекс", что бы сделать "активный" список просто создай второй цикл который будить ходить по 2 массиву с активными элементами, чтоб получить название или ид, просто обращайся к первому массиву использую значения индексов со второго, коротко говоря" "first_massive.at(second_massive.at(i)).id", если честно я привёл пример с плюсов, но думаю должно быть понятно :)