mirror of
https://github.com/Drezil/imgui.git
synced 2025-03-31 00:12:44 +00:00
Internals: Added ImGuiDataType_Uint32 data type which is usable with InputScalarEx().
This commit is contained in:
parent
7df985bc5c
commit
ed756d474e
55
imgui.cpp
55
imgui.cpp
@ -8443,7 +8443,7 @@ void ImGui::BulletText(const char* fmt, ...)
|
|||||||
|
|
||||||
static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format)
|
static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format)
|
||||||
{
|
{
|
||||||
if (data_type == ImGuiDataType_Int)
|
if (data_type == ImGuiDataType_Int32 || data_type == ImGuiDataType_Uint32)
|
||||||
return ImFormatString(buf, buf_size, format, *(const int*)data_ptr);
|
return ImFormatString(buf, buf_size, format, *(const int*)data_ptr);
|
||||||
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*)data_ptr);
|
||||||
@ -8456,11 +8456,16 @@ static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType da
|
|||||||
static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg1, const void* arg2)
|
static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg1, const void* arg2)
|
||||||
{
|
{
|
||||||
IM_ASSERT(op == '+' || op == '-');
|
IM_ASSERT(op == '+' || op == '-');
|
||||||
if (data_type == ImGuiDataType_Int)
|
if (data_type == ImGuiDataType_Int32)
|
||||||
{
|
{
|
||||||
if (op == '+') *(int*)output = *(const int*)arg1 + *(const int*)arg2;
|
if (op == '+') *(int*)output = *(const int*)arg1 + *(const int*)arg2;
|
||||||
else if (op == '-') *(int*)output = *(const int*)arg1 - *(const int*)arg2;
|
else if (op == '-') *(int*)output = *(const int*)arg1 - *(const int*)arg2;
|
||||||
}
|
}
|
||||||
|
else if (data_type == ImGuiDataType_Uint32)
|
||||||
|
{
|
||||||
|
if (op == '+') *(unsigned int*)output = *(const unsigned int*)arg1 + *(const unsigned int*)arg2;
|
||||||
|
else if (op == '-') *(unsigned int*)output = *(const unsigned int*)arg1 - *(const unsigned int*)arg2;
|
||||||
|
}
|
||||||
else if (data_type == ImGuiDataType_Float)
|
else if (data_type == ImGuiDataType_Float)
|
||||||
{
|
{
|
||||||
if (op == '+') *(float*)output = *(const float*)arg1 + *(const float*)arg2;
|
if (op == '+') *(float*)output = *(const float*)arg1 + *(const float*)arg2;
|
||||||
@ -8476,12 +8481,13 @@ static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void*
|
|||||||
static size_t GDataTypeSize[ImGuiDataType_COUNT] =
|
static size_t GDataTypeSize[ImGuiDataType_COUNT] =
|
||||||
{
|
{
|
||||||
sizeof(int),
|
sizeof(int),
|
||||||
|
sizeof(unsigned int),
|
||||||
sizeof(float),
|
sizeof(float),
|
||||||
sizeof(double)
|
sizeof(double)
|
||||||
};
|
};
|
||||||
|
|
||||||
// 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 though..
|
// NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess..
|
||||||
static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* scalar_format)
|
static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* scalar_format)
|
||||||
{
|
{
|
||||||
while (ImCharIsSpace((unsigned int)*buf))
|
while (ImCharIsSpace((unsigned int)*buf))
|
||||||
@ -8508,7 +8514,9 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
|
|||||||
IM_ASSERT(GDataTypeSize[data_type] <= sizeof(data_backup));
|
IM_ASSERT(GDataTypeSize[data_type] <= sizeof(data_backup));
|
||||||
memcpy(data_backup, data_ptr, GDataTypeSize[data_type]);
|
memcpy(data_backup, data_ptr, GDataTypeSize[data_type]);
|
||||||
|
|
||||||
if (data_type == ImGuiDataType_Int)
|
int arg1i = 0;
|
||||||
|
float arg1f = 0.0f;
|
||||||
|
if (data_type == ImGuiDataType_Int32)
|
||||||
{
|
{
|
||||||
if (!scalar_format)
|
if (!scalar_format)
|
||||||
scalar_format = "%d";
|
scalar_format = "%d";
|
||||||
@ -8517,18 +8525,31 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
|
|||||||
if (op && sscanf(initial_value_buf, scalar_format, &arg0i) < 1)
|
if (op && sscanf(initial_value_buf, scalar_format, &arg0i) < 1)
|
||||||
return false;
|
return false;
|
||||||
// Store operand in a float so we can use fractional value for multipliers (*1.1), but constant always parsed as integer so we can fit big integers (e.g. 2000000003) past float precision
|
// Store operand in a float so we can use fractional value for multipliers (*1.1), but constant always parsed as integer so we can fit big integers (e.g. 2000000003) past float precision
|
||||||
float arg1f = 0.0f;
|
if (op == '+') { if (sscanf(buf, "%d", &arg1i)) *v = (int)(arg0i + arg1i); } // Add (use "+-" to subtract)
|
||||||
if (op == '+') { if (sscanf(buf, "%f", &arg1f) == 1) *v = (int)(arg0i + arg1f); } // Add (use "+-" to subtract)
|
else if (op == '*') { if (sscanf(buf, "%f", &arg1f)) *v = (int)(arg0i * arg1f); } // Multiply
|
||||||
else if (op == '*') { if (sscanf(buf, "%f", &arg1f) == 1) *v = (int)(arg0i * arg1f); } // Multiply
|
else if (op == '/') { if (sscanf(buf, "%f", &arg1f) && arg1f != 0.0f) *v = (int)(arg0i / arg1f); } // Divide
|
||||||
else if (op == '/') { if (sscanf(buf, "%f", &arg1f) == 1 && arg1f != 0.0f) *v = (int)(arg0i / arg1f); }// Divide
|
else { if (sscanf(buf, scalar_format, &arg0i) == 1) *v = arg0i; } // Assign integer constant
|
||||||
else { if (sscanf(buf, scalar_format, &arg0i) == 1) *v = arg0i; } // Assign integer constant
|
}
|
||||||
|
else if (data_type == ImGuiDataType_Uint32)
|
||||||
|
{
|
||||||
|
if (!scalar_format)
|
||||||
|
scalar_format = "%u";
|
||||||
|
ImU32* v = (unsigned int*)data_ptr;
|
||||||
|
ImU32 arg0i = *v;
|
||||||
|
if (op && sscanf(initial_value_buf, scalar_format, &arg0i) < 1)
|
||||||
|
return false;
|
||||||
|
// Store operand in a float so we can use fractional value for multipliers (*1.1), but constant always parsed as integer so we can fit big integers (e.g. 2000000003) past float precision
|
||||||
|
if (op == '+') { if (sscanf(buf, "%d", &arg1i)) *v = (ImU32)(arg0i + arg1f); } // Add (use "+-" to subtract)
|
||||||
|
else if (op == '*') { if (sscanf(buf, "%f", &arg1f)) *v = (ImU32)(arg0i * arg1f); } // Multiply
|
||||||
|
else if (op == '/') { if (sscanf(buf, "%f", &arg1f) && arg1f != 0.0f) *v = (ImU32)(arg0i / arg1f); }// Divide
|
||||||
|
else { if (sscanf(buf, scalar_format, &arg0i) == 1) *v = arg0i; } // Assign integer constant
|
||||||
}
|
}
|
||||||
else if (data_type == ImGuiDataType_Float)
|
else if (data_type == ImGuiDataType_Float)
|
||||||
{
|
{
|
||||||
// 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
|
||||||
scalar_format = "%f";
|
scalar_format = "%f";
|
||||||
float* v = (float*)data_ptr;
|
float* v = (float*)data_ptr;
|
||||||
float arg0f = *v, arg1f = 0.0f;
|
float arg0f = *v;
|
||||||
if (op && sscanf(initial_value_buf, scalar_format, &arg0f) < 1)
|
if (op && sscanf(initial_value_buf, scalar_format, &arg0f) < 1)
|
||||||
return false;
|
return false;
|
||||||
if (sscanf(buf, scalar_format, &arg1f) < 1)
|
if (sscanf(buf, scalar_format, &arg1f) < 1)
|
||||||
@ -8540,9 +8561,9 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
|
|||||||
}
|
}
|
||||||
else if (data_type == ImGuiDataType_Double)
|
else if (data_type == ImGuiDataType_Double)
|
||||||
{
|
{
|
||||||
scalar_format = "%lf";
|
scalar_format = "%lf"; // scanf differentiate float/double unlike printf which forces everything to double because of ellipsis
|
||||||
double* v = (double*)data_ptr;
|
double* v = (double*)data_ptr;
|
||||||
double arg0f = *v, arg1f = 0.0f;
|
double arg0f = *v;
|
||||||
if (op && sscanf(initial_value_buf, scalar_format, &arg0f) < 1)
|
if (op && sscanf(initial_value_buf, scalar_format, &arg0f) < 1)
|
||||||
return false;
|
return false;
|
||||||
if (sscanf(buf, scalar_format, &arg1f) < 1)
|
if (sscanf(buf, scalar_format, &arg1f) < 1)
|
||||||
@ -10558,12 +10579,12 @@ bool ImGui::InputScalarEx(const char* label, ImGuiDataType data_type, void* data
|
|||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
const ImGuiStyle& style = g.Style;
|
const ImGuiStyle& style = g.Style;
|
||||||
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
const ImVec2 label_size = CalcTextSize(label, NULL, true);
|
||||||
|
const ImVec2 button_size = ImVec2(GetFrameHeight(), GetFrameHeight());
|
||||||
|
|
||||||
BeginGroup();
|
BeginGroup();
|
||||||
PushID(label);
|
PushID(label);
|
||||||
const ImVec2 button_sz = ImVec2(GetFrameHeight(), GetFrameHeight());
|
|
||||||
if (step_ptr)
|
if (step_ptr)
|
||||||
PushItemWidth(ImMax(1.0f, CalcItemWidth() - (button_sz.x + style.ItemInnerSpacing.x)*2));
|
PushItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size.x + style.ItemInnerSpacing.x)*2));
|
||||||
|
|
||||||
char buf[64];
|
char buf[64];
|
||||||
DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, data_ptr, scalar_format);
|
DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, data_ptr, scalar_format);
|
||||||
@ -10580,13 +10601,13 @@ bool ImGui::InputScalarEx(const char* label, ImGuiDataType data_type, void* data
|
|||||||
{
|
{
|
||||||
PopItemWidth();
|
PopItemWidth();
|
||||||
SameLine(0, style.ItemInnerSpacing.x);
|
SameLine(0, style.ItemInnerSpacing.x);
|
||||||
if (ButtonEx("-", button_sz, ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
|
if (ButtonEx("-", button_size, ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
|
||||||
{
|
{
|
||||||
DataTypeApplyOp(data_type, '-', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr);
|
DataTypeApplyOp(data_type, '-', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr);
|
||||||
value_changed = true;
|
value_changed = true;
|
||||||
}
|
}
|
||||||
SameLine(0, style.ItemInnerSpacing.x);
|
SameLine(0, style.ItemInnerSpacing.x);
|
||||||
if (ButtonEx("+", button_sz, ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
|
if (ButtonEx("+", button_size, ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
|
||||||
{
|
{
|
||||||
DataTypeApplyOp(data_type, '+', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr);
|
DataTypeApplyOp(data_type, '+', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr);
|
||||||
value_changed = true;
|
value_changed = true;
|
||||||
@ -10621,7 +10642,7 @@ bool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiIn
|
|||||||
{
|
{
|
||||||
// Hexadecimal input provided as a convenience but the flag name is awkward. Typically you'd use InputText() to parse your own data, if you want to handle prefixes.
|
// Hexadecimal input provided as a convenience but the flag name is awkward. Typically you'd use InputText() to parse your own data, if you want to handle prefixes.
|
||||||
const char* format = (extra_flags & ImGuiInputTextFlags_CharsHexadecimal) ? "%08X" : "%d";
|
const char* format = (extra_flags & ImGuiInputTextFlags_CharsHexadecimal) ? "%08X" : "%d";
|
||||||
return InputScalarEx(label, ImGuiDataType_Int, (void*)v, (void*)(step>0 ? &step : NULL), (void*)(step_fast>0 ? &step_fast : NULL), format, extra_flags);
|
return InputScalarEx(label, ImGuiDataType_Int32, (void*)v, (void*)(step>0 ? &step : NULL), (void*)(step_fast>0 ? &step_fast : NULL), format, extra_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ImGui::InputFloatN(const char* label, float* v, int components, const char* format, ImGuiInputTextFlags extra_flags)
|
bool ImGui::InputFloatN(const char* label, float* v, int components, const char* format, ImGuiInputTextFlags extra_flags)
|
||||||
|
@ -246,7 +246,8 @@ enum ImGuiPlotType
|
|||||||
|
|
||||||
enum ImGuiDataType
|
enum ImGuiDataType
|
||||||
{
|
{
|
||||||
ImGuiDataType_Int,
|
ImGuiDataType_Int32,
|
||||||
|
ImGuiDataType_Uint32,
|
||||||
ImGuiDataType_Float,
|
ImGuiDataType_Float,
|
||||||
ImGuiDataType_Double,
|
ImGuiDataType_Double,
|
||||||
ImGuiDataType_COUNT
|
ImGuiDataType_COUNT
|
||||||
@ -1107,7 +1108,7 @@ namespace ImGui
|
|||||||
IMGUI_API bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
|
IMGUI_API bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
|
||||||
IMGUI_API bool InputFloatN(const char* label, float* v, int components, const char* format, ImGuiInputTextFlags extra_flags);
|
IMGUI_API bool InputFloatN(const char* label, float* v, int components, const char* format, ImGuiInputTextFlags extra_flags);
|
||||||
IMGUI_API bool InputIntN(const char* label, int* v, int components, ImGuiInputTextFlags extra_flags);
|
IMGUI_API bool InputIntN(const char* label, int* v, int components, ImGuiInputTextFlags extra_flags);
|
||||||
IMGUI_API bool InputScalarEx(const char* label, ImGuiDataType data_type, void* data_ptr, void* step_ptr, void* step_fast_ptr, const char* format, ImGuiInputTextFlags extra_flags);
|
IMGUI_API bool InputScalarEx(const char* label, ImGuiDataType data_type, void* data_ptr, void* step_ptr, void* step_fast_ptr, const char* format, ImGuiInputTextFlags extra_flags = 0);
|
||||||
IMGUI_API bool InputScalarAsWidgetReplacement(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format);
|
IMGUI_API bool InputScalarAsWidgetReplacement(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format);
|
||||||
|
|
||||||
IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
|
IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user