@ -3858,6 +3858,19 @@ void ImGui::PushItemWidth(float item_width)
window - > DC . ItemWidth . push_back ( item_width = = 0.0f ? window - > ItemWidthDefault : item_width ) ;
window - > DC . ItemWidth . push_back ( item_width = = 0.0f ? window - > ItemWidthDefault : item_width ) ;
}
}
static void PushMultiItemsWidths ( int components , float w_full = 0.0f )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
const ImGuiStyle & style = GImGui - > Style ;
if ( w_full < = 0.0f )
w_full = ImGui : : CalcItemWidth ( ) ;
const float w_item_one = ImMax ( 1.0f , ( float ) ( int ) ( ( w_full - ( style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) / ( float ) components ) ) ;
const float w_item_last = ImMax ( 1.0f , ( float ) ( int ) ( w_full - ( w_item_one + style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) ) ;
window - > DC . ItemWidth . push_back ( w_item_last ) ;
for ( int i = 0 ; i < components - 1 ; i + + )
window - > DC . ItemWidth . push_back ( w_item_one ) ;
}
void ImGui : : PopItemWidth ( )
void ImGui : : PopItemWidth ( )
{
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
@ -3872,9 +3885,8 @@ float ImGui::CalcItemWidth()
{
{
// Align to a right-side limit. We include 1 frame padding in the calculation because this is how the width is always used (we add 2 frame padding to it), but we could move that responsibility to the widget as well.
// Align to a right-side limit. We include 1 frame padding in the calculation because this is how the width is always used (we add 2 frame padding to it), but we could move that responsibility to the widget as well.
ImGuiState & g = * GImGui ;
ImGuiState & g = * GImGui ;
w = - w ;
float width_to_right_edge = window - > Pos . x + ImGui : : GetContentRegionMax ( ) . x - window - > DC . CursorPos . x ;
float width_to_right_edge = window - > Pos . x + ImGui : : GetContentRegionMax ( ) . x - window - > DC . CursorPos . x ;
w = ImMax ( 1.0f , width_to_right_edge - w - g . Style . FramePadding . x * 2.0f ) ;
w = ImMax ( 1.0f , width_to_right_edge + w - g . Style . FramePadding . x * 2.0f ) ;
}
}
w = ( float ) ( int ) w ;
w = ( float ) ( int ) w ;
return w ;
return w ;
@ -5678,28 +5690,18 @@ static bool SliderFloatN(const char* label, float* v, int components, float v_mi
if ( window - > SkipItems )
if ( window - > SkipItems )
return false ;
return false ;
const ImGuiStyle & style = g . Style ;
const float w_full = ImGui : : CalcItemWidth ( ) ;
const float w_item_one = ImMax ( 1.0f , ( float ) ( int ) ( ( w_full - ( style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) / ( float ) components ) ) ;
const float w_item_last = ImMax ( 1.0f , ( float ) ( int ) ( w_full - ( w_item_one + style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) ) ;
bool value_changed = false ;
bool value_changed = false ;
ImGui : : BeginGroup ( ) ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; i + + )
for ( int i = 0 ; i < components ; i + + )
{
{
ImGui : : PushID ( i ) ;
ImGui : : PushID ( i ) ;
if ( i + 1 = = components )
{
ImGui : : PopItemWidth ( ) ;
ImGui : : PushItemWidth ( w_item_last ) ;
}
value_changed | = ImGui : : SliderFloat ( " ##v " , & v [ i ] , v_min , v_max , display_format , power ) ;
value_changed | = ImGui : : SliderFloat ( " ##v " , & v [ i ] , v_min , v_max , display_format , power ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
@ -5730,28 +5732,18 @@ static bool SliderIntN(const char* label, int* v, int components, int v_min, int
if ( window - > SkipItems )
if ( window - > SkipItems )
return false ;
return false ;
const ImGuiStyle & style = g . Style ;
const float w_full = ImGui : : CalcItemWidth ( ) ;
const float w_item_one = ImMax ( 1.0f , ( float ) ( int ) ( ( w_full - ( style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) / ( float ) components ) ) ;
const float w_item_last = ImMax ( 1.0f , ( float ) ( int ) ( w_full - ( w_item_one + style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) ) ;
bool value_changed = false ;
bool value_changed = false ;
ImGui : : BeginGroup ( ) ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; i + + )
for ( int i = 0 ; i < components ; i + + )
{
{
ImGui : : PushID ( i ) ;
ImGui : : PushID ( i ) ;
if ( i + 1 = = components )
{
ImGui : : PopItemWidth ( ) ;
ImGui : : PushItemWidth ( w_item_last ) ;
}
value_changed | = ImGui : : SliderInt ( " ##v " , & v [ i ] , v_min , v_max , display_format ) ;
value_changed | = ImGui : : SliderInt ( " ##v " , & v [ i ] , v_min , v_max , display_format ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
@ -5925,28 +5917,18 @@ static bool DragFloatN(const char* label, float* v, int components, float v_spee
if ( window - > SkipItems )
if ( window - > SkipItems )
return false ;
return false ;
const ImGuiStyle & style = g . Style ;
const float w_full = ImGui : : CalcItemWidth ( ) ;
const float w_item_one = ImMax ( 1.0f , ( float ) ( int ) ( ( w_full - ( style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) / ( float ) components ) ) ;
const float w_item_last = ImMax ( 1.0f , ( float ) ( int ) ( w_full - ( w_item_one + style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) ) ;
bool value_changed = false ;
bool value_changed = false ;
ImGui : : BeginGroup ( ) ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; i + + )
for ( int i = 0 ; i < components ; i + + )
{
{
ImGui : : PushID ( i ) ;
ImGui : : PushID ( i ) ;
if ( i + 1 = = components )
{
ImGui : : PopItemWidth ( ) ;
ImGui : : PushItemWidth ( w_item_last ) ;
}
value_changed | = ImGui : : DragFloat ( " ##v " , & v [ i ] , v_speed , v_min , v_max , display_format , power ) ;
value_changed | = ImGui : : DragFloat ( " ##v " , & v [ i ] , v_speed , v_min , v_max , display_format , power ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
@ -5988,28 +5970,18 @@ static bool DragIntN(const char* label, int* v, int components, float v_speed, i
if ( window - > SkipItems )
if ( window - > SkipItems )
return false ;
return false ;
const ImGuiStyle & style = g . Style ;
const float w_full = ImGui : : CalcItemWidth ( ) ;
const float w_item_one = ImMax ( 1.0f , ( float ) ( int ) ( ( w_full - ( style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) / ( float ) components ) ) ;
const float w_item_last = ImMax ( 1.0f , ( float ) ( int ) ( w_full - ( w_item_one + style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) ) ;
bool value_changed = false ;
bool value_changed = false ;
ImGui : : BeginGroup ( ) ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; i + + )
for ( int i = 0 ; i < components ; i + + )
{
{
ImGui : : PushID ( i ) ;
ImGui : : PushID ( i ) ;
if ( i + 1 = = components )
{
ImGui : : PopItemWidth ( ) ;
ImGui : : PushItemWidth ( w_item_last ) ;
}
value_changed | = ImGui : : DragInt ( " ##v " , & v [ i ] , v_speed , v_min , v_max , display_format ) ;
value_changed | = ImGui : : DragInt ( " ##v " , & v [ i ] , v_speed , v_min , v_max , display_format ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
@ -6968,31 +6940,21 @@ static bool InputFloatN(const char* label, float* v, int components, int decimal
if ( window - > SkipItems )
if ( window - > SkipItems )
return false ;
return false ;
const ImGuiStyle & style = g . Style ;
const float w_full = ImGui : : CalcItemWidth ( ) ;
const float w_item_one = ImMax ( 1.0f , ( float ) ( int ) ( ( w_full - ( style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) / ( float ) components ) ) ;
const float w_item_last = ImMax ( 1.0f , ( float ) ( int ) ( w_full - ( w_item_one + style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) ) ;
bool value_changed = false ;
bool value_changed = false ;
ImGui : : BeginGroup ( ) ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; i + + )
for ( int i = 0 ; i < components ; i + + )
{
{
ImGui : : PushID ( i ) ;
ImGui : : PushID ( i ) ;
if ( i + 1 = = components )
{
ImGui : : PopItemWidth ( ) ;
ImGui : : PushItemWidth ( w_item_last ) ;
}
value_changed | = ImGui : : InputFloat ( " ##v " , & v [ i ] , 0 , 0 , decimal_precision , extra_flags ) ;
value_changed | = ImGui : : InputFloat ( " ##v " , & v [ i ] , 0 , 0 , decimal_precision , extra_flags ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
window - > DC . CurrentLineTextBaseOffset = ImMax ( window - > DC . CurrentLineTextBaseOffset , s tyle. FramePadding . y ) ;
window - > DC . CurrentLineTextBaseOffset = ImMax ( window - > DC . CurrentLineTextBaseOffset , g. S tyle. FramePadding . y ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
ImGui : : EndGroup ( ) ;
ImGui : : EndGroup ( ) ;
@ -7021,31 +6983,21 @@ static bool InputIntN(const char* label, int* v, int components, ImGuiInputTextF
if ( window - > SkipItems )
if ( window - > SkipItems )
return false ;
return false ;
const ImGuiStyle & style = g . Style ;
const float w_full = ImGui : : CalcItemWidth ( ) ;
const float w_item_one = ImMax ( 1.0f , ( float ) ( int ) ( ( w_full - ( style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) / ( float ) components ) ) ;
const float w_item_last = ImMax ( 1.0f , ( float ) ( int ) ( w_full - ( w_item_one + style . FramePadding . x * 2.0f + style . ItemInnerSpacing . x ) * ( components - 1 ) ) ) ;
bool value_changed = false ;
bool value_changed = false ;
ImGui : : BeginGroup ( ) ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; i + + )
for ( int i = 0 ; i < components ; i + + )
{
{
ImGui : : PushID ( i ) ;
ImGui : : PushID ( i ) ;
if ( i + 1 = = components )
{
ImGui : : PopItemWidth ( ) ;
ImGui : : PushItemWidth ( w_item_last ) ;
}
value_changed | = ImGui : : InputInt ( " ##v " , & v [ i ] , 0 , 0 , extra_flags ) ;
value_changed | = ImGui : : InputInt ( " ##v " , & v [ i ] , 0 , 0 , extra_flags ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : PopID ( ) ;
window - > DC . CurrentLineTextBaseOffset = ImMax ( window - > DC . CurrentLineTextBaseOffset , s tyle. FramePadding . y ) ;
window - > DC . CurrentLineTextBaseOffset = ImMax ( window - > DC . CurrentLineTextBaseOffset , g. S tyle. FramePadding . y ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
ImGui : : EndGroup ( ) ;
ImGui : : EndGroup ( ) ;