UBP
Известный
- 350
- 204
Lua:
local slider_value = 0.5
slider_value = customSliderFloat("My Slider", slider_value, 0.0, 1.0, "%.3f")
Lua:
function customSliderFloat(label, value, min, max, format)
local style = imgui.GetStyle()
local draw_list = imgui.GetWindowDrawList()
local cursor_pos = imgui.GetCursorScreenPos()
local text_size = imgui.CalcTextSize(label)
local value_text = string.format(format, value)
local value_text_size = imgui.CalcTextSize(value_text)
local slider_size = imgui.ImVec2(200, 8) -- размер слайдера
local total_width = text_size.x + style.ItemInnerSpacing.x + slider_size.x + style.ItemInnerSpacing.x + value_text_size.x
local padding = 10 -- Увеличиваемое расстояние от текста до слайдера
local slider_pos = imgui.ImVec2(cursor_pos.x + text_size.x + style.ItemInnerSpacing.x + padding, cursor_pos.y)
local slider_end_pos = imgui.ImVec2(slider_pos.x + slider_size.x, slider_pos.y + slider_size.y)
-- Рассчитываем положение ползунка на основе текущего значения
local fraction = (value - min) / (max - min)
local handle_pos = slider_pos.x + fraction * slider_size.x
-- Цвета
local color_background = imgui.ColorConvertFloat4ToU32(imgui.ImVec4(0.2, 0.2, 0.2, 1.0)) -- фон слайдера
local color_filled = imgui.ColorConvertFloat4ToU32(imgui.ImVec4(0.2, 0.4, 0.8, 1.0)) -- заполненная часть слайдера
local color_slider = imgui.ColorConvertFloat4ToU32(imgui.ImVec4(0.4, 0.4, 0.4, 1.0)) -- ползунок слайдера
-- Рисуем фон слайдера
draw_list:AddRectFilled(slider_pos, slider_end_pos, color_background, style.FrameRounding)
-- Рисуем заполненную часть слайдера
local filled_rect_end_pos = imgui.ImVec2(handle_pos, slider_end_pos.y)
draw_list:AddRectFilled(slider_pos, filled_rect_end_pos, color_filled, style.FrameRounding)
-- Рисуем ползунок
local handle_size = imgui.ImVec2(10, slider_size.y)
local handle_rect_min = imgui.ImVec2(handle_pos - handle_size.x * 0.5, slider_pos.y)
local handle_rect_max = imgui.ImVec2(handle_pos + handle_size.x * 0.5, slider_end_pos.y)
draw_list:AddRectFilled(handle_rect_min, handle_rect_max, color_slider, style.FrameRounding)
-- Обработка ввода
local is_active = false
local is_hovered = imgui.IsMouseHoveringRect(handle_rect_min, handle_rect_max)
if is_hovered and imgui.IsMouseDown(0) then
local mouse_x = imgui.GetIO().MousePos.x
local new_fraction = (mouse_x - slider_pos.x) / slider_size.x
value = min + new_fraction * (max - min)
value = math.max(min, math.min(max, value)) -- ограничиваем значение
is_active = true
end
-- Отображаем метку слайдера
imgui.PushFont(Font[15]) -- Предполагается, что Font[18] - это ваш крупный шрифт
imgui.SetCursorScreenPos(imgui.ImVec2(cursor_pos.x, cursor_pos.y + (slider_size.y - text_size.y) * 0.7))
imgui.Text(label)
imgui.PopFont()
-- Отображаем значение слайдера справа от слайдера
imgui.PushStyleColor(imgui.Col.Text, style.Colors[imgui.Col.TextDisabled])
imgui.SetCursorScreenPos(imgui.ImVec2(slider_end_pos.x + style.ItemInnerSpacing.x, cursor_pos.y + (slider_size.y - value_text_size.y) * 0.5))
imgui.Text(value_text)
imgui.PopStyleColor()
-- Возвращаем измененное значение
return value
end
Последнее редактирование: