запись много строчного текста

$Mr.R1ch$

Активный
Автор темы
314
49
Версия MoonLoader
Другое
Приветствую, недавно решил попробовать создать простенький биндер на mimgui, но столкнулся с проблемой. При создании биндера, нужно указать любой текст в InputTextMultiline, но много строчный текст в ini не не может быть записан (это и понятно). Пытался исправить но вылазит ошибка. (строка 82)

Видел что такое реализовывали в других скриптах, но я чуток не понял как оно работает.

Lua:
local imgui = require ('mimgui')
local new = imgui.new

local encoding = require ('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local ffi = require ('ffi')

local sampev = require ('samp.events')

local inicfg = require ('inicfg')
local ini = inicfg.load({
  
}, "test_binder.ini")
  

local MainWindow = new.bool(false)
local sizeX, sizeY = getScreenResolution()

local name_bind = new.char[256]()
local text_bind = new.char[256]()
local delay_bind = new.float[10]()


  imgui.OnFrame(function() return MainWindow[0] and not isGamePaused() end, function(window)
     imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
     imgui.SetNextWindowSize(imgui.ImVec2(1300, 900), imgui.Cond.FirstUseEver)
     imgui.Begin(u8'Биндер', MainWindow)
    
     if imgui.Button(u8'Добавить биндер', imgui.ImVec2(1290, 40)) then
        imgui.OpenPopup(u8'Создание биндера')
     end
    
     imgui.Text(u8'Строки:')
    
     for i, v in ipairs(ini) do
        if v[1] and v[2] then
           imgui.BeginChild("##Test", imgui.ImVec2(-1, -1), true)
           imgui.Text(u8'Команда:')
           imgui.Text(u8(v[1]))
           imgui.Spacing()
           imgui.Text(u8'Текст:')
           imgui.Text(v[2])
           imgui.SameLine()
           if imgui.Button('X') then
              table.remove(ini, i)
              inicfg.save(ini, "test_binder.ini")
           end
           imgui.EndChild()
        end
     end
              
    
     if imgui.BeginPopupModal(u8'Создание биндера', _, imgui.WindowFlags.AlwaysAutoResize) then
        imgui.BeginChild('##name', imgui.ImVec2(1300, 800), true)
        
        imgui.Text(u8'Название команды:')
        imgui.Spacing()
        
        imgui.Text('/')
        
        imgui.SameLine()
        
        imgui.PushItemWidth(400)
        imgui.InputText("##name123", name_bind, 256)
        imgui.PopItemWidth()
        
        imgui.Spacing()
        
        imgui.Text(u8'Задержка от 0.1 до 5 сек:')
        
        imgui.PushItemWidth(400)
        imgui.InputFloat("##name333", delay_bind, 5)
        imgui.PopItemWidth()
        
        
        imgui.Spacing()
        imgui.Text(u8'Текст биндера:')
        imgui.Spacing()
        
        if imgui.InputTextMultiline("##name321", text_bind, 256, imgui.ImVec2(-1, -1)) then
           -- почему то не работает
          -- text_bind[0] = string.gsub(ffi.string(text_bind), "\n", "&")
        end
        
        imgui.NewLine()
        
        if imgui.Button(u8'Создать', imgui.ImVec2(1290, 40)) then
          
           local name = ffi.string(name_bind)
           local text = ffi.string(text_bind)
          
           if name and text and delay_bind[0] ~= "" then
          
           local newBind = {
              [1] = name,
              [2] = text,
              [3] = delay_bind[0]
           }
          
           table.insert(ini, newBind)
           inicfg.save(ini, "test_binder.ini")
          
           imgui.CloseCurrentPopup()
           end
        end
        
        imgui.Spacing()
        
        if imgui.Button(u8'Закрыть', imgui.ImVec2(1290, 40)) then
           imgui.CloseCurrentPopup()
        end
        
        imgui.EndChild()
     end
    
     imgui.End()
  end)
 
 
  function sampev.onSendCommand(cmd)
     for i, v in ipairs(ini) do
        if v[1] ~= "" and cmd == "/"..v[1] then
           for str in string.gmatch(v[2], "[^\r\n]+") do
              lua_thread.create(function()
                 sampSendChat(u8:decode(ffi.string(str)))
                 wait(v[3]*1000)
              end)
           end
           return false
        end
     end
  end
 
 
    imgui.OnInitialize(function()
     theme()
  end)
 
  function theme()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    local ImVec2 = imgui.ImVec2

    style.WindowPadding = ImVec2(15, 15) -- отступы окон
       style.WindowTitleAlign = ImVec2(0.5, 0.5) -- заголовок окна
       style.FramePadding = ImVec2(5, 5)
       style.ItemSpacing = ImVec2(5, 4)
       style.ItemInnerSpacing = ImVec2(2, 2)
       style.TouchExtraPadding = ImVec2(0, 0)
       style.IndentSpacing = 0
       style.ScrollbarSize = 23 -- размер скролла (ползунка)
       style.GrabMinSize = 15

       --==[ BORDER ]==--
       style.WindowBorderSize = 0
       style.ChildBorderSize = 2
       style.PopupBorderSize = 0
       style.FrameBorderSize = 0 --обводка кнопок, импутов, чекбоксов и тп
       style.TabBorderSize = 0

      --==[ ROUNDING ]==--
      style.WindowRounding = 4 --  края окон
      style.ChildRounding = 4 -- края begin child
      style.FrameRounding = 4 -- края кнопок
      style.PopupRounding = 0
      style.ScrollbarRounding = 1 -- края ползунка
      style.GrabRounding = 1
      style.TabRounding = 8
      
      imgui.GetIO().IniFilename = nil
  end

 
 
  function main()
     while not isSampAvailable() do wait(100) end
     wait(500)
     sampRegisterChatCommand('bind', function()
        MainWindow[0] = not MainWindow[0]
     end)
    
     while true do wait(0)
     end
  end
 
  • Клоун
Реакции: Corenale
Решение
помогите исправить всего одну строчку.
Нашел темы с точно такими же проблемами, пытался сделать по примеру но ничего, уже пробовал по разному делать.

Lua:
-- on MIMGUI
if imgui.InputTextMultiline("##name321", text_bind, ffi.sizeof(text_bind), imgui.ImVec2(-1, -1)) then
     text_bind[0] = string.gsub(ffi.string(text_bind), "\n", "&")
 end
1. char[] нельзя читать/менять через нулевой индекс, чтение делается через ffi.string, а изменение значения через imgui.StrCopy
2. сука ну ты блять логику включи или хотя бы гуглить научись ебаный в рот
Lua:
local buf = imgui.new.char[32](ini.main.text:gsub('&', '\n'));


imgui.InputTextMultiline(...);
if (imgui.Button('Save')) then
    ini.main.text = ffi.string(buf):gsub('\n', '&');
    --...

Smeruxa

t.me/smeruxa
Проверенный
1,394
737
Приветствую, недавно решил попробовать создать простенький биндер на mimgui, но столкнулся с проблемой. При создании биндера, нужно указать любой текст в InputTextMultiline, но много строчный текст в ini не не может быть записан (это и понятно). Пытался исправить но вылазит ошибка. (строка 82)

Видел что такое реализовывали в других скриптах, но я чуток не понял как оно работает.

Lua:
local imgui = require ('mimgui')
local new = imgui.new

local encoding = require ('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local ffi = require ('ffi')

local sampev = require ('samp.events')

local inicfg = require ('inicfg')
local ini = inicfg.load({
 
}, "test_binder.ini")
 

local MainWindow = new.bool(false)
local sizeX, sizeY = getScreenResolution()

local name_bind = new.char[256]()
local text_bind = new.char[256]()
local delay_bind = new.float[10]()


  imgui.OnFrame(function() return MainWindow[0] and not isGamePaused() end, function(window)
     imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
     imgui.SetNextWindowSize(imgui.ImVec2(1300, 900), imgui.Cond.FirstUseEver)
     imgui.Begin(u8'Биндер', MainWindow)
  
     if imgui.Button(u8'Добавить биндер', imgui.ImVec2(1290, 40)) then
        imgui.OpenPopup(u8'Создание биндера')
     end
  
     imgui.Text(u8'Строки:')
  
     for i, v in ipairs(ini) do
        if v[1] and v[2] then
           imgui.BeginChild("##Test", imgui.ImVec2(-1, -1), true)
           imgui.Text(u8'Команда:')
           imgui.Text(u8(v[1]))
           imgui.Spacing()
           imgui.Text(u8'Текст:')
           imgui.Text(v[2])
           imgui.SameLine()
           if imgui.Button('X') then
              table.remove(ini, i)
              inicfg.save(ini, "test_binder.ini")
           end
           imgui.EndChild()
        end
     end
            
  
     if imgui.BeginPopupModal(u8'Создание биндера', _, imgui.WindowFlags.AlwaysAutoResize) then
        imgui.BeginChild('##name', imgui.ImVec2(1300, 800), true)
      
        imgui.Text(u8'Название команды:')
        imgui.Spacing()
      
        imgui.Text('/')
      
        imgui.SameLine()
      
        imgui.PushItemWidth(400)
        imgui.InputText("##name123", name_bind, 256)
        imgui.PopItemWidth()
      
        imgui.Spacing()
      
        imgui.Text(u8'Задержка от 0.1 до 5 сек:')
      
        imgui.PushItemWidth(400)
        imgui.InputFloat("##name333", delay_bind, 5)
        imgui.PopItemWidth()
      
      
        imgui.Spacing()
        imgui.Text(u8'Текст биндера:')
        imgui.Spacing()
      
        if imgui.InputTextMultiline("##name321", text_bind, 256, imgui.ImVec2(-1, -1)) then
           -- почему то не работает
          -- text_bind[0] = string.gsub(ffi.string(text_bind), "\n", "&")
        end
      
        imgui.NewLine()
      
        if imgui.Button(u8'Создать', imgui.ImVec2(1290, 40)) then
        
           local name = ffi.string(name_bind)
           local text = ffi.string(text_bind)
        
           if name and text and delay_bind[0] ~= "" then
        
           local newBind = {
              [1] = name,
              [2] = text,
              [3] = delay_bind[0]
           }
        
           table.insert(ini, newBind)
           inicfg.save(ini, "test_binder.ini")
        
           imgui.CloseCurrentPopup()
           end
        end
      
        imgui.Spacing()
      
        if imgui.Button(u8'Закрыть', imgui.ImVec2(1290, 40)) then
           imgui.CloseCurrentPopup()
        end
      
        imgui.EndChild()
     end
  
     imgui.End()
  end)
 
 
  function sampev.onSendCommand(cmd)
     for i, v in ipairs(ini) do
        if v[1] ~= "" and cmd == "/"..v[1] then
           for str in string.gmatch(v[2], "[^\r\n]+") do
              lua_thread.create(function()
                 sampSendChat(u8:decode(ffi.string(str)))
                 wait(v[3]*1000)
              end)
           end
           return false
        end
     end
  end
 
 
    imgui.OnInitialize(function()
     theme()
  end)
 
  function theme()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    local ImVec2 = imgui.ImVec2

    style.WindowPadding = ImVec2(15, 15) -- отступы окон
       style.WindowTitleAlign = ImVec2(0.5, 0.5) -- заголовок окна
       style.FramePadding = ImVec2(5, 5)
       style.ItemSpacing = ImVec2(5, 4)
       style.ItemInnerSpacing = ImVec2(2, 2)
       style.TouchExtraPadding = ImVec2(0, 0)
       style.IndentSpacing = 0
       style.ScrollbarSize = 23 -- размер скролла (ползунка)
       style.GrabMinSize = 15

       --==[ BORDER ]==--
       style.WindowBorderSize = 0
       style.ChildBorderSize = 2
       style.PopupBorderSize = 0
       style.FrameBorderSize = 0 --обводка кнопок, импутов, чекбоксов и тп
       style.TabBorderSize = 0

      --==[ ROUNDING ]==--
      style.WindowRounding = 4 --  края окон
      style.ChildRounding = 4 -- края begin child
      style.FrameRounding = 4 -- края кнопок
      style.PopupRounding = 0
      style.ScrollbarRounding = 1 -- края ползунка
      style.GrabRounding = 1
      style.TabRounding = 8
    
      imgui.GetIO().IniFilename = nil
  end

 
 
  function main()
     while not isSampAvailable() do wait(100) end
     wait(500)
     sampRegisterChatCommand('bind', function()
        MainWindow[0] = not MainWindow[0]
     end)
  
     while true do wait(0)
     end
  end
Кто сказал что нельзя?

Lua:
local inicfg = require ('inicfg')

local ini = inicfg.load({
 main = {
   text_bind = ""
 }
}, "test_binder.ini")
inicfg.save(ini, "text_binder.ini")

local text_bind = new.char[512](ini.main.text_bind) -- тут важно с u8 разобраться, когда и как переводить, чтобы корректно сохранить русский, но тут лишь пример дам
 
-- InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
if imgui.InputTextMultiline("##name321", text_bind, ffi.sizeof(text_bind)) then
    ini.main.text_bind = ffi.string(text_bind)
    inicfg.save(ini, "text_binder.ini")
end
 

$Mr.R1ch$

Активный
Автор темы
314
49
Кто сказал что нельзя?

Lua:
local inicfg = require ('inicfg')

local ini = inicfg.load({
 main = {
   text_bind = ""
 }
}, "test_binder.ini")
inicfg.save(ini, "text_binder.ini")

local text_bind = new.char[512](ini.main.text_bind) -- тут важно с u8 разобраться, когда и как переводить, чтобы корректно сохранить русский, но тут лишь пример дам
 
-- InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
if imgui.InputTextMultiline("##name321", text_bind, ffi.sizeof(text_bind)) then
    ini.main.text_bind = ffi.string(text_bind)
    inicfg.save(ini, "text_binder.ini")
end
можно как то обойтись без ини с этим инпутом? нужно чтобы текст записывался построчно при создании бинда, как раз таки текст с этого инпута вставляется в конфиг, нашел пример кода:
Lua:
if imgui.InputTextMultiline("     ", bind_text, ffi.sizeof(bind_text),imgui.ImVec2(-1, -1)) then
-- как я понял, str это ffi.string
   mainIni.binder[ttax .. "_text"] = string.gsub(str(bind_text), "\n", "&")
 inicfg.save(mainIni, 'smi.ini')
end
 

$Mr.R1ch$

Активный
Автор темы
314
49
  • Ха-ха
Реакции: Smeruxa

chapo

чопа сребдс // TG/IG: @moujeek
Модератор
9,005
11,829
ну мля, мне весь конфиг тогда придется переделывать, а он там супер мега большой
че переделывать епта, просто значения дефолтные вставил и все, зато потом не надо будет ебаться с конвертацией луашных типов в сишные
 
  • Влюблен
Реакции: XRLM

$Mr.R1ch$

Активный
Автор темы
314
49
помогите исправить всего одну строчку.
Нашел темы с точно такими же проблемами, пытался сделать по примеру но ничего, уже пробовал по разному делать.

Lua:
-- on MIMGUI
if imgui.InputTextMultiline("##name321", text_bind, ffi.sizeof(text_bind), imgui.ImVec2(-1, -1)) then
     text_bind[0] = string.gsub(ffi.string(text_bind), "\n", "&")
 end
 

chapo

чопа сребдс // TG/IG: @moujeek
Модератор
9,005
11,829
помогите исправить всего одну строчку.
Нашел темы с точно такими же проблемами, пытался сделать по примеру но ничего, уже пробовал по разному делать.

Lua:
-- on MIMGUI
if imgui.InputTextMultiline("##name321", text_bind, ffi.sizeof(text_bind), imgui.ImVec2(-1, -1)) then
     text_bind[0] = string.gsub(ffi.string(text_bind), "\n", "&")
 end
так может быть ты объяснишь в чем конкретно проблема? Что надо исправить то?
 

$Mr.R1ch$

Активный
Автор темы
314
49
так может быть ты объяснишь в чем конкретно проблема? Что надо исправить то?
текст с этого поля ввода должен записываться в одну строчку, например в ini он должен выглядеть так: "привет&как твои дела?" а в самом инпуте так:
"привет
как твои дела?". (надеюсь понятно)
 

Smeruxa

t.me/smeruxa
Проверенный
1,394
737
текст с этого поля ввода должен записываться в одну строчку, например в ini он должен выглядеть так: "привет&как твои дела?" а в самом инпуте так:
"привет
как твои дела?". (надеюсь понятно)
В этом нет необходимости, сохраняй как есть, а потом при необходимости делай разделение через \n
 

chapo

чопа сребдс // TG/IG: @moujeek
Модератор
9,005
11,829
помогите исправить всего одну строчку.
Нашел темы с точно такими же проблемами, пытался сделать по примеру но ничего, уже пробовал по разному делать.

Lua:
-- on MIMGUI
if imgui.InputTextMultiline("##name321", text_bind, ffi.sizeof(text_bind), imgui.ImVec2(-1, -1)) then
     text_bind[0] = string.gsub(ffi.string(text_bind), "\n", "&")
 end
1. char[] нельзя читать/менять через нулевой индекс, чтение делается через ffi.string, а изменение значения через imgui.StrCopy
2. сука ну ты блять логику включи или хотя бы гуглить научись ебаный в рот
Lua:
local buf = imgui.new.char[32](ini.main.text:gsub('&', '\n'));


imgui.InputTextMultiline(...);
if (imgui.Button('Save')) then
    ini.main.text = ffi.string(buf):gsub('\n', '&');
    -- save cfg
end
В этом нет необходимости, сохраняй как есть, а потом при необходимости делай разделение через \n
иникфг вроде не поддерживает многострочный текст, там файлик ломается, а этот уволень не хочет переходить на жсон
 
  • Нравится
Реакции: $Mr.R1ch$, XRLM и Smeruxa

$Mr.R1ch$

Активный
Автор темы
314
49
1. char[] нельзя читать/менять через нулевой индекс, чтение делается через ffi.string, а изменение значения через imgui.StrCopy
2. сука ну ты блять логику включи или хотя бы гуглить научись ебаный в рот
Lua:
local buf = imgui.new.char[32](ini.main.text:gsub('&', '\n'));


imgui.InputTextMultiline(...);
if (imgui.Button('Save')) then
    ini.main.text = ffi.string(buf):gsub('\n', '&');
    -- save cfg
end

иникфг вроде не поддерживает многострочный текст, там файлик ломается, а этот уволень не хочет переходить на жсон
ебать, погуглил, нихуя не нашел
 
  • Клоун
Реакции: XRLM

chapo

чопа сребдс // TG/IG: @moujeek
Модератор
9,005
11,829
ебать, погуглил, нихуя не нашел
1735474268493.png