@ -3737,6 +3737,19 @@ void ImGui::PushItemWidth(float 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 ( )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
@ -3751,9 +3764,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.
ImGuiState & g = * GImGui ;
w = - w ;
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 ;
return w ;
@ -5556,28 +5568,18 @@ static bool SliderFloatN(const char* label, float* v, int components, float v_mi
if ( window - > SkipItems )
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 ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; 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 ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
@ -5608,28 +5610,18 @@ static bool SliderIntN(const char* label, int* v, int components, int v_min, int
if ( window - > SkipItems )
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 ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; 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 ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
@ -5803,28 +5795,18 @@ static bool DragFloatN(const char* label, float* v, int components, float v_spee
if ( window - > SkipItems )
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 ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; 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 ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
@ -5866,28 +5848,18 @@ static bool DragIntN(const char* label, int* v, int components, float v_speed, i
if ( window - > SkipItems )
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 ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; 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 ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
ImGui : : PopItemWidth ( ) ;
ImGui : : PopID ( ) ;
ImGui : : TextUnformatted ( label , FindTextDisplayEnd ( label ) ) ;
@ -6846,31 +6818,21 @@ static bool InputFloatN(const char* label, float* v, int components, int decimal
if ( window - > SkipItems )
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 ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; 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 ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
ImGui : : PopItemWidth ( ) ;
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 : : EndGroup ( ) ;
@ -6899,31 +6861,21 @@ static bool InputIntN(const char* label, int* v, int components, ImGuiInputTextF
if ( window - > SkipItems )
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 ;
ImGui : : BeginGroup ( ) ;
ImGui : : PushID ( label ) ;
ImGui: : PushItemWidth ( w_item_one ) ;
PushMultiItemsWidths ( components ) ;
for ( int i = 0 ; i < components ; 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 ) ;
ImGui : : SameLine ( 0 , ( int ) s tyle. ItemInnerSpacing . x ) ;
ImGui : : SameLine ( 0 , ( int ) g . Style . ItemInnerSpacing . x ) ;
ImGui : : PopID ( ) ;
ImGui : : PopItemWidth ( ) ;
}
ImGui : : PopItemWidth ( ) ;
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 : : EndGroup ( ) ;