Проблема с порядком исполнения команд в ImGUI

Farshmac_inc

Новичок
Автор темы
3
0
Версия MoonLoader
.026-beta
Привет, помогите решить проблему. Уже неделю ломаю голову, что не так.
У меня есть окно imgui, в котором имеется 3 текстовых поля и 3 кнопки. По нажатию кнопки, соответствующее текстовое поле заменяется на поле для ввода, текст на кнопке с "Редактировать" заменяется на "Cохранить". По повторному нажатию инфа с поля для ввода сохраняется в буфер и в словарь(массив пар ключ-значение) пользователя. Повторяющийся код вынес в отдельную функцию.
Проблема в следующем: Сам функционал работает, но почему-то я не могу начать редактирование 2 поля, пока не запущу редактирование 1го, редактирование 3го пока не начну 2го, что требует редактирования 1го. С сохранением аналогично. Пока 1 не сохраню, не могу сохранять 2 и 3, пока не сохраню 2, не могу сохранить 3. Думал, что это может быть из-за того, что я вынес повторяющийся код в отдельную функцию, но нет.

Скрипт:
require "lib.moonloader"
local keys = require "vkeys"
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.utf8

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local officer_name = imgui.ImBuffer(256)
local officer_rang = imgui.ImBuffer(256)
local officer_mark = imgui.ImBuffer(256)

local is_nick_changed = imgui.ImBool(false)
local is_rang_changed = imgui.ImBool(false)
local is_mark_changed = imgui.ImBool(false)

local officer = {["Nick"] = "Nickname", ["ID"] = "234", ["Rang"] = "Лейтенант", ["Mark"] = "L-13"}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    imgui.Process = true
    officer_name.v = officer.Nick
    officer_rang.v = officer.Rang
    officer_mark.v = officer.Mark
 
    while true do
        wait(0)
        if main_window_state.v == false then imgui.Process = false end
        if isKeyJustPressed(VK_MENU) then cmd_imgui() end
    end
end

function cmd_imgui()
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end

function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(400, 200), imgui.Cond.Always)
    local x, y = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(x-200, y-300), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))

    imgui.Begin("Title", main_window_state)
    DataField(u8"Имя и фамилия: ", is_nick_changed, officer_name, officer.Nick)
    DataField(u8"Должность: ", is_rang_changed, officer_rang, officer.Rang)
    DataField(u8"Маркировка: ", is_mark_changed, officer_mark, officer.Mark)
    imgui.End()
end

function DataField(text, is_change_flag, boolField, officerData)
    if is_change_flag.v then
        imgui.InputText('', boolField)
        imgui.SameLine()
        if imgui.Button(u8'Сохранить', imgui.ImVec2(100, 18)) then
            sampAddChatMessage(is_change_flag, -1)
            is_change_flag.v = false
            officerData = boolField.v
        end
        imgui.NewLine()
    else
        imgui.Text(text..officerData)
        imgui.SameLine()
        if imgui.Button(u8'Редактировать', imgui.ImVec2(100, 18)) then
            sampAddChatMessage(is_change_flag, -1)
            is_change_flag.v = true
        end
        imgui.NewLine()
    end
end
 
Последнее редактирование:

Farshmac_inc

Новичок
Автор темы
3
0
Одну кнопку можно открывать после другой и так же с сохранением
2 если открыта 1, 3 если открыта 2
попробуй поставить одну общую кнопку для редактирования
К сожалению это не решение проблемы. Если на странице будет много кнопок с различных функционалом оно ведь точно также также не будет нормально работать.