mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Internals: SliderBehavior: Using axis indexing.
This commit is contained in:
		@@ -2081,20 +2081,20 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    const ImGuiStyle& style = g.Style;
 | 
			
		||||
 | 
			
		||||
    const bool is_horizontal = (flags & ImGuiSliderFlags_Vertical) == 0;
 | 
			
		||||
    const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X;
 | 
			
		||||
    const bool is_decimal = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double);
 | 
			
		||||
    const bool is_power = (power != 1.0f) && is_decimal;
 | 
			
		||||
 | 
			
		||||
    const float grab_padding = 2.0f;
 | 
			
		||||
    const float slider_sz = is_horizontal ? (bb.GetWidth() - grab_padding * 2.0f) : (bb.GetHeight() - grab_padding * 2.0f);
 | 
			
		||||
    const float slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f;
 | 
			
		||||
    float grab_sz = style.GrabMinSize;
 | 
			
		||||
    SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max);
 | 
			
		||||
    if (!is_decimal && v_range >= 0)                                             // v_range < 0 may happen on integer overflows
 | 
			
		||||
        grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize);  // For integer sliders: if possible have the grab size represent 1 unit
 | 
			
		||||
    grab_sz = ImMin(grab_sz, slider_sz);
 | 
			
		||||
    const float slider_usable_sz = slider_sz - grab_sz;
 | 
			
		||||
    const float slider_usable_pos_min = (is_horizontal ? bb.Min.x : bb.Min.y) + grab_padding + grab_sz*0.5f;
 | 
			
		||||
    const float slider_usable_pos_max = (is_horizontal ? bb.Max.x : bb.Max.y) - grab_padding - grab_sz*0.5f;
 | 
			
		||||
    const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz*0.5f;
 | 
			
		||||
    const float slider_usable_pos_max = bb.Max[axis] - grab_padding - grab_sz*0.5f;
 | 
			
		||||
 | 
			
		||||
    // For power curve sliders that cross over sign boundary we want the curve to be symmetric around 0.0f
 | 
			
		||||
    float linear_zero_pos;   // 0.0->1.0f
 | 
			
		||||
@@ -2125,9 +2125,9 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                const float mouse_abs_pos = is_horizontal ? g.IO.MousePos.x : g.IO.MousePos.y;
 | 
			
		||||
                const float mouse_abs_pos = g.IO.MousePos[axis];
 | 
			
		||||
                clicked_t = (slider_usable_sz > 0.0f) ? ImClamp((mouse_abs_pos - slider_usable_pos_min) / slider_usable_sz, 0.0f, 1.0f) : 0.0f;
 | 
			
		||||
                if (!is_horizontal)
 | 
			
		||||
                if (axis == ImGuiAxis_Y)
 | 
			
		||||
                    clicked_t = 1.0f - clicked_t;
 | 
			
		||||
                set_new_value = true;
 | 
			
		||||
            }
 | 
			
		||||
@@ -2135,7 +2135,7 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
 | 
			
		||||
        else if (g.ActiveIdSource == ImGuiInputSource_Nav)
 | 
			
		||||
        {
 | 
			
		||||
            const ImVec2 delta2 = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 0.0f, 0.0f);
 | 
			
		||||
            float delta = is_horizontal ? delta2.x : -delta2.y;
 | 
			
		||||
            float delta = (axis == ImGuiAxis_X) ? delta2.x : -delta2.y;
 | 
			
		||||
            if (g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated)
 | 
			
		||||
            {
 | 
			
		||||
                ClearActiveID();
 | 
			
		||||
@@ -2227,10 +2227,10 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
 | 
			
		||||
 | 
			
		||||
    // Output grab position so it can be displayed by the caller
 | 
			
		||||
    float grab_t = SliderCalcRatioFromValueT<TYPE,FLOATTYPE>(data_type, *v, v_min, v_max, power, linear_zero_pos);
 | 
			
		||||
    if (!is_horizontal)
 | 
			
		||||
    if (axis == ImGuiAxis_Y)
 | 
			
		||||
        grab_t = 1.0f - grab_t;
 | 
			
		||||
    const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t);
 | 
			
		||||
    if (is_horizontal)
 | 
			
		||||
    if (axis == ImGuiAxis_X)
 | 
			
		||||
        *out_grab_bb = ImRect(grab_pos - grab_sz*0.5f, bb.Min.y + grab_padding, grab_pos + grab_sz*0.5f, bb.Max.y - grab_padding);
 | 
			
		||||
    else
 | 
			
		||||
        *out_grab_bb = ImRect(bb.Min.x + grab_padding, grab_pos - grab_sz*0.5f, bb.Max.x - grab_padding, grab_pos + grab_sz*0.5f);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user