C++ Исходник Imgui sliders pack

I Want to Die in New Orleans
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
506
Реакции[?]
491
Поинты[?]
80K
всем ку :roflanzdarova:
только что сварганил 4 слайдера на имгуи, закидываю вам

Пожалуйста, авторизуйтесь для просмотра ссылки.


1 - Слайдер дискорда

SliderScalar - дизайн слайдера и сама его функция:
C++:
bool ImGui::DiscordSliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) {
    ImGuiWindow* window = GetCurrentWindow();
    if (window->SkipItems)
        return false;

    ImGuiContext& g = *GImGui;
    const ImGuiStyle& style = g.Style;
    const ImGuiID id = window->GetID(label);
    const float w = 331;
    const float f = 30;

    const ImVec2 label_size = CalcTextSize(label, NULL, true);
    const ImRect frame_bb(window->DC.CursorPos + ImVec2(-20, 9.5f) + ImVec2(82, 0), window->DC.CursorPos - ImVec2(42, -4.5f) + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f));
    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
    const ImRect frame_bbb(window->DC.CursorPos + ImVec2(-20, -8), window->DC.CursorPos - ImVec2(-42, 9.0f) + ImVec2(w, f + style.FramePadding.y * 2.0f));


    ItemSize(total_bb, style.FramePadding.y);
    if (!ItemAdd(total_bb, id, &frame_bb))
        return false;


    if (format == NULL)
        format = DataTypeGetInfo(data_type)->PrintFmt;
    else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0)
        format = PatchFormatStringFloatToInt(format);



    static std::map<ImGuiID, float> animate;
    auto valuealpha = animate.find(id);
    if (valuealpha == animate.end())
    {
        animate.insert({ id, 0.0f });
        valuealpha = animate.find(id);
    }



    const bool hovered = ItemHoverable(frame_bb, id);                               // Размер ховера на слайдере
    const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0;        // Если в меню не стоит флаг NoInput, разрешаем ввод через ctrl
    bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);        // Ввод числа вручную активен

    //if (hovered)
    //    g.MouseCursor = ImGuiMouseCursor_ResizeEW;
    //if (hovered && g.IO.KeyCtrl)                          //  Раскоментите что-бы была смена курсора (как в дискорде)
    //    g.MouseCursor = ImGuiMouseCursor_Hand;

    if (!temp_input_is_active)
    {
        const bool focus_requested = temp_input_allowed && FocusableItemRegister(window, id);
        const bool clicked = (hovered && g.IO.MouseClicked[0]);
        if (focus_requested || clicked || g.NavActivateId == id || g.NavInputId == id)
        {
            SetActiveID(id, window);
            SetFocusID(id, window);
            FocusWindow(window);
            g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
            if (temp_input_allowed && (focus_requested || (clicked && g.IO.KeyCtrl) || g.NavInputId == id))
            {
                temp_input_is_active = true;
                FocusableItemUnregister(window);
            }
        }
    }

    if (temp_input_is_active)
    {
        PushStyleColor(ImGuiCol_Text, ColorConvertU32ToFloat4(ImColor(255, 255, 255, 255)));
        const bool is_clamp_input = (flags & ImGuiSliderFlags_ClampOnInput) != 0;
        return TempInputScalar(frame_bbb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL);
        PopStyleColor();
    }


        const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
        RenderNavHighlight(frame_bb, id);
        RenderFrame(frame_bb.Min, frame_bb.Max - ImVec2(0, 1.8), ImColor(79, 84, 92, 255), true, 10);       // Фрейм незаполненного слайдера (более серый цвет).


        ImRect grab_bar;
        const bool item_value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags, &grab_bar);
        if (item_value_changed)
            MarkItemEdited(id);


        RenderFrame(ImVec2(frame_bb.Min.x, frame_bb.Min.y), ImVec2(grab_bar.Max.x, frame_bb.Max.y - 1.8), ImColor(88, 101, 242, 255), true, 10);    // Фрейм лилового цвета (заполненный)
        window->DrawList->AddCircleFilled(ImVec2(grab_bar.Min.x + 7, frame_bb.Min.y + 2), 6.5, ImColor(255, 255, 255, 255), 512);     // Кружочек :)




        RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x - 231, frame_bb.Min.y + style.FramePadding.y - 20), label);     // Название слайдера




        char value_buf[64];
        const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format);
        if (hovered || IsItemActive())
        {
            if (valuealpha->second < 255.f)
                valuealpha->second += 25.f;
            RenderFrame(ImVec2(grab_bar.Min.x - 10, frame_bb.Min.y - 37.8) /* + ImVec2(209, -30)*/, ImVec2(grab_bar.Max.x + 12, frame_bb.Max.y - 20.8), ImColor(32, 34, 37, (int)valuealpha->second), true, 5);
            RenderArrow(window->DrawList, ImVec2(grab_bar.Min.x + 1, frame_bb.Min.y - 21), ImColor(32, 34, 37, (int)valuealpha->second), ImGuiDir_Down, 1.5f);
            PushStyleColor(ImGuiCol_Text, ColorConvertFloat4ToU32(ImVec4((int)valuealpha->second, (int)valuealpha->second, (int)valuealpha->second, (int)valuealpha->second)));
            RenderTextClipped(ImVec2(grab_bar.Min.x - 10, frame_bb.Min.y - 37.8), ImVec2(grab_bar.Max.x + 12, frame_bb.Max.y - 20.8), value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f));
            PopStyleColor();
        }       // Тут идёт появление фрейма с числом над слайдером
        else
        {
            if (valuealpha->second > 0.f)
                valuealpha->second -= 25.f;
        }


        IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags);
        return item_value_changed;
}

1.1 - Реализация в виджетах:

C++:
bool ImGui::DiscordSliderF(const char* label, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags)
{
    return DiscordSliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, flags);
}
1.2 - Реализация в меню:

C++:
SetCursorPos(ImVec2(-37/*ваши координаты по X и по Y->*/, 265));
DiscordSliderF(XOR("Discord Slider"), &settings.dsslider, 1, 100, "%.f", ImGuiSliderFlags_ClampOnInput);
Такой же алгоритм и с остальными слайдерами.

2 - Слайдер спотифая


C++:
bool ImGui::SpotifySliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) {
    ImGuiWindow* window = GetCurrentWindow();
    if (window->SkipItems)
        return false;

    ImGuiContext& g = *GImGui;
    const ImGuiStyle& style = g.Style;
    const ImGuiID id = window->GetID(label);
    const float w = 331;
    const float f = 30;

    const ImVec2 label_size = CalcTextSize(label, NULL, true);
    const ImRect frame_bb(window->DC.CursorPos + ImVec2(-20, 9.5f) + ImVec2(82, 0), window->DC.CursorPos - ImVec2(42, -4.5f) + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f));
    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
    const ImRect frame_bbb(window->DC.CursorPos + ImVec2(-20, -8), window->DC.CursorPos - ImVec2(-42, 9.0f) + ImVec2(w, f + style.FramePadding.y * 2.0f));


    ItemSize(total_bb, style.FramePadding.y);
    if (!ItemAdd(total_bb, id, &frame_bb))
        return false;


    if (format == NULL)
        format = DataTypeGetInfo(data_type)->PrintFmt;
    else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0)
        format = PatchFormatStringFloatToInt(format);



    const bool hovered = ItemHoverable(frame_bb, id);                               // Размер ховера на слайдере
    const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0;        // Если в меню не стоит флаг NoInput, разрешаем ввод через ctrl
    bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);        // Ввод числа вручную активен

    //if (hovered)
    //    g.MouseCursor = ImGuiMouseCursor_ResizeEW;
    //if (hovered && g.IO.KeyCtrl)                          //  Раскоментите что-бы была смена курсора (в спотике её нет)
    //    g.MouseCursor = ImGuiMouseCursor_Hand;

    if (!temp_input_is_active)
    {
        const bool focus_requested = temp_input_allowed && FocusableItemRegister(window, id);
        const bool clicked = (hovered && g.IO.MouseClicked[0]);
        if (focus_requested || clicked || g.NavActivateId == id || g.NavInputId == id)
        {
            SetActiveID(id, window);
            SetFocusID(id, window);
            FocusWindow(window);
            g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
            if (temp_input_allowed && (focus_requested || (clicked && g.IO.KeyCtrl) || g.NavInputId == id))
            {
                temp_input_is_active = true;
                FocusableItemUnregister(window);
            }
        }
    }

    if (temp_input_is_active)
    {
        PushStyleColor(ImGuiCol_Text, ColorConvertU32ToFloat4(ImColor(255, 255, 255, 255)));
        const bool is_clamp_input = (flags & ImGuiSliderFlags_ClampOnInput) != 0;
        return TempInputScalar(frame_bbb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL);
        PopStyleColor();
    }


    const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
    RenderNavHighlight(frame_bb, id);
    RenderFrame(frame_bb.Min, frame_bb.Max - ImVec2(0, 1.8), ImColor(94, 94, 94, 255), true, 10);       // Фрейм незаполненного слайдера (более серый цвет).


    ImRect grab_bar;
    const bool item_value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags, &grab_bar);
    if (item_value_changed)
        MarkItemEdited(id);

    if (!hovered)
    RenderFrame(ImVec2(frame_bb.Min.x, frame_bb.Min.y), ImVec2(grab_bar.Max.x + 1, frame_bb.Max.y - 2.8), ImColor(255, 255, 255, 255), true, 10);    // Фрейм белого цвета (ин-актив состояние)




    RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x - 231, frame_bb.Min.y + style.FramePadding.y - 20), label);     // Название слайдера





    if (hovered || IsItemActive())      // Элементы в этом контейнере работают только при ховере и/или актив состоянии
    {
        RenderFrame(ImVec2(frame_bb.Min.x, frame_bb.Min.y), ImVec2(grab_bar.Max.x, frame_bb.Max.y - 2.8), ImColor(29, 185, 84, 255), true, 10);    // Фрейм зелёного цвета (заполненный)
        window->DrawList->AddCircleFilled(ImVec2(grab_bar.Min.x + 7, frame_bb.Min.y + 2), 5.5, ImColor(255, 255, 255, 255), 512);     // Кружочек :)
    }




    IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags);
    return item_value_changed;
}
2.1
C++:
bool ImGui::SpotifySliderF(const char* label, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags)
{
    return SpotifySliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, flags);
}
2.2
C++:
SetCursorPos(ImVec2(-37/*ваши координаты по X и по Y->*/, 310));
SpotifySliderF(XOR("Spotify Slider"), &settings.spslider, 1, 100, "%.f", ImGuiSliderFlags_ClampOnInput);

3 - Слайдер из Windows

C++:
bool ImGui::WindowsSliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) {
    ImGuiWindow* window = GetCurrentWindow();
    if (window->SkipItems)
        return false;

    ImGuiContext& g = *GImGui;
    const ImGuiStyle& style = g.Style;
    const ImGuiID id = window->GetID(label);
    const float w = 331;
    const float f = 30;

    const ImVec2 label_size = CalcTextSize(label, NULL, true);
    const ImRect frame_bb(window->DC.CursorPos + ImVec2(-20, 9.5f) + ImVec2(82, 0), window->DC.CursorPos - ImVec2(42, -4.5f) + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f));
    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
    const ImRect frame_bbb(window->DC.CursorPos + ImVec2(-20, -8), window->DC.CursorPos - ImVec2(-42, 9.0f) + ImVec2(w, f + style.FramePadding.y * 2.0f));


    ItemSize(total_bb, style.FramePadding.y);
    if (!ItemAdd(total_bb, id, &frame_bb))
        return false;


    if (format == NULL)
        format = DataTypeGetInfo(data_type)->PrintFmt;
    else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0)
        format = PatchFormatStringFloatToInt(format);



    const bool hovered = ItemHoverable(frame_bb, id);                               // Размер ховера на слайдере
    const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0;        // Если в меню не стоит флаг NoInput, разрешаем ввод через ctrl
    bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);        // Ввод числа вручную активен

    //if (hovered)
    //    g.MouseCursor = ImGuiMouseCursor_ResizeEW;
    //if (hovered && g.IO.KeyCtrl)                          //  Раскоментите что-бы была смена курсора при ховере (в слайдере винды её нет)
    //    g.MouseCursor = ImGuiMouseCursor_Hand;

    if (!temp_input_is_active)
    {
        const bool focus_requested = temp_input_allowed && FocusableItemRegister(window, id);
        const bool clicked = (hovered && g.IO.MouseClicked[0]);
        if (focus_requested || clicked || g.NavActivateId == id || g.NavInputId == id)
        {
            SetActiveID(id, window);
            SetFocusID(id, window);
            FocusWindow(window);
            g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
            if (temp_input_allowed && (focus_requested || (clicked && g.IO.KeyCtrl) || g.NavInputId == id))
            {
                temp_input_is_active = true;
                FocusableItemUnregister(window);
            }
        }
    }

    if (temp_input_is_active)
    {
        PushStyleColor(ImGuiCol_Text, ColorConvertU32ToFloat4(ImColor(255, 255, 255, 255)));
        const bool is_clamp_input = (flags & ImGuiSliderFlags_ClampOnInput) != 0;
        return TempInputScalar(frame_bbb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL);
        PopStyleColor();
    }


    const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
    RenderNavHighlight(frame_bb, id);
    RenderFrame(frame_bb.Min, frame_bb.Max - ImVec2(0, 3.8), ImColor(102, 102, 102, 255), true, 0);       // Фрейм незаполненного слайдера (более тёмно-серый цвет).


    ImRect grab_bar;
    const bool item_value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags, &grab_bar);
    if (item_value_changed)
        MarkItemEdited(id);

    if (!hovered || !IsItemActive())
        RenderFrame(ImVec2(frame_bb.Min.x, frame_bb.Min.y), ImVec2(grab_bar.Max.x + 1, frame_bb.Max.y - 3.8), ImColor(76, 74, 72, 255), true, 0);    // Статик заполненный слайдер




    RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x - 231, frame_bb.Min.y + style.FramePadding.y - 20), label);     // Название слайдера




    if (hovered)             // Элементы в этом контейнере работают только при ховер состоянии
    {
        RenderFrame(frame_bb.Min, frame_bb.Max - ImVec2(0, 5), ImColor(153, 153, 153, 255), true, 0);
        RenderFrame(ImVec2(frame_bb.Min.x, frame_bb.Min.y), ImVec2(grab_bar.Max.x, frame_bb.Max.y - 5), ImColor(76, 74, 72, 255), true, 0);
        RenderFrame(ImVec2(grab_bar.Min.x + 4, frame_bb.Min.y - 10), ImVec2(grab_bar.Max.x + 2, frame_bb.Max.y + 4.8), ImColor(242, 242, 242, 255), true, 10);
    }

    if (IsItemActive())      // Элементы в этом контейнере работают только при актив состоянии
    {
        RenderFrame(ImVec2(frame_bb.Min.x, frame_bb.Min.y), ImVec2(grab_bar.Max.x, frame_bb.Max.y - 5), ImColor(76, 74, 72, 255), true, 0);    // Фрейм зелёного цвета (заполненный)
        RenderFrame(ImVec2(grab_bar.Min.x + 4, frame_bb.Min.y - 10), ImVec2(grab_bar.Max.x + 2, frame_bb.Max.y + 4.8), ImColor(118, 118, 118, 255), true, 10);
    }



    char value_buf[64];
    const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format);
    PushStyleColor(ImGuiCol_Text, ColorConvertFloat4ToU32(ImVec4(255, 255, 255, 255)));
    RenderTextClipped(ImVec2(frame_bb.Min.x + 200, frame_bb.Min.y - 25.8), ImVec2(frame_bb.Max.x + 12, frame_bb.Max.y - 20.8), value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f));
    PopStyleColor();



    IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags);
    return item_value_changed;
}
3.1

C++:
bool ImGui::WindowsSliderF(const char* label, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags)
{
    return WindowsSliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, flags);
}
3.2

C++:
SetCursorPos(ImVec2(-37, 355));
WindowsSliderF(XOR("Windows Slider"), &settings.wnslider, 1, 100, "%.f", ImGuiSliderFlags_ClampOnInput);

4 - Звуковой слайдер из SoundCloud


C++:
bool ImGui::SoundCloudVerticalSliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) {
    ImGuiWindow* window = GetCurrentWindow();
    if (window->SkipItems)
        return false;

    ImGuiContext& g = *GImGui;
    const ImGuiStyle& style = g.Style;
    const ImGuiID id = window->GetID(label);


    static std::map<ImGuiID, float> animate;
    auto containersize = animate.find(id);
    if (containersize == animate.end())
    {
        animate.insert({ id, 0.0f });
        containersize = animate.find(id);
    }


    const float w = 331;
    const float f = 100;

    const ImVec2 label_size = CalcTextSize(label, NULL, true);
    const ImRect frame_bb(window->DC.CursorPos + ImVec2(-20, 9.5f) + ImVec2(82, 0), window->DC.CursorPos - ImVec2(42, -4.5f) + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f));
    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
    const ImRect hoverable_bb(frame_bb.Min - ImVec2(0, 30 + (float)containersize->second), frame_bb.Max + ImVec2(-305, 10) + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
    const ImRect hoverablepopup_bb(frame_bb.Min - ImVec2(0, 135), frame_bb.Max + ImVec2(0, -40) + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
    const ImRect frame_bbb(window->DC.CursorPos + ImVec2(-20, -8), window->DC.CursorPos - ImVec2(-42, 9.0f) + ImVec2(w, f + style.FramePadding.y * 2.0f));


    ItemSize(total_bb, style.FramePadding.y);
    if (!ItemAdd(total_bb, id, &frame_bb))
        return false;


    if (format == NULL)
        format = DataTypeGetInfo(data_type)->PrintFmt;
    else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0)
        format = PatchFormatStringFloatToInt(format);




    const bool hovered = ItemHoverable(hoverable_bb, id);                               // Размер ховера на слайдере
    const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0;        // Если в меню не стоит флаг NoInput, разрешаем ввод через ctrl
    bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);        // Ввод числа вручную активен

    //if (hovered)                          //  Раскоментите что-бы была смена курсора (в саундклаунде она есть)
        //g.MouseCursor = ImGuiMouseCursor_Hand;

    if (!temp_input_is_active)
    {
        const bool focus_requested = temp_input_allowed && FocusableItemRegister(window, id);
        const bool clicked = (hovered && g.IO.MouseClicked[0]);
        if (focus_requested || clicked || g.NavActivateId == id || g.NavInputId == id)
        {
            SetActiveID(id, window);
            SetFocusID(id, window);
            FocusWindow(window);
            g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
            if (temp_input_allowed && (focus_requested || (clicked && g.IO.KeyCtrl) || g.NavInputId == id))
            {
                temp_input_is_active = true;
                FocusableItemUnregister(window);
            }
        }
    }

    if (temp_input_is_active)
    {
        PushStyleColor(ImGuiCol_Text, ColorConvertU32ToFloat4(ImColor(255, 255, 255, 255)));
        const bool is_clamp_input = (flags & ImGuiSliderFlags_ClampOnInput) != 0;
        return TempInputScalar(frame_bbb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL);
        PopStyleColor();
    }

    if (hovered || IsItemActive())
    {
        if (containersize->second < 120)
            containersize->second += 15.f;
    }
    else
    {
        if (containersize->second > 0)
            containersize->second -= 15.f;
    }

    ImRect grab_bar;
    const bool item_value_changed = SliderBehavior(hoverablepopup_bb, id, data_type, p_data, p_min, p_max, format, flags | ImGuiSliderFlags_Vertical, &grab_bar);
    if (item_value_changed)
        MarkItemEdited(id);

    const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
    RenderNavHighlight(frame_bb, id);
    RenderFrame(frame_bb.Min - ImVec2(0, (float)containersize->second + 27.7), frame_bb.Max - ImVec2(193, 35), ImColor(228, 228, 228/*там реально такой цвет))*/, 255), true, 0);       // Выезжающий большой фрейм со слайдером внутри.






    //RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x - 231, frame_bb.Min.y + style.FramePadding.y - 20), label);     // Название слайдера




    if (hovered || IsItemActive())
    {
        RenderFrame(ImVec2(frame_bb.Min.x + 18, frame_bb.Min.y - 135), ImVec2(frame_bb.Max.x - 211, frame_bb.Max.y - 50), ImColor(204, 204, 204, 255), true, 0);       // Серый фрейм (незаполненный слайдер).
        RenderFrame(ImVec2(frame_bb.Min.x + 18, grab_bar.Min.y), ImVec2(frame_bb.Max.x - 211, frame_bb.Max.y - 45), ImColor(255, 85, 0, 255), true, 0);                // Оранжевый фрейм (заполненный слайдер).
        GetWindowDrawList()->AddCircleFilled(ImVec2(frame_bb.Min.x + 17, grab_bar.Min.y - (float)containersize->second + 120 + 2), 5, ImColor(255, 85, 0, 255), 512);  // Оранжевый кружок
        GetWindowDrawList()->AddRect(frame_bb.Min - ImVec2(0, (float)containersize->second + 27.7), frame_bb.Max - ImVec2(193, 35), ImColor(204, 204, 204, 255), 0);   // Почти незаметная, но дополняющая слайдер обводка фрейма
    }


    //PushStyleColor(ImGuiCol_Text, ColorConvertU32ToFloat4(ImColor(155, 155, 155, 255)));
    //PushFont(Volumes);
    //RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x - 225, frame_bb.Min.y + style.FramePadding.y - 10), "B");     // Иконка звука (у вас её нет, так что //лучше не раскоменчивайте, если нужна будет - раскоментите
    //PopFont();
    //PopStyleColor();




    IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags);
    return item_value_changed;
}
4.1

C++:
bool ImGui::SoundCloudVerticalSliderF(const char* label, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags)
{
    return SoundCloudVerticalSliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, flags);
}
4.2

C++:
SetCursorPos(ImVec2(267, 375));
SoundCloudVerticalSliderF(XOR("Sound Cloud Music"), &settings.scslider, 1, 100, "%.f", ImGuiSliderFlags_ClampOnInput);

нуу, вроде как на этом всё, если что-то будет не понятно или будет какая то ошибка то пишите
сори за говнокод:roflanEbalo:
слайдеры делались под float, вроде все знают что на int слайдер 1 словом меняется в элементах 1,2,3,4.1
 
Сверху Снизу