File: stepped_slider.cpp

package info (click to toggle)
satdump 1.2.2%2Bgb79af48-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 81,648 kB
  • sloc: cpp: 276,768; ansic: 164,598; lisp: 1,219; sh: 283; xml: 106; makefile: 7
file content (100 lines) | stat: -rw-r--r-- 3,740 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <algorithm>
#include "stepped_slider.h"
#include "imgui/imgui_internal.h"

namespace widgets
{
    bool SteppedSliderInt(const char* label, int* v, int v_min, int v_max, int v_rate, const char* format, ImGuiSliderFlags flags)
    {
        ImGuiStyle style = ImGui::GetStyle();
        const float button_size = ImGui::GetFrameHeight();
        const float slider_width = std::max(1.0f, ImGui::CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2);

        ImGui::BeginGroup();
        ImGui::PushID(label);
        ImGui::SetNextItemWidth(slider_width);
        bool retval = ImGui::SliderInt("##slider", v, v_min, v_max, format, flags);
        ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(style.FramePadding.y, style.FramePadding.y));
        ImGui::SameLine(0, style.ItemInnerSpacing.x);
        ImGui::PushButtonRepeat(true);
        if (ImGui::Button("-", ImVec2(button_size, button_size)))
        {
            GImGui->ActiveIdPreviousFrameHasBeenEditedBefore = true;
            retval = true;
            if (*v - v_rate < v_min)
                *v = v_min;
            else
                *v -= v_rate;
        }
        ImGui::SameLine(0, style.ItemInnerSpacing.x);
        if (ImGui::Button("+", ImVec2(button_size, button_size)))
        {
            GImGui->ActiveIdPreviousFrameHasBeenEditedBefore = true;
            retval = true;
            if (*v + v_rate > v_max)
                *v = v_max;
            else
                *v += v_rate;
        }
        ImGui::PopButtonRepeat();
        ImGui::SameLine(0, style.ItemInnerSpacing.x);
        ImGui::TextUnformatted(label);
        ImGui::PopStyleVar();
        ImGui::PopID();
        ImGui::EndGroup();

        return retval;
    }
    
    bool SteppedSliderFloat(const char* label, float* v, float v_min, float v_max, float v_rate, const char* format, ImGuiSliderFlags flags)
    {
        ImGuiStyle style = ImGui::GetStyle();
        const float button_size = ImGui::GetFrameHeight();
        const float slider_width = std::max(1.0f, ImGui::CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2);

        ImGui::BeginGroup();
        ImGui::PushID(label);
        ImGui::SetNextItemWidth(slider_width);
        bool retval = ImGui::SliderFloat("##slider", v, v_min, v_max, format, flags);
        ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(style.FramePadding.y, style.FramePadding.y));
        ImGui::SameLine(0, style.ItemInnerSpacing.x);
        ImGui::PushButtonRepeat(true);
        if (ImGui::Button("-", ImVec2(button_size, button_size)))
        {
            GImGui->ActiveIdPreviousFrameHasBeenEditedBefore = true;
            retval = true;
            if (ImGui::IsKeyDown(ImGuiKey_ModShift))
                v_rate /= 10;
            else if (ImGui::IsKeyDown(ImGuiKey_ModCtrl))
                v_rate /= 100;

            if (*v - v_rate < v_min)
                *v = v_min;
            else
                *v -= v_rate;
        }
        ImGui::SameLine(0, style.ItemInnerSpacing.x);
        if (ImGui::Button("+", ImVec2(button_size, button_size)))
        {
            GImGui->ActiveIdPreviousFrameHasBeenEditedBefore = true;
            retval = true;
            if (ImGui::IsKeyDown(ImGuiKey_ModShift))
                v_rate /= 10;
            else if (ImGui::IsKeyDown(ImGuiKey_ModCtrl))
                v_rate /= 100;

            if (*v + v_rate > v_max)
                *v = v_max;
            else
                *v += v_rate;
        }
        ImGui::PopButtonRepeat();
        ImGui::SameLine(0, style.ItemInnerSpacing.x);
        ImGui::TextUnformatted(label);
        ImGui::PopStyleVar();
        ImGui::PopID();
        ImGui::EndGroup();

        return retval;
    }
}