mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-29 20:21:40 +01:00 
			
		
		
		
	DragScalar, SliderScalar, InputScalar: Added p_ prefix to parameter that are pointers to the datato clarify how they are used, and more comments redirecting to the demo code. (#2844)
This commit is contained in:
		| @@ -40,6 +40,8 @@ Other Changes: | |||||||
| - InputText, Nav: Fixed Home/End key broken when activating Keyboard Navigation. (#787) | - InputText, Nav: Fixed Home/End key broken when activating Keyboard Navigation. (#787) | ||||||
| - TreeNode: Fixed combination of ImGuiTreeNodeFlags_SpanFullWidth and ImGuiTreeNodeFlags_OpenOnArrow | - TreeNode: Fixed combination of ImGuiTreeNodeFlags_SpanFullWidth and ImGuiTreeNodeFlags_OpenOnArrow | ||||||
|   incorrectly locating the arrow hit position to the left of the frame. (#2451, #2438, #1897) |   incorrectly locating the arrow hit position to the left of the frame. (#2451, #2438, #1897) | ||||||
|  | - DragScalar, SliderScalar, InputScalar: Added p_ prefix to parameter that are pointers to the data | ||||||
|  |   to clarify how they are used, and more comments redirecting to the demo code. (#2844) | ||||||
| - Demo: Added simple item reordering demo in Widgets -> Drag and Drop section. (#2823, #143) [@rokups] | - Demo: Added simple item reordering demo in Widgets -> Drag and Drop section. (#2823, #143) [@rokups] | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -438,8 +438,8 @@ namespace ImGui | |||||||
|     IMGUI_API bool          DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d"); |     IMGUI_API bool          DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d"); | ||||||
|     IMGUI_API bool          DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d"); |     IMGUI_API bool          DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d"); | ||||||
|     IMGUI_API bool          DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", const char* format_max = NULL); |     IMGUI_API bool          DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", const char* format_max = NULL); | ||||||
|     IMGUI_API bool          DragScalar(const char* label, ImGuiDataType data_type, void* v, float v_speed, const void* v_min = NULL, const void* v_max = NULL, const char* format = NULL, float power = 1.0f); |     IMGUI_API bool          DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, float power = 1.0f); | ||||||
|     IMGUI_API bool          DragScalarN(const char* label, ImGuiDataType data_type, void* v, int components, float v_speed, const void* v_min = NULL, const void* v_max = NULL, const char* format = NULL, float power = 1.0f); |     IMGUI_API bool          DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, float power = 1.0f); | ||||||
|  |  | ||||||
|     // Widgets: Sliders |     // Widgets: Sliders | ||||||
|     // - CTRL+Click on any slider to turn them into an input box. Manually input values aren't clamped and can go off-bounds. |     // - CTRL+Click on any slider to turn them into an input box. Manually input values aren't clamped and can go off-bounds. | ||||||
| @@ -453,11 +453,11 @@ namespace ImGui | |||||||
|     IMGUI_API bool          SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%d"); |     IMGUI_API bool          SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%d"); | ||||||
|     IMGUI_API bool          SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%d"); |     IMGUI_API bool          SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%d"); | ||||||
|     IMGUI_API bool          SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%d"); |     IMGUI_API bool          SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%d"); | ||||||
|     IMGUI_API bool          SliderScalar(const char* label, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format = NULL, float power = 1.0f); |     IMGUI_API bool          SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, float power = 1.0f); | ||||||
|     IMGUI_API bool          SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format = NULL, float power = 1.0f); |     IMGUI_API bool          SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format = NULL, float power = 1.0f); | ||||||
|     IMGUI_API bool          VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f); |     IMGUI_API bool          VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f); | ||||||
|     IMGUI_API bool          VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%d"); |     IMGUI_API bool          VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%d"); | ||||||
|     IMGUI_API bool          VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format = NULL, float power = 1.0f); |     IMGUI_API bool          VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, float power = 1.0f); | ||||||
|  |  | ||||||
|     // Widgets: Input with Keyboard |     // Widgets: Input with Keyboard | ||||||
|     // - If you want to use InputText() with a dynamic string type such as std::string or your own, see misc/cpp/imgui_stdlib.h |     // - If you want to use InputText() with a dynamic string type such as std::string or your own, see misc/cpp/imgui_stdlib.h | ||||||
| @@ -474,8 +474,8 @@ namespace ImGui | |||||||
|     IMGUI_API bool          InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags = 0); |     IMGUI_API bool          InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags = 0); | ||||||
|     IMGUI_API bool          InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags = 0); |     IMGUI_API bool          InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags = 0); | ||||||
|     IMGUI_API bool          InputDouble(const char* label, double* v, double step = 0.0, double step_fast = 0.0, const char* format = "%.6f", ImGuiInputTextFlags flags = 0); |     IMGUI_API bool          InputDouble(const char* label, double* v, double step = 0.0, double step_fast = 0.0, const char* format = "%.6f", ImGuiInputTextFlags flags = 0); | ||||||
|     IMGUI_API bool          InputScalar(const char* label, ImGuiDataType data_type, void* v, const void* step = NULL, const void* step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); |     IMGUI_API bool          InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); | ||||||
|     IMGUI_API bool          InputScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* step = NULL, const void* step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); |     IMGUI_API bool          InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); | ||||||
|  |  | ||||||
|     // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little colored preview square that can be left-clicked to open a picker, and right-clicked to open an option menu.) |     // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little colored preview square that can be left-clicked to open a picker, and right-clicked to open an option menu.) | ||||||
|     // - Note that in C++ a 'float v[X]' function argument is the _same_ as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. |     // - Note that in C++ a 'float v[X]' function argument is the _same_ as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. | ||||||
|   | |||||||
| @@ -1666,8 +1666,8 @@ namespace ImGui | |||||||
|  |  | ||||||
|     // Widgets low-level behaviors |     // Widgets low-level behaviors | ||||||
|     IMGUI_API bool          ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); |     IMGUI_API bool          ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); | ||||||
|     IMGUI_API bool          DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power, ImGuiDragFlags flags); |     IMGUI_API bool          DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, float power, ImGuiDragFlags flags); | ||||||
|     IMGUI_API bool          SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb); |     IMGUI_API bool          SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb); | ||||||
|     IMGUI_API bool          SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f); |     IMGUI_API bool          SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f); | ||||||
|     IMGUI_API bool          TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL); |     IMGUI_API bool          TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL); | ||||||
|     IMGUI_API bool          TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0);                     // Consume previous SetNextItemOpen() data, if any. May return true when logging |     IMGUI_API bool          TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0);                     // Consume previous SetNextItemOpen() data, if any. May return true when logging | ||||||
| @@ -1683,13 +1683,13 @@ namespace ImGui | |||||||
|  |  | ||||||
|     // Data type helpers |     // Data type helpers | ||||||
|     IMGUI_API const ImGuiDataTypeInfo*  DataTypeGetInfo(ImGuiDataType data_type); |     IMGUI_API const ImGuiDataTypeInfo*  DataTypeGetInfo(ImGuiDataType data_type); | ||||||
|     IMGUI_API int           DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format); |     IMGUI_API int           DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format); | ||||||
|     IMGUI_API void          DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg_1, const void* arg_2); |     IMGUI_API void          DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg_1, const void* arg_2); | ||||||
|     IMGUI_API bool          DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* format); |     IMGUI_API bool          DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* p_data, const char* format); | ||||||
|  |  | ||||||
|     // InputText |     // InputText | ||||||
|     IMGUI_API bool          InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); |     IMGUI_API bool          InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); | ||||||
|     IMGUI_API bool          TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format); |     IMGUI_API bool          TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format); | ||||||
|     inline bool             TempInputTextIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputTextId == id); } |     inline bool             TempInputTextIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputTextId == id); } | ||||||
|  |  | ||||||
|     // Color |     // Color | ||||||
|   | |||||||
| @@ -1680,25 +1680,25 @@ const ImGuiDataTypeInfo* ImGui::DataTypeGetInfo(ImGuiDataType data_type) | |||||||
|     return &GDataTypeInfo[data_type]; |     return &GDataTypeInfo[data_type]; | ||||||
| } | } | ||||||
|  |  | ||||||
| int ImGui::DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format) | int ImGui::DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format) | ||||||
| { | { | ||||||
|     // Signedness doesn't matter when pushing integer arguments |     // Signedness doesn't matter when pushing integer arguments | ||||||
|     if (data_type == ImGuiDataType_S32 || data_type == ImGuiDataType_U32) |     if (data_type == ImGuiDataType_S32 || data_type == ImGuiDataType_U32) | ||||||
|         return ImFormatString(buf, buf_size, format, *(const ImU32*)data_ptr); |         return ImFormatString(buf, buf_size, format, *(const ImU32*)p_data); | ||||||
|     if (data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64) |     if (data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64) | ||||||
|         return ImFormatString(buf, buf_size, format, *(const ImU64*)data_ptr); |         return ImFormatString(buf, buf_size, format, *(const ImU64*)p_data); | ||||||
|     if (data_type == ImGuiDataType_Float) |     if (data_type == ImGuiDataType_Float) | ||||||
|         return ImFormatString(buf, buf_size, format, *(const float*)data_ptr); |         return ImFormatString(buf, buf_size, format, *(const float*)p_data); | ||||||
|     if (data_type == ImGuiDataType_Double) |     if (data_type == ImGuiDataType_Double) | ||||||
|         return ImFormatString(buf, buf_size, format, *(const double*)data_ptr); |         return ImFormatString(buf, buf_size, format, *(const double*)p_data); | ||||||
|     if (data_type == ImGuiDataType_S8) |     if (data_type == ImGuiDataType_S8) | ||||||
|         return ImFormatString(buf, buf_size, format, *(const ImS8*)data_ptr); |         return ImFormatString(buf, buf_size, format, *(const ImS8*)p_data); | ||||||
|     if (data_type == ImGuiDataType_U8) |     if (data_type == ImGuiDataType_U8) | ||||||
|         return ImFormatString(buf, buf_size, format, *(const ImU8*)data_ptr); |         return ImFormatString(buf, buf_size, format, *(const ImU8*)p_data); | ||||||
|     if (data_type == ImGuiDataType_S16) |     if (data_type == ImGuiDataType_S16) | ||||||
|         return ImFormatString(buf, buf_size, format, *(const ImS16*)data_ptr); |         return ImFormatString(buf, buf_size, format, *(const ImS16*)p_data); | ||||||
|     if (data_type == ImGuiDataType_U16) |     if (data_type == ImGuiDataType_U16) | ||||||
|         return ImFormatString(buf, buf_size, format, *(const ImU16*)data_ptr); |         return ImFormatString(buf, buf_size, format, *(const ImU16*)p_data); | ||||||
|     IM_ASSERT(0); |     IM_ASSERT(0); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -1755,7 +1755,7 @@ void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* | |||||||
|  |  | ||||||
| // User can input math operators (e.g. +100) to edit a numerical values. | // User can input math operators (e.g. +100) to edit a numerical values. | ||||||
| // NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess.. | // NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess.. | ||||||
| bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* format) | bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* p_data, const char* format) | ||||||
| { | { | ||||||
|     while (ImCharIsBlankA(*buf)) |     while (ImCharIsBlankA(*buf)) | ||||||
|         buf++; |         buf++; | ||||||
| @@ -1781,7 +1781,7 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b | |||||||
|     int data_backup[2]; |     int data_backup[2]; | ||||||
|     const ImGuiDataTypeInfo* type_info = ImGui::DataTypeGetInfo(data_type); |     const ImGuiDataTypeInfo* type_info = ImGui::DataTypeGetInfo(data_type); | ||||||
|     IM_ASSERT(type_info->Size <= sizeof(data_backup)); |     IM_ASSERT(type_info->Size <= sizeof(data_backup)); | ||||||
|     memcpy(data_backup, data_ptr, type_info->Size); |     memcpy(data_backup, p_data, type_info->Size); | ||||||
|  |  | ||||||
|     if (format == NULL) |     if (format == NULL) | ||||||
|         format = type_info->ScanFmt; |         format = type_info->ScanFmt; | ||||||
| @@ -1790,7 +1790,7 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b | |||||||
|     int arg1i = 0; |     int arg1i = 0; | ||||||
|     if (data_type == ImGuiDataType_S32) |     if (data_type == ImGuiDataType_S32) | ||||||
|     { |     { | ||||||
|         int* v = (int*)data_ptr; |         int* v = (int*)p_data; | ||||||
|         int arg0i = *v; |         int arg0i = *v; | ||||||
|         float arg1f = 0.0f; |         float arg1f = 0.0f; | ||||||
|         if (op && sscanf(initial_value_buf, format, &arg0i) < 1) |         if (op && sscanf(initial_value_buf, format, &arg0i) < 1) | ||||||
| @@ -1805,7 +1805,7 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b | |||||||
|     { |     { | ||||||
|         // For floats we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in |         // For floats we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in | ||||||
|         format = "%f"; |         format = "%f"; | ||||||
|         float* v = (float*)data_ptr; |         float* v = (float*)p_data; | ||||||
|         float arg0f = *v, arg1f = 0.0f; |         float arg0f = *v, arg1f = 0.0f; | ||||||
|         if (op && sscanf(initial_value_buf, format, &arg0f) < 1) |         if (op && sscanf(initial_value_buf, format, &arg0f) < 1) | ||||||
|             return false; |             return false; | ||||||
| @@ -1819,7 +1819,7 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b | |||||||
|     else if (data_type == ImGuiDataType_Double) |     else if (data_type == ImGuiDataType_Double) | ||||||
|     { |     { | ||||||
|         format = "%lf"; // scanf differentiate float/double unlike printf which forces everything to double because of ellipsis |         format = "%lf"; // scanf differentiate float/double unlike printf which forces everything to double because of ellipsis | ||||||
|         double* v = (double*)data_ptr; |         double* v = (double*)p_data; | ||||||
|         double arg0f = *v, arg1f = 0.0; |         double arg0f = *v, arg1f = 0.0; | ||||||
|         if (op && sscanf(initial_value_buf, format, &arg0f) < 1) |         if (op && sscanf(initial_value_buf, format, &arg0f) < 1) | ||||||
|             return false; |             return false; | ||||||
| @@ -1834,7 +1834,7 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b | |||||||
|     { |     { | ||||||
|         // All other types assign constant |         // All other types assign constant | ||||||
|         // We don't bother handling support for legacy operators since they are a little too crappy. Instead we will later implement a proper expression evaluator in the future. |         // We don't bother handling support for legacy operators since they are a little too crappy. Instead we will later implement a proper expression evaluator in the future. | ||||||
|         sscanf(buf, format, data_ptr); |         sscanf(buf, format, p_data); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
| @@ -1842,18 +1842,18 @@ bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_b | |||||||
|         int v32; |         int v32; | ||||||
|         sscanf(buf, format, &v32); |         sscanf(buf, format, &v32); | ||||||
|         if (data_type == ImGuiDataType_S8) |         if (data_type == ImGuiDataType_S8) | ||||||
|             *(ImS8*)data_ptr = (ImS8)ImClamp(v32, (int)IM_S8_MIN, (int)IM_S8_MAX); |             *(ImS8*)p_data = (ImS8)ImClamp(v32, (int)IM_S8_MIN, (int)IM_S8_MAX); | ||||||
|         else if (data_type == ImGuiDataType_U8) |         else if (data_type == ImGuiDataType_U8) | ||||||
|             *(ImU8*)data_ptr = (ImU8)ImClamp(v32, (int)IM_U8_MIN, (int)IM_U8_MAX); |             *(ImU8*)p_data = (ImU8)ImClamp(v32, (int)IM_U8_MIN, (int)IM_U8_MAX); | ||||||
|         else if (data_type == ImGuiDataType_S16) |         else if (data_type == ImGuiDataType_S16) | ||||||
|             *(ImS16*)data_ptr = (ImS16)ImClamp(v32, (int)IM_S16_MIN, (int)IM_S16_MAX); |             *(ImS16*)p_data = (ImS16)ImClamp(v32, (int)IM_S16_MIN, (int)IM_S16_MAX); | ||||||
|         else if (data_type == ImGuiDataType_U16) |         else if (data_type == ImGuiDataType_U16) | ||||||
|             *(ImU16*)data_ptr = (ImU16)ImClamp(v32, (int)IM_U16_MIN, (int)IM_U16_MAX); |             *(ImU16*)p_data = (ImU16)ImClamp(v32, (int)IM_U16_MIN, (int)IM_U16_MAX); | ||||||
|         else |         else | ||||||
|             IM_ASSERT(0); |             IM_ASSERT(0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return memcmp(data_backup, data_ptr, type_info->Size) != 0; |     return memcmp(data_backup, p_data, type_info->Size) != 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static float GetMinimumStepAtDecimalPrecision(int decimal_precision) | static float GetMinimumStepAtDecimalPrecision(int decimal_precision) | ||||||
| @@ -2023,7 +2023,7 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power, ImGuiDragFlags flags) | bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, float power, ImGuiDragFlags flags) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     if (g.ActiveId == id) |     if (g.ActiveId == id) | ||||||
| @@ -2038,30 +2038,32 @@ bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_s | |||||||
|  |  | ||||||
|     switch (data_type) |     switch (data_type) | ||||||
|     { |     { | ||||||
|     case ImGuiDataType_S8:     { ImS32 v32 = (ImS32)*(ImS8*)v;  bool r = DragBehaviorT<ImS32, ImS32, float >(ImGuiDataType_S32, &v32, v_speed, v_min ? *(const ImS8*) v_min : IM_S8_MIN,  v_max ? *(const ImS8*)v_max  : IM_S8_MAX,  format, power, flags); if (r) *(ImS8*)v = (ImS8)v32; return r; } |     case ImGuiDataType_S8:     { ImS32 v32 = (ImS32)*(ImS8*)p_v;  bool r = DragBehaviorT<ImS32, ImS32, float>(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS8*) p_min : IM_S8_MIN,  p_max ? *(const ImS8*)p_max  : IM_S8_MAX,  format, power, flags); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } | ||||||
|     case ImGuiDataType_U8:     { ImU32 v32 = (ImU32)*(ImU8*)v;  bool r = DragBehaviorT<ImU32, ImS32, float >(ImGuiDataType_U32, &v32, v_speed, v_min ? *(const ImU8*) v_min : IM_U8_MIN,  v_max ? *(const ImU8*)v_max  : IM_U8_MAX,  format, power, flags); if (r) *(ImU8*)v = (ImU8)v32; return r; } |     case ImGuiDataType_U8:     { ImU32 v32 = (ImU32)*(ImU8*)p_v;  bool r = DragBehaviorT<ImU32, ImS32, float>(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU8*) p_min : IM_U8_MIN,  p_max ? *(const ImU8*)p_max  : IM_U8_MAX,  format, power, flags); if (r) *(ImU8*)p_v = (ImU8)v32; return r; } | ||||||
|     case ImGuiDataType_S16:    { ImS32 v32 = (ImS32)*(ImS16*)v; bool r = DragBehaviorT<ImS32, ImS32, float >(ImGuiDataType_S32, &v32, v_speed, v_min ? *(const ImS16*)v_min : IM_S16_MIN, v_max ? *(const ImS16*)v_max : IM_S16_MAX, format, power, flags); if (r) *(ImS16*)v = (ImS16)v32; return r; } |     case ImGuiDataType_S16:    { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = DragBehaviorT<ImS32, ImS32, float>(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS16*)p_min : IM_S16_MIN, p_max ? *(const ImS16*)p_max : IM_S16_MAX, format, power, flags); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } | ||||||
|     case ImGuiDataType_U16:    { ImU32 v32 = (ImU32)*(ImU16*)v; bool r = DragBehaviorT<ImU32, ImS32, float >(ImGuiDataType_U32, &v32, v_speed, v_min ? *(const ImU16*)v_min : IM_U16_MIN, v_max ? *(const ImU16*)v_max : IM_U16_MAX, format, power, flags); if (r) *(ImU16*)v = (ImU16)v32; return r; } |     case ImGuiDataType_U16:    { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = DragBehaviorT<ImU32, ImS32, float>(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU16*)p_min : IM_U16_MIN, p_max ? *(const ImU16*)p_max : IM_U16_MAX, format, power, flags); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } | ||||||
|     case ImGuiDataType_S32:    return DragBehaviorT<ImS32, ImS32, float >(data_type, (ImS32*)v,  v_speed, v_min ? *(const ImS32* )v_min : IM_S32_MIN, v_max ? *(const ImS32* )v_max : IM_S32_MAX, format, power, flags); |     case ImGuiDataType_S32:    return DragBehaviorT<ImS32, ImS32, float >(data_type, (ImS32*)p_v,  v_speed, p_min ? *(const ImS32* )p_min : IM_S32_MIN, p_max ? *(const ImS32* )p_max : IM_S32_MAX, format, power, flags); | ||||||
|     case ImGuiDataType_U32:    return DragBehaviorT<ImU32, ImS32, float >(data_type, (ImU32*)v,  v_speed, v_min ? *(const ImU32* )v_min : IM_U32_MIN, v_max ? *(const ImU32* )v_max : IM_U32_MAX, format, power, flags); |     case ImGuiDataType_U32:    return DragBehaviorT<ImU32, ImS32, float >(data_type, (ImU32*)p_v,  v_speed, p_min ? *(const ImU32* )p_min : IM_U32_MIN, p_max ? *(const ImU32* )p_max : IM_U32_MAX, format, power, flags); | ||||||
|     case ImGuiDataType_S64:    return DragBehaviorT<ImS64, ImS64, double>(data_type, (ImS64*)v,  v_speed, v_min ? *(const ImS64* )v_min : IM_S64_MIN, v_max ? *(const ImS64* )v_max : IM_S64_MAX, format, power, flags); |     case ImGuiDataType_S64:    return DragBehaviorT<ImS64, ImS64, double>(data_type, (ImS64*)p_v,  v_speed, p_min ? *(const ImS64* )p_min : IM_S64_MIN, p_max ? *(const ImS64* )p_max : IM_S64_MAX, format, power, flags); | ||||||
|     case ImGuiDataType_U64:    return DragBehaviorT<ImU64, ImS64, double>(data_type, (ImU64*)v,  v_speed, v_min ? *(const ImU64* )v_min : IM_U64_MIN, v_max ? *(const ImU64* )v_max : IM_U64_MAX, format, power, flags); |     case ImGuiDataType_U64:    return DragBehaviorT<ImU64, ImS64, double>(data_type, (ImU64*)p_v,  v_speed, p_min ? *(const ImU64* )p_min : IM_U64_MIN, p_max ? *(const ImU64* )p_max : IM_U64_MAX, format, power, flags); | ||||||
|     case ImGuiDataType_Float:  return DragBehaviorT<float, float, float >(data_type, (float*)v,  v_speed, v_min ? *(const float* )v_min : -FLT_MAX,   v_max ? *(const float* )v_max : FLT_MAX,    format, power, flags); |     case ImGuiDataType_Float:  return DragBehaviorT<float, float, float >(data_type, (float*)p_v,  v_speed, p_min ? *(const float* )p_min : -FLT_MAX,   p_max ? *(const float* )p_max : FLT_MAX,    format, power, flags); | ||||||
|     case ImGuiDataType_Double: return DragBehaviorT<double,double,double>(data_type, (double*)v, v_speed, v_min ? *(const double*)v_min : -DBL_MAX,   v_max ? *(const double*)v_max : DBL_MAX,    format, power, flags); |     case ImGuiDataType_Double: return DragBehaviorT<double,double,double>(data_type, (double*)p_v, v_speed, p_min ? *(const double*)p_min : -DBL_MAX,   p_max ? *(const double*)p_max : DBL_MAX,    format, power, flags); | ||||||
|     case ImGuiDataType_COUNT:  break; |     case ImGuiDataType_COUNT:  break; | ||||||
|     } |     } | ||||||
|     IM_ASSERT(0); |     IM_ASSERT(0); | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power) | // Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a Drag widget, p_min and p_max are optional. | ||||||
|  | // Read code of e.g. SliderFloat(), SliderInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. | ||||||
|  | bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power) | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|     if (window->SkipItems) |     if (window->SkipItems) | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     if (power != 1.0f) |     if (power != 1.0f) | ||||||
|         IM_ASSERT(v_min != NULL && v_max != NULL); // When using a power curve the drag needs to have known bounds |         IM_ASSERT(p_min != NULL && p_max != NULL); // When using a power curve the drag needs to have known bounds | ||||||
|  |  | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     const ImGuiStyle& style = g.Style; |     const ImGuiStyle& style = g.Style; | ||||||
| @@ -2104,7 +2106,7 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     if (temp_input_is_active || temp_input_start) |     if (temp_input_is_active || temp_input_start) | ||||||
|         return TempInputTextScalar(frame_bb, id, label, data_type, v, format); |         return TempInputTextScalar(frame_bb, id, label, data_type, p_data, format); | ||||||
|  |  | ||||||
|     // Draw frame |     // Draw frame | ||||||
|     const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); |     const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); | ||||||
| @@ -2112,13 +2114,13 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa | |||||||
|     RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding); |     RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding); | ||||||
|  |  | ||||||
|     // Drag behavior |     // Drag behavior | ||||||
|     const bool value_changed = DragBehavior(id, data_type, v, v_speed, v_min, v_max, format, power, ImGuiDragFlags_None); |     const bool value_changed = DragBehavior(id, data_type, p_data, v_speed, p_min, p_max, format, power, ImGuiDragFlags_None); | ||||||
|     if (value_changed) |     if (value_changed) | ||||||
|         MarkItemEdited(id); |         MarkItemEdited(id); | ||||||
|  |  | ||||||
|     // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. |     // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. | ||||||
|     char value_buf[64]; |     char value_buf[64]; | ||||||
|     const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format); |     const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); | ||||||
|     RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); |     RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); | ||||||
|  |  | ||||||
|     if (label_size.x > 0.0f) |     if (label_size.x > 0.0f) | ||||||
| @@ -2128,7 +2130,7 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, floa | |||||||
|     return value_changed; |     return value_changed; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* v, int components, float v_speed, const void* v_min, const void* v_max, const char* format, float power) | bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power) | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|     if (window->SkipItems) |     if (window->SkipItems) | ||||||
| @@ -2145,10 +2147,10 @@ bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* v, int | |||||||
|         PushID(i); |         PushID(i); | ||||||
|         if (i > 0) |         if (i > 0) | ||||||
|             SameLine(0, g.Style.ItemInnerSpacing.x); |             SameLine(0, g.Style.ItemInnerSpacing.x); | ||||||
|         value_changed |= DragScalar("", data_type, v, v_speed, v_min, v_max, format, power); |         value_changed |= DragScalar("", data_type, p_data, v_speed, p_min, p_max, format, power); | ||||||
|         PopID(); |         PopID(); | ||||||
|         PopItemWidth(); |         PopItemWidth(); | ||||||
|         v = (void*)((char*)v + type_size); |         p_data = (void*)((char*)p_data + type_size); | ||||||
|     } |     } | ||||||
|     PopID(); |     PopID(); | ||||||
|  |  | ||||||
| @@ -2474,39 +2476,41 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ | |||||||
| // For 32-bits and larger types, slider bounds are limited to half the natural type range. | // For 32-bits and larger types, slider bounds are limited to half the natural type range. | ||||||
| // So e.g. an integer Slider between INT_MAX-10 and INT_MAX will fail, but an integer Slider between INT_MAX/2-10 and INT_MAX/2 will be ok. | // So e.g. an integer Slider between INT_MAX-10 and INT_MAX will fail, but an integer Slider between INT_MAX/2-10 and INT_MAX/2 will be ok. | ||||||
| // It would be possible to lift that limitation with some work but it doesn't seem to be worth it for sliders. | // It would be possible to lift that limitation with some work but it doesn't seem to be worth it for sliders. | ||||||
| bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb) | bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb) | ||||||
| { | { | ||||||
|     switch (data_type) |     switch (data_type) | ||||||
|     { |     { | ||||||
|     case ImGuiDataType_S8:  { ImS32 v32 = (ImS32)*(ImS8*)v;  bool r = SliderBehaviorT<ImS32, ImS32, float >(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)v_min,  *(const ImS8*)v_max,  format, power, flags, out_grab_bb); if (r) *(ImS8*)v  = (ImS8)v32;  return r; } |     case ImGuiDataType_S8:  { ImS32 v32 = (ImS32)*(ImS8*)p_v;  bool r = SliderBehaviorT<ImS32, ImS32, float>(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)p_min,  *(const ImS8*)p_max,  format, power, flags, out_grab_bb); if (r) *(ImS8*)p_v  = (ImS8)v32;  return r; } | ||||||
|     case ImGuiDataType_U8:  { ImU32 v32 = (ImU32)*(ImU8*)v;  bool r = SliderBehaviorT<ImU32, ImS32, float >(bb, id, ImGuiDataType_U32, &v32, *(const ImU8*)v_min,  *(const ImU8*)v_max,  format, power, flags, out_grab_bb); if (r) *(ImU8*)v  = (ImU8)v32;  return r; } |     case ImGuiDataType_U8:  { ImU32 v32 = (ImU32)*(ImU8*)p_v;  bool r = SliderBehaviorT<ImU32, ImS32, float>(bb, id, ImGuiDataType_U32, &v32, *(const ImU8*)p_min,  *(const ImU8*)p_max,  format, power, flags, out_grab_bb); if (r) *(ImU8*)p_v  = (ImU8)v32;  return r; } | ||||||
|     case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)v; bool r = SliderBehaviorT<ImS32, ImS32, float >(bb, id, ImGuiDataType_S32, &v32, *(const ImS16*)v_min, *(const ImS16*)v_max, format, power, flags, out_grab_bb); if (r) *(ImS16*)v = (ImS16)v32; return r; } |     case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = SliderBehaviorT<ImS32, ImS32, float>(bb, id, ImGuiDataType_S32, &v32, *(const ImS16*)p_min, *(const ImS16*)p_max, format, power, flags, out_grab_bb); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } | ||||||
|     case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)v; bool r = SliderBehaviorT<ImU32, ImS32, float >(bb, id, ImGuiDataType_U32, &v32, *(const ImU16*)v_min, *(const ImU16*)v_max, format, power, flags, out_grab_bb); if (r) *(ImU16*)v = (ImU16)v32; return r; } |     case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = SliderBehaviorT<ImU32, ImS32, float>(bb, id, ImGuiDataType_U32, &v32, *(const ImU16*)p_min, *(const ImU16*)p_max, format, power, flags, out_grab_bb); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } | ||||||
|     case ImGuiDataType_S32: |     case ImGuiDataType_S32: | ||||||
|         IM_ASSERT(*(const ImS32*)v_min >= IM_S32_MIN/2 && *(const ImS32*)v_max <= IM_S32_MAX/2); |         IM_ASSERT(*(const ImS32*)p_min >= IM_S32_MIN/2 && *(const ImS32*)p_max <= IM_S32_MAX/2); | ||||||
|         return SliderBehaviorT<ImS32, ImS32, float >(bb, id, data_type, (ImS32*)v,  *(const ImS32*)v_min,  *(const ImS32*)v_max,  format, power, flags, out_grab_bb); |         return SliderBehaviorT<ImS32, ImS32, float >(bb, id, data_type, (ImS32*)p_v,  *(const ImS32*)p_min,  *(const ImS32*)p_max,  format, power, flags, out_grab_bb); | ||||||
|     case ImGuiDataType_U32: |     case ImGuiDataType_U32: | ||||||
|         IM_ASSERT(*(const ImU32*)v_max <= IM_U32_MAX/2); |         IM_ASSERT(*(const ImU32*)p_max <= IM_U32_MAX/2); | ||||||
|         return SliderBehaviorT<ImU32, ImS32, float >(bb, id, data_type, (ImU32*)v,  *(const ImU32*)v_min,  *(const ImU32*)v_max,  format, power, flags, out_grab_bb); |         return SliderBehaviorT<ImU32, ImS32, float >(bb, id, data_type, (ImU32*)p_v,  *(const ImU32*)p_min,  *(const ImU32*)p_max,  format, power, flags, out_grab_bb); | ||||||
|     case ImGuiDataType_S64: |     case ImGuiDataType_S64: | ||||||
|         IM_ASSERT(*(const ImS64*)v_min >= IM_S64_MIN/2 && *(const ImS64*)v_max <= IM_S64_MAX/2); |         IM_ASSERT(*(const ImS64*)p_min >= IM_S64_MIN/2 && *(const ImS64*)p_max <= IM_S64_MAX/2); | ||||||
|         return SliderBehaviorT<ImS64, ImS64, double>(bb, id, data_type, (ImS64*)v,  *(const ImS64*)v_min,  *(const ImS64*)v_max,  format, power, flags, out_grab_bb); |         return SliderBehaviorT<ImS64, ImS64, double>(bb, id, data_type, (ImS64*)p_v,  *(const ImS64*)p_min,  *(const ImS64*)p_max,  format, power, flags, out_grab_bb); | ||||||
|     case ImGuiDataType_U64: |     case ImGuiDataType_U64: | ||||||
|         IM_ASSERT(*(const ImU64*)v_max <= IM_U64_MAX/2); |         IM_ASSERT(*(const ImU64*)p_max <= IM_U64_MAX/2); | ||||||
|         return SliderBehaviorT<ImU64, ImS64, double>(bb, id, data_type, (ImU64*)v,  *(const ImU64*)v_min,  *(const ImU64*)v_max,  format, power, flags, out_grab_bb); |         return SliderBehaviorT<ImU64, ImS64, double>(bb, id, data_type, (ImU64*)p_v,  *(const ImU64*)p_min,  *(const ImU64*)p_max,  format, power, flags, out_grab_bb); | ||||||
|     case ImGuiDataType_Float: |     case ImGuiDataType_Float: | ||||||
|         IM_ASSERT(*(const float*)v_min >= -FLT_MAX/2.0f && *(const float*)v_max <= FLT_MAX/2.0f); |         IM_ASSERT(*(const float*)p_min >= -FLT_MAX/2.0f && *(const float*)p_max <= FLT_MAX/2.0f); | ||||||
|         return SliderBehaviorT<float, float, float >(bb, id, data_type, (float*)v,  *(const float*)v_min,  *(const float*)v_max,  format, power, flags, out_grab_bb); |         return SliderBehaviorT<float, float, float >(bb, id, data_type, (float*)p_v,  *(const float*)p_min,  *(const float*)p_max,  format, power, flags, out_grab_bb); | ||||||
|     case ImGuiDataType_Double: |     case ImGuiDataType_Double: | ||||||
|         IM_ASSERT(*(const double*)v_min >= -DBL_MAX/2.0f && *(const double*)v_max <= DBL_MAX/2.0f); |         IM_ASSERT(*(const double*)p_min >= -DBL_MAX/2.0f && *(const double*)p_max <= DBL_MAX/2.0f); | ||||||
|         return SliderBehaviorT<double,double,double>(bb, id, data_type, (double*)v, *(const double*)v_min, *(const double*)v_max, format, power, flags, out_grab_bb); |         return SliderBehaviorT<double,double,double>(bb, id, data_type, (double*)p_v, *(const double*)p_min, *(const double*)p_max, format, power, flags, out_grab_bb); | ||||||
|     case ImGuiDataType_COUNT: break; |     case ImGuiDataType_COUNT: break; | ||||||
|     } |     } | ||||||
|     IM_ASSERT(0); |     IM_ASSERT(0); | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power) | // Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a slider, they are all required. | ||||||
|  | // Read code of e.g. SliderFloat(), SliderInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. | ||||||
|  | bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power) | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|     if (window->SkipItems) |     if (window->SkipItems) | ||||||
| @@ -2553,7 +2557,7 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     if (temp_input_is_active || temp_input_start) |     if (temp_input_is_active || temp_input_start) | ||||||
|         return TempInputTextScalar(frame_bb, id, label, data_type, v, format); |         return TempInputTextScalar(frame_bb, id, label, data_type, p_data, format); | ||||||
|  |  | ||||||
|     // Draw frame |     // Draw frame | ||||||
|     const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); |     const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); | ||||||
| @@ -2562,7 +2566,7 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co | |||||||
|  |  | ||||||
|     // Slider behavior |     // Slider behavior | ||||||
|     ImRect grab_bb; |     ImRect grab_bb; | ||||||
|     const bool value_changed = SliderBehavior(frame_bb, id, data_type, v, v_min, v_max, format, power, ImGuiSliderFlags_None, &grab_bb); |     const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, power, ImGuiSliderFlags_None, &grab_bb); | ||||||
|     if (value_changed) |     if (value_changed) | ||||||
|         MarkItemEdited(id); |         MarkItemEdited(id); | ||||||
|  |  | ||||||
| @@ -2572,7 +2576,7 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co | |||||||
|  |  | ||||||
|     // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. |     // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. | ||||||
|     char value_buf[64]; |     char value_buf[64]; | ||||||
|     const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format); |     const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); | ||||||
|     RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.5f)); |     RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.5f)); | ||||||
|  |  | ||||||
|     if (label_size.x > 0.0f) |     if (label_size.x > 0.0f) | ||||||
| @@ -2668,7 +2672,7 @@ bool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const | |||||||
|     return SliderScalarN(label, ImGuiDataType_S32, v, 4, &v_min, &v_max, format); |     return SliderScalarN(label, ImGuiDataType_S32, v, 4, &v_min, &v_max, format); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power) | bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power) | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|     if (window->SkipItems) |     if (window->SkipItems) | ||||||
| @@ -2708,7 +2712,7 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d | |||||||
|  |  | ||||||
|     // Slider behavior |     // Slider behavior | ||||||
|     ImRect grab_bb; |     ImRect grab_bb; | ||||||
|     const bool value_changed = SliderBehavior(frame_bb, id, data_type, v, v_min, v_max, format, power, ImGuiSliderFlags_Vertical, &grab_bb); |     const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, power, ImGuiSliderFlags_Vertical, &grab_bb); | ||||||
|     if (value_changed) |     if (value_changed) | ||||||
|         MarkItemEdited(id); |         MarkItemEdited(id); | ||||||
|  |  | ||||||
| @@ -2719,7 +2723,7 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d | |||||||
|     // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. |     // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. | ||||||
|     // For the vertical slider we allow centered text to overlap the frame padding |     // For the vertical slider we allow centered text to overlap the frame padding | ||||||
|     char value_buf[64]; |     char value_buf[64]; | ||||||
|     const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format); |     const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); | ||||||
|     RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.0f)); |     RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.0f)); | ||||||
|     if (label_size.x > 0.0f) |     if (label_size.x > 0.0f) | ||||||
|         RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); |         RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); | ||||||
| @@ -2832,7 +2836,7 @@ int ImParseFormatPrecision(const char* fmt, int default_precision) | |||||||
|  |  | ||||||
| // Create text input in place of another active widget (e.g. used when doing a CTRL+Click on drag/slider widgets) | // Create text input in place of another active widget (e.g. used when doing a CTRL+Click on drag/slider widgets) | ||||||
| // FIXME: Facilitate using this in variety of other situations. | // FIXME: Facilitate using this in variety of other situations. | ||||||
| bool ImGui::TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format) | bool ImGui::TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|  |  | ||||||
| @@ -2845,7 +2849,7 @@ bool ImGui::TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, | |||||||
|     char fmt_buf[32]; |     char fmt_buf[32]; | ||||||
|     char data_buf[32]; |     char data_buf[32]; | ||||||
|     format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf)); |     format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf)); | ||||||
|     DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, data_ptr, format); |     DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format); | ||||||
|     ImStrTrimBlanks(data_buf); |     ImStrTrimBlanks(data_buf); | ||||||
|  |  | ||||||
|     g.CurrentWindow->DC.CursorPos = bb.Min; |     g.CurrentWindow->DC.CursorPos = bb.Min; | ||||||
| @@ -2860,14 +2864,16 @@ bool ImGui::TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, | |||||||
|     } |     } | ||||||
|     if (value_changed) |     if (value_changed) | ||||||
|     { |     { | ||||||
|         value_changed = DataTypeApplyOpFromText(data_buf, g.InputTextState.InitialTextA.Data, data_type, data_ptr, NULL); |         value_changed = DataTypeApplyOpFromText(data_buf, g.InputTextState.InitialTextA.Data, data_type, p_data, NULL); | ||||||
|         if (value_changed) |         if (value_changed) | ||||||
|             MarkItemEdited(id); |             MarkItemEdited(id); | ||||||
|     } |     } | ||||||
|     return value_changed; |     return value_changed; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_ptr, const void* step, const void* step_fast, const char* format, ImGuiInputTextFlags flags) | // Note: p_data, p_step, p_step_fast are _pointers_ to a memory address holding the data. For an Input widget, p_step and p_step_fast are optional. | ||||||
|  | // Read code of e.g. InputFloat(), InputInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. | ||||||
|  | bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|     if (window->SkipItems) |     if (window->SkipItems) | ||||||
| @@ -2880,7 +2886,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p | |||||||
|         format = DataTypeGetInfo(data_type)->PrintFmt; |         format = DataTypeGetInfo(data_type)->PrintFmt; | ||||||
|  |  | ||||||
|     char buf[64]; |     char buf[64]; | ||||||
|     DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, data_ptr, format); |     DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format); | ||||||
|  |  | ||||||
|     bool value_changed = false; |     bool value_changed = false; | ||||||
|     if ((flags & (ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0) |     if ((flags & (ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0) | ||||||
| @@ -2888,7 +2894,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p | |||||||
|     flags |= ImGuiInputTextFlags_AutoSelectAll; |     flags |= ImGuiInputTextFlags_AutoSelectAll; | ||||||
|     flags |= ImGuiInputTextFlags_NoMarkEdited;  // We call MarkItemEdited() ourselve by comparing the actual data rather than the string. |     flags |= ImGuiInputTextFlags_NoMarkEdited;  // We call MarkItemEdited() ourselve by comparing the actual data rather than the string. | ||||||
|  |  | ||||||
|     if (step != NULL) |     if (p_step != NULL) | ||||||
|     { |     { | ||||||
|         const float button_size = GetFrameHeight(); |         const float button_size = GetFrameHeight(); | ||||||
|  |  | ||||||
| @@ -2896,7 +2902,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p | |||||||
|         PushID(label); |         PushID(label); | ||||||
|         SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2)); |         SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2)); | ||||||
|         if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view |         if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view | ||||||
|             value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, data_ptr, format); |             value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, p_data, format); | ||||||
|  |  | ||||||
|         // Step buttons |         // Step buttons | ||||||
|         const ImVec2 backup_frame_padding = style.FramePadding; |         const ImVec2 backup_frame_padding = style.FramePadding; | ||||||
| @@ -2907,13 +2913,13 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p | |||||||
|         SameLine(0, style.ItemInnerSpacing.x); |         SameLine(0, style.ItemInnerSpacing.x); | ||||||
|         if (ButtonEx("-", ImVec2(button_size, button_size), button_flags)) |         if (ButtonEx("-", ImVec2(button_size, button_size), button_flags)) | ||||||
|         { |         { | ||||||
|             DataTypeApplyOp(data_type, '-', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast ? step_fast : step); |             DataTypeApplyOp(data_type, '-', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); | ||||||
|             value_changed = true; |             value_changed = true; | ||||||
|         } |         } | ||||||
|         SameLine(0, style.ItemInnerSpacing.x); |         SameLine(0, style.ItemInnerSpacing.x); | ||||||
|         if (ButtonEx("+", ImVec2(button_size, button_size), button_flags)) |         if (ButtonEx("+", ImVec2(button_size, button_size), button_flags)) | ||||||
|         { |         { | ||||||
|             DataTypeApplyOp(data_type, '+', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast ? step_fast : step); |             DataTypeApplyOp(data_type, '+', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); | ||||||
|             value_changed = true; |             value_changed = true; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -2931,7 +2937,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p | |||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         if (InputText(label, buf, IM_ARRAYSIZE(buf), flags)) |         if (InputText(label, buf, IM_ARRAYSIZE(buf), flags)) | ||||||
|             value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, data_ptr, format); |             value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, p_data, format); | ||||||
|     } |     } | ||||||
|     if (value_changed) |     if (value_changed) | ||||||
|         MarkItemEdited(window->DC.LastItemId); |         MarkItemEdited(window->DC.LastItemId); | ||||||
| @@ -2939,7 +2945,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_p | |||||||
|     return value_changed; |     return value_changed; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* step, const void* step_fast, const char* format, ImGuiInputTextFlags flags) | bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|     if (window->SkipItems) |     if (window->SkipItems) | ||||||
| @@ -2956,10 +2962,10 @@ bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, in | |||||||
|         PushID(i); |         PushID(i); | ||||||
|         if (i > 0) |         if (i > 0) | ||||||
|             SameLine(0, g.Style.ItemInnerSpacing.x); |             SameLine(0, g.Style.ItemInnerSpacing.x); | ||||||
|         value_changed |= InputScalar("", data_type, v, step, step_fast, format, flags); |         value_changed |= InputScalar("", data_type, p_data, p_step, p_step_fast, format, flags); | ||||||
|         PopID(); |         PopID(); | ||||||
|         PopItemWidth(); |         PopItemWidth(); | ||||||
|         v = (void*)((char*)v + type_size); |         p_data = (void*)((char*)p_data + type_size); | ||||||
|     } |     } | ||||||
|     PopID(); |     PopID(); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user