- 375
- 263
Lua:
drawAnimatedLoadingIndicator(resX / 2, resY / 2, 50, 8, 0.2)
Lua:
function drawAnimatedLoadingIndicator(centerX, centerY, radius, thickness, speed)
local ImGui = imgui
local draw_list = ImGui.GetWindowDrawList()
local time = ImGui.GetTime()
-- Основные параметры
local start_angle = -math.pi / 2
local max_angle = 2 * math.pi
local end_angle = start_angle + max_angle * (time * speed % 1)
-- Цвета
local bgColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.2, 0.2, 0.2, 1))
local fgColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.4, 0.7, 0.2, 1))
-- Рисуем фон индикатора
draw_list:PathArcTo(ImGui.ImVec2(centerX, centerY), radius, start_angle, start_angle + max_angle, 64)
draw_list:PathStroke(bgColor, false, thickness)
-- Рисуем анимированный прогресс индикатора
draw_list:PathArcTo(ImGui.ImVec2(centerX, centerY), radius, start_angle, end_angle, 64)
draw_list:PathStroke(fgColor, false, thickness)
end
Lua:
local totalTime = 15 -- Общее время таймера в секундах
local startTime = os.time() -- Время старта таймера
local currentTime = os.time()
local elapsedTime = os.difftime(currentTime, startTime)
local remainingTime = math.max(0, totalTime - elapsedTime)
drawCircularTimer(resX / 2, resY / 2, 100, remainingTime, totalTime)
Lua:
function drawCircularTimer(x, y, radius, remainingTime, totalTime)
local ImGui = imgui
local draw_list = ImGui.GetWindowDrawList()
-- Определяем параметры для визуализации таймера
local start_angle = 3 * math.pi / 2
local end_angle = start_angle + (2 * math.pi) * (remainingTime / totalTime)
-- Цвета
local timerColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.2, 0.7, 0.3, 1)) -- Зеленый
local backgroundColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.2, 0.2, 0.2, 0.3)) -- Темно-серый
-- Рисуем фон таймера
draw_list:AddCircleFilled(ImGui.ImVec2(x, y), radius, backgroundColor, 64)
-- Рисуем оставшееся время таймера
if remainingTime > 0 then
draw_list:PathArcTo(ImGui.ImVec2(x, y), radius - 1, start_angle, end_angle, 64)
draw_list:PathStroke(timerColor, false, 2)
end
-- Текст с оставшимся временем
local timeText = string.format("%.2f", remainingTime)
local textSize = ImGui.CalcTextSize(timeText)
draw_list:AddText(ImGui.ImVec2(x - textSize.x / 2, y - textSize.y / 2), ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(1, 1, 1, 1)), timeText)
end
Lua:
local volumeLevel = imgui.new.float(0.5)
drawVerticalVolumeSlider(resX / 2, resY / 2, 30, 200, volumeLevel)
Lua:
function drawVerticalVolumeSlider(x, y, width, height, volumeLevel)
local ImGui = imgui
local draw_list = ImGui.GetWindowDrawList()
-- Определяем параметры
local sliderBgColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.2, 0.25, 0.3, 1))
local sliderFilledColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.2, 0.7, 0.3, 1))
local borderColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(1, 1, 1, 0.5))
-- Рисуем фон слайдера
draw_list:AddRectFilled(ImGui.ImVec2(x, y), ImGui.ImVec2(x + width, y + height), sliderBgColor, 4)
draw_list:AddRect(ImGui.ImVec2(x, y), ImGui.ImVec2(x + width, y + height), borderColor, 4)
ImGui.SetCursorPos(ImGui.ImVec2(x, y))
ImGui.InvisibleButton("slider", ImGui.ImVec2(width, height))
-- Если элемент активен (нажатие и удерживание кнопки мыши), обновляем уровень громкости
if ImGui.IsItemActive() then
local mousePos = ImGui.GetMousePos()
volumeLevel[0] = math.max(0, math.min(1, (mousePos.y - y) / height))
volumeLevel[0] = 1.0 - volumeLevel[0] -- Инвертируем значение, так как координаты идут сверху вниз
end
-- Рассчитываем высоту заполнения в зависимости от уровня громкости
local fillHeight = height * volumeLevel[0]
local fillYStart = y + height - fillHeight
-- Рисуем заполнение слайдера
draw_list:AddRectFilled(ImGui.ImVec2(x, fillYStart), ImGui.ImVec2(x + width, y + height), sliderFilledColor, 4)
end
Lua:
local chargeLevel = 0.75 -- 75% заряда
drawBatteryIndicator(resX / 2, resY / 2, 100, 50, chargeLevel)
Lua:
function drawBatteryIndicator(x, y, width, height, chargeLevel)
local ImGui = imgui
local draw_list = ImGui.GetWindowDrawList()
-- Определяем цвета в зависимости от уровня заряда
local chargeColor
if chargeLevel > 0.5 then
chargeColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.2, 0.8, 0.2, 1)) -- Зелёный
elseif chargeLevel > 0.2 then
chargeColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.8, 0.8, 0.2, 1)) -- Жёлтый
else
chargeColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.8, 0.2, 0.2, 1)) -- Красный
end
-- Рисуем контур батареи
draw_list:AddRect(ImGui.ImVec2(x, y), ImGui.ImVec2(x + width, y + height), ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(1, 1, 1, 1)), 1.0, 0, 2)
-- Рисуем "наконечник" батареи
draw_list:AddRectFilled(ImGui.ImVec2(x + width, y + height * 0.3), ImGui.ImVec2(x + width + width * 0.05, y + height * 0.7), ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(1, 1, 1, 1)))
-- Рисуем уровень заряда
draw_list:AddRectFilled(ImGui.ImVec2(x + 2, y + 2), ImGui.ImVec2(x + 2 + (width - 4) * chargeLevel, y + height - 2), chargeColor)
-- Опционально: добавляем текст с процентом заряда
local text = string.format("%.0f%%", chargeLevel * 100)
draw_list:AddText(ImGui.ImVec2(x + width / 2 - 10, y + height / 2 - 8), ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(1, 1, 1, 1)), text)
end
Lua:
local activityData = {
{ day = "Пн", value = 30 },
{ day = "Вт", value = 60 },
{ day = "Ср", value = 45 },
{ day = "Чт", value = 80 },
{ day = "Пт", value = 55 },
{ day = "Сб", value = 70 },
{ day = "Вс", value = 20 }
}
drawActivityGraph(resX / 2, resY / 2, 300, 100, activityData)
Lua:
function drawActivityGraph(x, y, width, height, activityData)
local ImGui = imgui
local draw_list = ImGui.GetWindowDrawList()
-- Определяем цвета
local bgColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.2, 0.25, 0.3, 1))
local barColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.2, 0.7, 0.3, 1))
local highlightColor = ImGui.ColorConvertFloat4ToU32(ImGui.ImVec4(0.4, 0.9, 0.4, 1))
-- Рисуем фон графика
draw_list:AddRectFilled(ImGui.ImVec2(x, y), ImGui.ImVec2(x + width, y + height), bgColor, 4)
local barWidth = width / #activityData
for i, activity in ipairs(activityData) do
local barHeight = (height * activity.value) / 100
local barX = x + (i - 1) * barWidth
local barY = y + height - barHeight
-- Проверяем, находится ли курсор над столбцом
local isHovered = ImGui.IsMouseHoveringRect(ImGui.ImVec2(barX, barY), ImGui.ImVec2(barX + barWidth, y + height))
local color = isHovered and highlightColor or barColor
-- Рисуем столбец гистограммы
draw_list:AddRectFilled(ImGui.ImVec2(barX, barY), ImGui.ImVec2(barX + barWidth, y + height), color, 2)
-- Если курсор над столбцом, отображаем подсказку с значением
if isHovered then
ImGui.BeginTooltip()
ImGui.Text(string.format("%s: %.2f%%", activity.day, activity.value))
ImGui.EndTooltip()
end
end
end