Как добавить поиск по кнопкам имгуи?

Стэнфорд

Потрачен
Автор темы
1,058
540
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Версия MoonLoader
.027.0-preview
У меня в имгуи окне есть много кнопок с разным текстам. Как сделать так, что бы юзер мог найти нужную кнопку, введя в поисковой строке текст, который на кнопке написан? Или часть от текста
 
Решение
Lua:
local search = imgui.ImBuffer(256) -- для инпута поиска

-- список кнопок (текст и функция)
local buttons = {
    {text = 'bTN 1', func = function() sampSendChat('click') end},
    {text = 'bTN 2', func = function() sampSendChat('click2') end},
}

for i = 1, #buttons do
    if #search.v == 0 or #search.v > 0 and buttons[i].text:find(search.v, nil, true) then
        if imgui.Button(buttons[i].text, imgui.ImVec2(100, 20)) then
            buttons[i].func()
        end
    end
end

Lua:
if imgui.InputText('##Input', text) then -- Избавляемся от скобок, чтобы в дальнейшем скрипт не крашился при поиске
    text.v = text.v:gsub('%(', '')
    text.v = text.v:gsub('%)', '')
    text.v = text.v:gsub('%[', '')
    text.v...

Rice.

Известный
Модератор
1,699
1,460
Lua:
local text = imgui.ImBuffer(256)
local buttons = {
    'Menu',
    'Settings',
    'Other'
}

-- imgui
if imgui.InputText('##Input', text) then -- Избавляемся от скобок, чтобы в дальнейшем скрипт не крашился при поиске
    text.v = text.v:gsub('%(', '')
    text.v = text.v:gsub('%)', '')
    text.v = text.v:gsub('%[', '')
    text.v = text.v:gsub('%]', '')
end

for k, v in pairs(buttons)
    if u8:decode(text.v) ~= 0 and string.nlower(v):find(string.nlower(u8:decode(text.v))) then
        imgui.Button(u8(v))
    end
end

-- где-то в коде
local lower, sub, char, upper = string.lower, string.sub, string.char, string.upper
local concat = table.concat

local lu_rus, ul_rus = {}, {}
for i = 192, 223 do
    local A, a = char(i), char(i + 32)
    ul_rus[A] = a
    lu_rus[a] = A
end
local E, e = char(168), char(184)
ul_rus[E] = e
lu_rus[e] = E

function string.nlower(s)
    s = lower(s)
    local len, res = #s, {}
    for i = 1, len do
        local ch = sub(s, i, i)
        res[i] = ul_rus[ch] or ch
    end
    return concat(res)
end

Код поиска взял отсюда - https://www.blast.hk/threads/112769/
 
  • Влюблен
Реакции: Стэнфорд

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,776
11,228
Lua:
local search = imgui.ImBuffer(256) -- для инпута поиска

-- список кнопок (текст и функция)
local buttons = {
    {text = 'bTN 1', func = function() sampSendChat('click') end},
    {text = 'bTN 2', func = function() sampSendChat('click2') end},
}

for i = 1, #buttons do
    if #search.v == 0 or #search.v > 0 and buttons[i].text:find(search.v, nil, true) then
        if imgui.Button(buttons[i].text, imgui.ImVec2(100, 20)) then
            buttons[i].func()
        end
    end
end

Lua:
if imgui.InputText('##Input', text) then -- Избавляемся от скобок, чтобы в дальнейшем скрипт не крашился при поиске
    text.v = text.v:gsub('%(', '')
    text.v = text.v:gsub('%)', '')
    text.v = text.v:gsub('%[', '')
    text.v = text.v:gsub('%]', '')
end

Код поиска взял отсюда - https://www.blast.hk/threads/112769/
вместо этого можно сделать
string.find('text', 'text', nil, true)
 
  • Влюблен
Реакции: Стэнфорд

qdIbp

Автор темы
Проверенный
1,388
1,146
Lua:
local imgui = require 'imgui'
local key = require 'vkeys'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

tabl = {
['help'] = 'helping',
['slap'] = 'slaping',
['gym'] = 'gyming',
['mycym'] = 'mycyming',
['gump'] = 'hui'
}

local main_window_state = imgui.ImBool(false)
local test_text_buffer = imgui.ImBuffer(256)
function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
        imgui.Begin('My window', main_window_state, imgui.WindowFlags.AlwaysAutoResize )
            for i,k in pairs(tabl) do
                imgui.Button(i)
            end
            imgui.Text('Hello world')imgui.Text(' ')
            imgui.InputText(u8'Вводить текст сюда', test_text_buffer)
            if imgui.Button(u8'Поиск') then
                for i,k in pairs(tabl) do
                    if i:find(test_text_buffer.v) then
                        sampAddChatMessage(i,-1)
                    end
                end
            end
        imgui.End()
    end
end

function main()
    while true do wait(0)
        if wasKeyPressed(key.VK_X) then main_window_state.v = not main_window_state.v end
        imgui.Process = main_window_state.v
    end
end
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,776
11,228
Lua:
local imgui = require 'imgui'
local key = require 'vkeys'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

tabl = {
['help'] = 'helping',
['slap'] = 'slaping',
['gym'] = 'gyming',
['mycym'] = 'mycyming',
['gump'] = 'hui'
}

local main_window_state = imgui.ImBool(false)
local test_text_buffer = imgui.ImBuffer(256)
function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
        imgui.Begin('My window', main_window_state, imgui.WindowFlags.AlwaysAutoResize )
            for i,k in pairs(tabl) do
                imgui.Button(i)
            end
            imgui.Text('Hello world')imgui.Text(' ')
            imgui.InputText(u8'Вводить текст сюда', test_text_buffer)
            if imgui.Button(u8'Поиск') then
                for i,k in pairs(tabl) do
                    if i:find(test_text_buffer.v) then
                        sampAddChatMessage(i,-1)
                    end
                end
            end
        imgui.End()
    end
end

function main()
    while true do wait(0)
        if wasKeyPressed(key.VK_X) then main_window_state.v = not main_window_state.v end
        imgui.Process = main_window_state.v
    end
end
1. будет крашить при вводе спец. символов
2. не будет отображать кнопки если ничего не введено в поле поиска
3. у всех кнопок будет одна функция

Готовый вариант, осталось только прикрутить rlower
1642950078287.png
1642950089161.png

Lua:
local imgui = require('imgui')
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
        
local window = imgui.ImBool(false)
        
function main()
    while not isSampAvailable() do wait(200) end
    imgui.Process = false
    window.v = true  --show window on start
    while true do
        wait(0)
        imgui.Process = window.v
    end
end
        
local search = imgui.ImBuffer(256) -- для инпута поиска

-- список кнопок (текст и функция)
local buttons = {
    {text = u8'Привет', func = function() sampAddChatMessage('Привет', -1) end},
    {text = u8'Пока', func = function()  sampAddChatMessage('Пока', -1) end},
    {text = u8'Пирожок', func = function() sampAddChatMessage('pirojok', -1) end},
}

function imgui.OnDrawFrame()
    if window.v then
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 300, 300 -- WINDOW SIZE
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2 - sizeX / 2, resY / 2 - sizeY / 2), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        imgui.Begin('Window Title', window)
        imgui.InputText(u8'Поиск', search)
        for i = 1, #buttons do
            if #search.v == 0 or buttons[i].text:find(search.v) then
                if imgui.Button(buttons[i].text, imgui.ImVec2(100, 20)) then
                    buttons[i].func()
                end
            end
        end
        
        imgui.End()
    end
end
 
Последнее редактирование:
  • Влюблен
  • Нравится
Реакции: iEramur и Стэнфорд

Стэнфорд

Потрачен
Автор темы
1,058
540
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
1. будет крашить при вводе спец. символов
2. не будет отображать кнопки если ничего не введено в поле поиска
3. у всех кнопок будет одна функция

Готовый вариант, осталось только прикрутить rlower
Посмотреть вложение 132873Посмотреть вложение 132874
Lua:
local imgui = require('imgui')
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
       
local window = imgui.ImBool(false)
       
function main()
    while not isSampAvailable() do wait(200) end
    imgui.Process = false
    window.v = true  --show window on start
    while true do
        wait(0)
        imgui.Process = window.v
    end
end
       
local search = imgui.ImBuffer(256) -- для инпута поиска

-- список кнопок (текст и функция)
local buttons = {
    {text = u8'Привет', func = function() sampAddChatMessage('Привет', -1) end},
    {text = u8'Пока', func = function()  sampAddChatMessage('Пока', -1) end},
    {text = u8'Пирожок', func = function() sampAddChatMessage('pirojok', -1) end},
}

function imgui.OnDrawFrame()
    if window.v then
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 300, 300 -- WINDOW SIZE
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2 - sizeX / 2, resY / 2 - sizeY / 2), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        imgui.Begin('Window Title', window)
        imgui.InputText(u8'Поиск', search)
        for i = 1, #buttons do
            if #search.v == 0 or buttons[i].text:find(search.v) then
                if imgui.Button(buttons[i].text, imgui.ImVec2(100, 20)) then
                    buttons[i].func()
                end
            end
        end
       
        imgui.End()
    end
end
Как можно сделать такой поиск без учета регистра?
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,776
11,228
  • Влюблен
Реакции: Стэнфорд

Стэнфорд

Потрачен
Автор темы
1,058
540
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
  • Нравится
Реакции: YarikVL