- 8,935
- 11,703
Описание: создает такое колхозное окно
Описание: функция для простого взаимодействия с JSON
Lua:
--[[
title - заголовок
var - переменная окна
stateButton - текст на кнопке "свернуть/развернуть" вкладки (используй nil если кнопка не нужна)
tabs - список вкладок
selected - выбранная вкладка
isOpened - статус (свернуто/развернуто)
sizeClosed - размер панели если свернуто
sizeOpened - размер панели если развернуто
windowFlags - флаги окна (так же как и в imgui.Begin())
]]
function imgui.BeginWin11Menu(title, var, stateButton, tabs, selected, isOpened, sizeClosed, sizeOpened, windowFlags)
imgui.PushStyleVarVec2(imgui.StyleVar.WindowPadding, imgui.ImVec2(0, 0))
imgui.Begin(title, var, imgui.WindowFlags.NoTitleBar + (windowFlags or 0))
local size = imgui.GetWindowSize()
local pos = imgui.GetWindowPos()
local dl = imgui.GetWindowDrawList()
local tabSize = sizeClosed - 10
imgui.SetCursorPos(imgui.ImVec2(size.x - tabSize - 5, 5))
if imgui.Button('X##'..title..'::closebutton', imgui.ImVec2(tabSize, tabSize)) then if var then var[0] = false end end
--==[ MAIN BG ]==--
imgui.SetCursorPos(imgui.ImVec2(sizeClosed, sizeClosed))
local p = imgui.GetCursorScreenPos()
dl:AddRectFilled(p, imgui.ImVec2(p.x + size.x - sizeClosed, p.y + size.y - sizeClosed), imgui.GetColorU32Vec4(imgui.GetStyle().Colors[imgui.Col.ChildBg]), imgui.GetStyle().WindowRounding, 1 + 8)
--==[ TITLEBAR ]==--
imgui.SetCursorPos(imgui.ImVec2(0, 0))
local p = imgui.GetCursorScreenPos()
dl:AddRectFilled(p, imgui.ImVec2(p.x + (isOpened[0] and sizeOpened or sizeClosed), p.y + size.y), imgui.GetColorU32Vec4(imgui.GetStyle().Colors[imgui.Col.WindowBg]), imgui.GetStyle().WindowRounding, 1 + 4)
imgui.SetCursorPos(imgui.ImVec2(tabSize + 10, sizeClosed / 2 - imgui.CalcTextSize(title).y / 2))
imgui.Text(title)
--==[ TABS BUTTONS ]==--
imgui.SetCursorPosY(5)
if stateButton then
imgui.SetCursorPosX(5)
if imgui.Button(stateButton, imgui.ImVec2(tabSize, tabSize)) then isOpened[0] = not isOpened[0] end
else
imgui.SetCursorPosY(5 + tabSize + 5)
end
for k, v in pairs(tabs) do
imgui.SetCursorPosX(5)
imgui.PushStyleColor(imgui.Col.Button, selected[0] == v and imgui.GetStyle().Colors[imgui.Col.ButtonActive] or imgui.GetStyle().Colors[imgui.Col.WindowBg])
imgui.PushStyleVarVec2(imgui.StyleVar.ButtonTextAlign, imgui.ImVec2(isOpened[0] and 0.1 or 0.5, 0.5))
if imgui.Button(isOpened[0] and k..' '..v or k, imgui.ImVec2(isOpened[0] and sizeOpened - 10 or tabSize, tabSize)) then selected[0] = v end
if imgui.IsItemHovered() then
imgui.BeginTooltip()
imgui.Text(k..' '..v)
imgui.EndTooltip()
end
imgui.PopStyleVar()
imgui.PopStyleColor()
end
--==[ CHILD ]==--
imgui.SetCursorPos(imgui.ImVec2(sizeClosed + 5, sizeClosed + 5))
imgui.PushStyleVarVec2(imgui.StyleVar.WindowPadding, imgui.ImVec2(15, 15))
imgui.BeginChild(title..'::mainchild', imgui.ImVec2(size.x - sizeClosed - 5, size.y - sizeClosed - 5), true)
end
function imgui.EndWin11Menu()
imgui.EndChild()
imgui.End()
imgui.PopStyleVar(2)
end
Lua:
-- перед окном
local renderWindow = imgui.new.bool(true) -- статус окна
-- массив с некоторыми настройками окна (можно использовать вне массива)
local menu = {
opened = imgui.new.bool(false),
selected = {[0] = ''}, -- выбранный пункт (получать через menu.selected[0])
tabs = { -- список вкладок, [иконка/буква] = название вкладки
[fa.ICON_FA_CAR] = u8' Машина',
[fa.ICON_FA_USER] = u8' Лошпед',
[fa.ICON_FA_EYE] = u8' Глаз',
}
}
-- окно
local newFrame = imgui.OnFrame(
function() return renderWindow[0] end,
function(player)
local resX, resY = getScreenResolution()
local sizeX, sizeY = 300, 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)
imgui.BeginWin11Menu('Win11 menu example', renderWindow, false, menu.tabs, menu.selected, menu.opened, 40, 100)
if menu.selected[0] == u8' Машина' then
imgui.Checkbox('checkbox', placeholder_bool)
elseif menu.selected[0] == u8' Лошпед' then
-- code
elseif menu.selected[0] == u8' Глаз' then
-- code
end
imgui.EndWin11Menu()
end
)
Описание: функция для простого взаимодействия с JSON
Lua:
function json(jsonFilePath)
local class = {}
function class:Save(t)
file = io.open(jsonFilePath, "w")
file:write(encodeJson(t or {}))
file:close()
end
function class:Load(defaultTable)
if not doesFileExist(jsonFilePath) then class:Save(defaultTable or {}) end
local file = io.open(jsonFilePath, "r+")
local jsonInString = file:read("*a")
file:close()
return decodeJson(jsonInString) or {}
end
return class
end
Lua:
--[[
json(файл):
Save(таблица) - сохранить таблицу в файл
Load(DefaultTable) -- загрузить таблицу из файла, (если файла нет, то создает файл и записывает в него DefaultTable)
]]
local defaultTable = {'Это первый элемент в твоем массиве'}
local jsonFile = getWorkingDirectory()..'\\config\\myJsonConfig.json'
local list = json(jsonFile):Load(defaultTable)
function main()
while not isSampAvailable() do wait(0) end
sampRegisterChatCommand('table.add', function(arg)
table.insert(list, arg)
json(jsonFile):Save(list)
end)
sampRegisterChatCommand('table.print', function()
for k, v in ipairs(list) do
print(k, v)
end
end)
wait(-1)
end
Последнее редактирование: