|
@@ -1910,10 +1910,11 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
|
|
|
}
|
|
|
|
|
|
template<typename T>
|
|
|
-static bool ClampBehaviorT(T* v, T v_min, T v_max)
|
|
|
+static bool ClampBehaviorT(T* v, const T* v_min, const T* v_max)
|
|
|
{
|
|
|
- if (*v < v_min) { *v = v_min; return true; }
|
|
|
- if (*v > v_max) { *v = v_max; return true; }
|
|
|
+ // Clamp, both sides are optional
|
|
|
+ if (v_min && *v < *v_min) { *v = *v_min; return true; }
|
|
|
+ if (v_max && *v > *v_max) { *v = *v_max; return true; }
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -1921,16 +1922,16 @@ bool ImGui::DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_m
|
|
|
{
|
|
|
switch (data_type)
|
|
|
{
|
|
|
- case ImGuiDataType_S8: return ClampBehaviorT<ImS8 >((ImS8* )p_data, *(const ImS8* )p_min, *(const ImS8* )p_max);
|
|
|
- case ImGuiDataType_U8: return ClampBehaviorT<ImU8 >((ImU8* )p_data, *(const ImU8* )p_min, *(const ImU8* )p_max);
|
|
|
- case ImGuiDataType_S16: return ClampBehaviorT<ImS16 >((ImS16* )p_data, *(const ImS16* )p_min, *(const ImS16* )p_max);
|
|
|
- case ImGuiDataType_U16: return ClampBehaviorT<ImU16 >((ImU16* )p_data, *(const ImU16* )p_min, *(const ImU16* )p_max);
|
|
|
- case ImGuiDataType_S32: return ClampBehaviorT<ImS32 >((ImS32* )p_data, *(const ImS32* )p_min, *(const ImS32* )p_max);
|
|
|
- case ImGuiDataType_U32: return ClampBehaviorT<ImU32 >((ImU32* )p_data, *(const ImU32* )p_min, *(const ImU32* )p_max);
|
|
|
- case ImGuiDataType_S64: return ClampBehaviorT<ImS64 >((ImS64* )p_data, *(const ImS64* )p_min, *(const ImS64* )p_max);
|
|
|
- case ImGuiDataType_U64: return ClampBehaviorT<ImU64 >((ImU64* )p_data, *(const ImU64* )p_min, *(const ImU64* )p_max);
|
|
|
- case ImGuiDataType_Float: return ClampBehaviorT<float >((float* )p_data, *(const float* )p_min, *(const float* )p_max);
|
|
|
- case ImGuiDataType_Double: return ClampBehaviorT<double>((double*)p_data, *(const double*)p_min, *(const double*)p_max);
|
|
|
+ case ImGuiDataType_S8: return ClampBehaviorT<ImS8 >((ImS8* )p_data, (const ImS8* )p_min, (const ImS8* )p_max);
|
|
|
+ case ImGuiDataType_U8: return ClampBehaviorT<ImU8 >((ImU8* )p_data, (const ImU8* )p_min, (const ImU8* )p_max);
|
|
|
+ case ImGuiDataType_S16: return ClampBehaviorT<ImS16 >((ImS16* )p_data, (const ImS16* )p_min, (const ImS16* )p_max);
|
|
|
+ case ImGuiDataType_U16: return ClampBehaviorT<ImU16 >((ImU16* )p_data, (const ImU16* )p_min, (const ImU16* )p_max);
|
|
|
+ case ImGuiDataType_S32: return ClampBehaviorT<ImS32 >((ImS32* )p_data, (const ImS32* )p_min, (const ImS32* )p_max);
|
|
|
+ case ImGuiDataType_U32: return ClampBehaviorT<ImU32 >((ImU32* )p_data, (const ImU32* )p_min, (const ImU32* )p_max);
|
|
|
+ case ImGuiDataType_S64: return ClampBehaviorT<ImS64 >((ImS64* )p_data, (const ImS64* )p_min, (const ImS64* )p_max);
|
|
|
+ case ImGuiDataType_U64: return ClampBehaviorT<ImU64 >((ImU64* )p_data, (const ImU64* )p_min, (const ImU64* )p_max);
|
|
|
+ case ImGuiDataType_Float: return ClampBehaviorT<float >((float* )p_data, (const float* )p_min, (const float* )p_max);
|
|
|
+ case ImGuiDataType_Double: return ClampBehaviorT<double>((double*)p_data, (const double*)p_min, (const double*)p_max);
|
|
|
case ImGuiDataType_COUNT: break;
|
|
|
}
|
|
|
IM_ASSERT(0);
|
|
@@ -2197,9 +2198,12 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Our current specs do NOT clamp when using CTRL+Click manual input, but we should eventually add a flag for that..
|
|
|
if (temp_input_is_active)
|
|
|
- return TempInputScalar(frame_bb, id, label, data_type, p_data, format);// , p_min, p_max);
|
|
|
+ {
|
|
|
+ // Only clamp CTRL+Click input when ImGuiDragFlags_ClampInput is set
|
|
|
+ const bool is_clamp_input = (flags & ImGuiDragFlags_ClampOnInput) != 0;
|
|
|
+ return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL);
|
|
|
+ }
|
|
|
|
|
|
// Draw frame
|
|
|
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
|
|
@@ -2753,9 +2757,12 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Our current specs do NOT clamp when using CTRL+Click manual input, but we should eventually add a flag for that..
|
|
|
if (temp_input_is_active)
|
|
|
- return TempInputScalar(frame_bb, id, label, data_type, p_data, format);// , p_min, p_max);
|
|
|
+ {
|
|
|
+ // Only clamp CTRL+Click input when ImGuiSliderFlags_ClampInput is set
|
|
|
+ const bool is_clamp_input = (flags & ImGuiSliderFlags_ClampOnInput) != 0;
|
|
|
+ return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL);
|
|
|
+ }
|
|
|
|
|
|
// Draw frame
|
|
|
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
|
|
@@ -3081,20 +3088,10 @@ bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char*
|
|
|
return value_changed;
|
|
|
}
|
|
|
|
|
|
-// Note that Drag/Slider functions are currently NOT forwarding the min/max values clamping values!
|
|
|
+// Note that Drag/Slider functions are only forwarding the min/max values clamping values if the
|
|
|
+// ImGuiDragFlags_ClampOnInput / ImGuiSliderFlags_ClampOnInput flag is set!
|
|
|
// This is intended: this way we allow CTRL+Click manual input to set a value out of bounds, for maximum flexibility.
|
|
|
// However this may not be ideal for all uses, as some user code may break on out of bound values.
|
|
|
-// In the future we should add flags to Slider/Drag to specify how to enforce min/max values with CTRL+Click.
|
|
|
-// See GitHub issues #1829 and #3209
|
|
|
-// In the meanwhile, you can easily "wrap" those functions to enforce clamping, using wrapper functions, e.g.
|
|
|
-// bool SliderFloatClamp(const char* label, float* v, float v_min, float v_max)
|
|
|
-// {
|
|
|
-// float v_backup = *v;
|
|
|
-// if (!SliderFloat(label, v, v_min, v_max))
|
|
|
-// return false;
|
|
|
-// *v = ImClamp(*v, v_min, v_max);
|
|
|
-// return v_backup != *v;
|
|
|
-// }
|
|
|
bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min, const void* p_clamp_max)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
@@ -3117,7 +3114,7 @@ bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImG
|
|
|
|
|
|
// Apply new value (or operations) then clamp
|
|
|
DataTypeApplyOpFromText(data_buf, g.InputTextState.InitialTextA.Data, data_type, p_data, NULL);
|
|
|
- if (p_clamp_min && p_clamp_max)
|
|
|
+ if (p_clamp_min || p_clamp_max)
|
|
|
DataTypeClamp(data_type, p_data, p_clamp_min, p_clamp_max);
|
|
|
|
|
|
// Only mark as edited if new value is different
|