Центрирование иконки mimgui

ChаtGPT

Активный
Автор темы
371
93
Версия MoonLoader
.026-beta
Что я делаю не так? Пытаюсь центрировать иконку, но она почему-то отображается выше центра ;/
Тут вроде как нужно получить шрифт и с ним что-то делать, я хз

Использую эти иконки https://www.blast.hk/threads/173193/
(использовал и разные другие, всё так-же)

1731935583480.png


Lua:
local imgui = require 'mimgui'
local gi = require('GoogleIcons')

local icon
imgui.OnInitialize(function()
    icon = gi.LoadFont(gi.FontType.Default, 30, {'settings applications'})
end)

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

    local dl = imgui.GetWindowDrawList()
    local pos = imgui.GetCursorScreenPos()
    --local pos = imgui.GetWindowPos()
    local mouse_pos = imgui.GetMousePos()

    -- Размер прямоугольника
    local rect_width = mouse_pos.x - pos.x
    local rect_height = mouse_pos.y - pos.y

    local icon_text = icon('settings applications')
    local text_size = imgui.CalcTextSize(icon_text)

    local text_pos = imgui.ImVec2(
        pos.x + (rect_width - text_size.x) / 2,
        pos.y + (rect_height - text_size.y) / 2
    )

    dl:AddRectFilled(pos, mouse_pos, 0xFF0000FF)

    -- визуализация центральной линии прямоугольника
    dl:AddLine(
        imgui.ImVec2(pos.x, pos.y + rect_height / 2),
        imgui.ImVec2(pos.x + rect_width, pos.y + rect_height / 2),
        0xFFFFFFFF
    )

    -- визуализация позиции текста
    dl:AddRect(
        text_pos,
        imgui.ImVec2(text_pos.x + text_size.x, text_pos.y + text_size.y),
        0xFFFF00FF
    )
  
    dl:AddText(text_pos, 0xFFFFFFFF, icon_text)
    --imgui.SetCursorPos(text_pos)
    --imgui.Text(icon_text)
end)

Костылями сделал так, примерно центр держит, но хотелось бы стабильный вариант

вариант со смещением:
local text_pos = imgui.ImVec2(
    pos.x + (rect_width - text_size.x) / 2,
    pos.y + (rect_height - (text_size.y * 1.5)) / 2 + text_size.y
)

другой вариант:
local font = imgui.GetFont()
local glyph = font:FindGlyph(icon_text:byte())
local glyph_width = glyph.X1 - glyph.X0
local glyph_height = glyph.Y1 - glyph.Y0

local vertical_offset = (text_size.y - glyph_height) - (font.Ascent + glyph.Y0)

local text_pos = imgui.ImVec2(
    pos.x + (rect_width - text_size.x) / 2,
    pos.y + (rect_height - text_size.y) / 2 - vertical_offset
)
 
Последнее редактирование:

wojciech?

Известный
Проверенный
350
230
Lua:
local text_pos = imgui.ImVec2(
    pos.x + (rect_width / 2 - text_size.x / 2),
    pos.y + (rect_height / 2 - text_size.y / 2)
)
буквально тоже самое:
Lua:
local text_pos = imgui.ImVec2(
  pos.x + (rect_width - text_size.x) / 2,
  pos.y + (rect_height - text_size.y) / 2
)
1732002110421.png
 

ChаtGPT

Активный
Автор темы
371
93
Короче, у каждого шрифта с иконками есть своё смещение, поэтому просто на глаз вычислил это смещение.
Есть такая штука imgui.ShowStyleEditor(). Вызываем в окне, переходим в Font > Font1 > Glyphs, тут видно иконку и что у неё смещение по вертикали. Слайдером font offset вычисляем смещение

1732030684871.png


Да, это ебаные костыли, но я по другому не смог решить, если кто знает как это сделать адекватно, можете сюда написать своё решение.


1732030112586.png