imgui стили для нескольких окон

ChаtGPT

Активный
Автор темы
400
96
Версия MoonLoader
.026-beta
Имеется 2 функции с разными стилями. Как их можно адекватно применять к разным окнам?
Или это обязательно нужно делать в каждом кадре?
Поскольку стиль применяется глобально, если я к какому-то окну не буду устанавливать стиль(например уберу style_2()), стиль style_1() перескочит и на второе окно, что проблемно.
Я пытался разобраться с контекстами, что оно вообще такое, пытался с ним что-то делать - не вышлою imgui.SwitchContext(imgui.CreateContext())

Lua:
local imgui = require 'mimgui'

imgui.OnFrame(function() return true end,
    function()
        style_1()

        imgui.Begin("window 1", nil)
        imgui.End()
    end
)

imgui.OnFrame(function() return true end,
    function()
        style_2()

        imgui.Begin("window 2", nil)
        imgui.End()
    end
)

function style_1()
    imgui.GetStyle().Colors[imgui.Col.WindowBg] = imgui.ImVec4(0.2, 0.2, 0.8, 1.0)
end

function style_2()
    imgui.GetStyle().Colors[imgui.Col.WindowBg] = imgui.ImVec4(0.8, 0.2, 0.2, 1.0)
end
 

kyrtion

Известный
1,055
379
Стиль вроде применяется на всех стилей, а если засунуть для завершение работу стили, то будет так:
Но есть проблема:
В функции фрейма только 3: условия, пре-фрейм, фрейм. а вот если неплохо бы иметь еще 4-ая функция - енд-фрейм...
Ну поэтому решил засунуть функции енд-фрейм в самом конце строка фрейма
Далее, теперь когда открываешь на изменение цвета, то в конце фрейма их необходимо закрыть. Вроде в стиле push-to-pop
Вот что получается:
1737180848733.png


Само код:
src/core/frame/one.lua:
local oneFrame = {}

local open = mimgui.new.bool(true)
local sizeX, sizeY = getScreenResolution()

local flags = mimgui.WindowFlags.NoResize
    + mimgui.WindowFlags.NoCollapse
-- + mimgui.WindowFlags.NoTitleBar

local function isActiveFrame()
    return open[0]
end

local function callbackPreframe()
    -- second style windows
    local red = mimgui.ImVec4(0.8, 0.2, 0.2, 1.0)
    local yellow = mimgui.ImVec4(0.8, 0.8, 0.2, 1)
    mimgui.PushStyleColor(mimgui.Col.WindowBg, red)
    mimgui.PushStyleColor(mimgui.Col.Text, yellow)
end

local function endFrame()
    mimgui.PopStyleColor(2)
end

local function drawFrame()
    mimgui.SetNextWindowPos(mimgui.ImVec2(sizeX / 2, 30), mimgui.Cond.Once, mimgui.ImVec2(0.5, 0.5))
    mimgui.Begin('First Frame', open, flags)
    mimgui.Text('Its text for first frames')
    mimgui.End()
    endFrame()
end

function oneFrame.draw()
    local fFirst = mimgui.OnFrame(isActiveFrame, callbackPreframe, drawFrame)
    fFirst.HideCursor = false
    return fFirst
end

return oneFrame

src/core/frame/two.lua:
local secondFrame = {}

local open = mimgui.new.bool(true)
local sizeX, sizeY = getScreenResolution()

local flags = mimgui.WindowFlags.NoResize
    + mimgui.WindowFlags.NoCollapse
-- + mimgui.WindowFlags.NoTitleBar

local function isActiveFrame()
    return open[0]
end

local function callbackPreframe()
    -- second style windows
    local blue = mimgui.ImVec4(0.2, 0.2, 0.8, 1.0)
    local black = mimgui.ImVec4(0, 0, 0, 1)
    mimgui.PushStyleColor(mimgui.Col.WindowBg, blue)
    mimgui.PushStyleColor(mimgui.Col.Text, black)
end

local function endFrame()
    mimgui.PopStyleColor(2)
end

local function drawFrame()
    mimgui.SetNextWindowPos(mimgui.ImVec2(sizeX / 1.5, 30), mimgui.Cond.Once, mimgui.ImVec2(0.5, 0.5))
    mimgui.Begin('Second Frame', open, flags)
    mimgui.Text('Its text for second frames')
    mimgui.End()
    endFrame()
end

function secondFrame.draw()
    local fSecond = mimgui.OnFrame(isActiveFrame, callbackPreframe, drawFrame)
    fSecond.HideCursor = false
    return fSecond
end

return secondFrame