Исходник mimthemes // Система кастомных стилей [mimgui]

Библиотека позволяет добавить выбор кастомных тем в ваш скрипт.
Установка: перенести файл mimtheme.lua в папку moonloader/lib
Установка тем: перенести .json файл в папку moonloader\lib\mimthemes
1676745638535.png

Так же вы можете добавить функционал либы в свой скрипт и не заставлять юзера качать эту либу, вот пример кода:
Lua:
local imgui = require('mimgui')
MIMTHEMES = {
    version = '0.1',
    __path__ = getWorkingDirectory()..'\\lib\\mimthemes',
    getFilesInPath = function(path, ftype)
        assert(path, '"path" is required');
        assert(ftype or (type(ftype) ~= 'table' or type(ftype) ~= 'string'), '"ftype" must be a string or array of strings');
        local result = {};
        for _, thisType in ipairs(type(ftype) == 'table' and ftype or { ftype }) do
            local searchHandle, file = findFirstFile(path.."\\"..thisType);
            table.insert(result, file)
            while file do file = findNextFile(searchHandle) table.insert(result, file) end
        end
        return result;
    end
}

MIMTHEMES.applyJsonTheme = function(JSON)
    if not doesDirectoryExist(MIMTHEMES.__path__) then createDirectory(MIMTHEMES.__path__) end
    local theme = decodeJson(JSON);
    if (theme.col) then
        for param, value in pairs(theme.col) do
            pcall(function() -- pizda
                imgui.GetStyle().Colors[imgui.Col[param]] = imgui.ImVec4(table.unpack(value));
            end)
        end
    end
    if (theme.style) then
        for param, value in pairs(theme.style) do
            pcall(function() -- pizda
                imgui.GetStyle()[param] = type(value) == 'number' and value or (#value == 2 and imgui.ImVec2(table.unpack(value)) or imgui.ImVec4(table.unpack(value)));
            end)
        end
    end
end

MIMTHEMES.getThemes = function()
    if not doesDirectoryExist(MIMTHEMES.__path__) then createDirectory(MIMTHEMES.__path__) end
    local result = {}
    for _, filename in ipairs(MIMTHEMES.getFilesInPath(MIMTHEMES.__path__, '*.json')) do
        local file = io.open(MIMTHEMES.__path__..'\\'..filename, 'r')
        local JSON = file:read('*a')
        file:close()
        local data = decodeJson(JSON or '[]') or {} -- wtf
        table.insert(result, {
            filename = filename,
            name = data.name or filename,
            author = data.author or 'unknown',
            version = data.version or 'unknown',
            description = data.description or 'no description',
            url = data.url,
            json = JSON,
            apply = function()
                return MIMTHEMES.applyJsonTheme(JSON)
            end
        })
    end
    table.sort(result, function(a, b)
        return a.name < b.name
    end)
    return result
end

local themesList = MIMTHEMES.getThemes()

local win = imgui.new.bool(true)
local newFrame = imgui.OnFrame(
    function() return win[0] end,
    function(self)
        imgui.SetNextWindowSize(imgui.ImVec2(300, 300), imgui.Cond.FirstUseEver)
        if imgui.Begin('Pizda', win) then
            imgui.Text('Available themes:')
            for _, theme in ipairs(themesList) do
                if imgui.Button(theme.name, imgui.ImVec2(imgui.GetWindowSize().x - 10, 20)) then
                    theme.apply()
                end
                if imgui.IsItemHovered() then
                    imgui.BeginTooltip()
                    imgui.Text(('%s\n%s\n\nAuthor: %s\nVersion: %s\nURL: %s'):format(theme.name, theme.description, theme.author, theme.version, theme.url))
                    imgui.EndTooltip()
                end
            end
            imgui.End()
        end
    end
)
Подключение библиотеки:
Lua:
local themesInstalled, themes = pcall(require, 'mimthemes') -- подключаем либу
--assert(themesInstalled, 'Module "mimthemes" not found, download: https://blast.hk/threads/168540') -- раскомментируйте если надо крашить скрипт если библиотеки нет

Получение списка тем и применение темы:
для получения списка доступных тем и информации о них нам необходимо использовать функцию <module>..getThemes(). Вызывать ее в цикле нельзя, так как ваш компутер точно не скажет вам спасибо.
Lua:
local themesList = themesInstalled and themes.getThemes() or {} -- получаем список доступных тем
функция возвращает таблицу из тем, выглядит она примерно так:
Lua:
local themesList = {
    {
        name = string, -- Название темы
        author = string, -- Автор темы
        description = string, -- Описание темы
        version = string, -- Версия
        url = string, -- Ссылка
        json = string, -- Текст json файла
        apply = function -- Функция для применения этой темы
    },
    ...
}
теперь нам просто нужно вызвать функцию apply() у нужной темы, например
Lua:
themesList[1].apply()

Полный код:
Lua:
local imgui = require('mimgui')
local themesInstalled, themes = pcall(require, 'mimthemes') -- подключаем либу
local themesList = themesInstalled and themes.getThemes() or {} -- получаем список доступных тем
--assert(themesInstalled, 'Module "mimthemes" not found, download: https://blast.hk/threads/168540') -- раскомментируйте если надо крашить скрипт если библиотеки нет

local win = imgui.new.bool(true)
local newFrame = imgui.OnFrame(
    function() return win[0] end,
    function(self)
        imgui.SetNextWindowSize(imgui.ImVec2(300, 300), imgui.Cond.FirstUseEver)
        if imgui.Begin('Pizda', win) then
            if themesInstalled then -- если библиотека установлена, то
                imgui.Text('Available themes:')
                for _, theme in ipairs(themesList) do
                    if imgui.Button(theme.name, imgui.ImVec2(imgui.GetWindowSize().x - 10, 20)) then
                        theme.apply()
                    end
                    if imgui.IsItemHovered() then
                        imgui.BeginTooltip()
                        imgui.Text(('%s\n%s\n\nAuthor: %s\nVersion: %s\nURL: %s'):format(theme.name, theme.description, theme.author, theme.version, theme.url))
                        imgui.EndTooltip()
                    end
                end
            else
                imgui.TextColored(imgui.ImVec4(1, 0, 0, 1), 'module mimthemes not found, custom themes unavailable')
            end
            imgui.End()
        end
    end
)
Для создания темы вам необходимо создать файл с расширением .json, затем вписать туда нужные вам параметры, и поместить файл в папку moonloader\lib\mimthemes. Hапример:
Lua:
{
    "name": "MyTestThemeName",
    "author": "chapo",
    "description": "Test theme for mimthemes.lua!",
    "version": "0.1",
    "url": "https://www.blast.hk/members/112329/",
    "col":{
        "WindowBg": [1, 0, 0, 1],
        "Text": [1, 1, 1, 1]
    },
    "style":{
        "WindowRounding": 20
    }
}

Данная тема сделает фон окна красным, текст белым, а так же выставит закругление окна на 20 пикселей.
В секции 'col' должны хранится цвета, а в секции 'style' параметры стиля.
Код:
Text
TextDisabled
WindowBg
ChildBg
PopupBg
Border
BorderShadow
FrameBg
FrameBgHovered
FrameBgActive
TitleBg
TitleBgActive
TitleBgCollapsed
MenuBarBg
ScrollbarBg
ScrollbarGrab
ScrollbarGrabHovered
ScrollbarGrabActive
CheckMark
SliderGrab
SliderGrabActive
Button
ButtonHovered
ButtonActive
Header
HeaderHovered
HeaderActive
Separator
SeparatorHovered
SeparatorActive
ResizeGrip
ResizeGripHovered
ResizeGripActive
Tab
TabHovered
TabActive
TabUnfocused
TabUnfocusedActive
PlotLines
PlotLinesHovered
PlotHistogram
PlotHistogramHovered
TextSelectedBg
DragDropTarget
NavHighlight
NavWindowingHighlight
NavWindowingDimBg
ModalWindowDimBg
Код:
Alpha
WindowPadding
WindowRounding
WindowBorderSize
WindowMinSize
WindowTitleAlign
ChildRounding
ChildBorderSize
PopupRounding
PopupBorderSize
FramePadding
FrameRounding
FrameBorderSize
ItemSpacing
ItemInnerSpacing
IndentSpacing
ScrollbarSize
ScrollbarRounding
GrabMinSize
GrabRounding
TabRounding
ButtonTextAlign
SelectableTextAlign
Заполнение параметров:
В mimgui
в JSON
Lua:
imgui.GetStyle().Colors[imgui.Col.WindowBg] = imgui.ImVec4(0.07, 0.07, 0.07, 1.00)
JSON:
"WindowBg": [0.07, 0.07, 0.07, 1.00]
Lua:
imgui.GetStyle().WindowPadding = imgui.ImVec2(5, 5)
JSON:
"WindowPadding": [5, 5]
Lua:
imgui.GetStyle().WindowRounding = 5
JSON:
"WindowRounding": 5
Скидывайте сюда свои темы!
 

Вложения

  • mimthemes.lua
    2.5 KB · Просмотры: 22
Последнее редактирование:

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,768
11,210
upd. добавил пример работы с темами без установки модуля
 

Sadow

Известный
1,436
585
Объясните мне ананасу, для чего нужна эта библиотека?
 

Sadow

Известный
1,436
585
@xarlamov я это увидел, но я понять не могу. Зачем эта библиотека если можно одну функцию сделать со стилями? И по скрину я ничего кастомного не вижу.
 

CaJlaT

Овощ
Модератор
2,806
2,605
@xarlamov я это увидел, но я понять не могу. Зачем эта библиотека если можно одну функцию сделать со стилями? И по скрину я ничего кастомного не вижу.
Ну типа крута, стили не в скрипте, а в отдельных жсонах в папке.... (мда)
 
  • Нравится
Реакции: Sadow

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,768
11,210
@xarlamov я это увидел, но я понять не могу. Зачем эта библиотека если можно одну функцию сделать со стилями? И по скрину я ничего кастомного не вижу.
1. пользователь может установить одинаковую тему в разных скриптах (конечно же если сам скрипт это поддерживает)
2. что «кастомного» ты хотел увидеть на скрине?
 

Sadow

Известный
1,436
585
2. что «кастомного» ты хотел увидеть на скрине?
В заголовке сказано "Система кастомных стилей", вот я их и хочу увидеть

1. пользователь может установить одинаковую тему в разных скриптах (конечно же если сам скрипт это поддерживает)
Можно же просто одну функцию сделать в скрипте и будет тема, а не подключать библиотеку и загружать оттуда темы