@ -2233,8 +2233,8 @@ static void SetCursorPosYAndSetupDummyPrevLine(float pos_y, float line_height)
ImGuiWindow * window = ImGui : : GetCurrentWindow ( ) ;
ImGuiWindow * window = ImGui : : GetCurrentWindow ( ) ;
window - > DC . CursorPosPrevLine . y = window - > DC . CursorPos . y - line_height ; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage.
window - > DC . CursorPosPrevLine . y = window - > DC . CursorPos . y - line_height ; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage.
window - > DC . PrevLineSize . y = ( line_height - GImGui - > Style . ItemSpacing . y ) ; // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list.
window - > DC . PrevLineSize . y = ( line_height - GImGui - > Style . ItemSpacing . y ) ; // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list.
if ( window - > DC . ColumnsSet )
if ( window - > DC . CurrentC olumns )
window - > DC . ColumnsSet - > LineMinY = window - > DC . CursorPos . y ; // Setting this so that cell Y position are set properly
window - > DC . CurrentC olumns - > LineMinY = window - > DC . CursorPos . y ; // Setting this so that cell Y position are set properly
}
}
// Use case A: Begin() called from constructor with items_height<0, then called again from Sync() in StepNo 1
// Use case A: Begin() called from constructor with items_height<0, then called again from Sync() in StepNo 1
@ -2597,7 +2597,7 @@ ImGuiWindow::~ImGuiWindow()
IM_ASSERT ( DrawList = = & DrawListInst ) ;
IM_ASSERT ( DrawList = = & DrawListInst ) ;
IM_DELETE ( Name ) ;
IM_DELETE ( Name ) ;
for ( int i = 0 ; i ! = ColumnsStorage . Size ; i + + )
for ( int i = 0 ; i ! = ColumnsStorage . Size ; i + + )
ColumnsStorage [ i ] . ~ ImGuiColumnsSet ( ) ;
ColumnsStorage [ i ] . ~ ImGuiColumns ( ) ;
}
}
ImGuiID ImGuiWindow : : GetID ( const char * str , const char * str_end )
ImGuiID ImGuiWindow : : GetID ( const char * str , const char * str_end )
@ -5443,7 +5443,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window - > DC . ItemFlagsStack . resize ( 0 ) ;
window - > DC . ItemFlagsStack . resize ( 0 ) ;
window - > DC . ItemWidthStack . resize ( 0 ) ;
window - > DC . ItemWidthStack . resize ( 0 ) ;
window - > DC . TextWrapPosStack . resize ( 0 ) ;
window - > DC . TextWrapPosStack . resize ( 0 ) ;
window - > DC . ColumnsSet = NULL ;
window - > DC . CurrentC olumns = NULL ;
window - > DC . TreeDepth = 0 ;
window - > DC . TreeDepth = 0 ;
window - > DC . TreeDepthMayJumpToParentOnPop = 0x00 ;
window - > DC . TreeDepthMayJumpToParentOnPop = 0x00 ;
window - > DC . StateStorage = & window - > StateStorage ;
window - > DC . StateStorage = & window - > StateStorage ;
@ -5627,7 +5627,7 @@ void ImGui::End()
ImGuiWindow * window = g . CurrentWindow ;
ImGuiWindow * window = g . CurrentWindow ;
if ( window - > DC . ColumnsSet ! = NULL )
if ( window - > DC . CurrentC olumns ! = NULL )
EndColumns ( ) ;
EndColumns ( ) ;
PopClipRect ( ) ; // Inner window clip rectangle
PopClipRect ( ) ; // Inner window clip rectangle
@ -6348,8 +6348,8 @@ ImVec2 ImGui::GetContentRegionMax()
{
{
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImVec2 mx = window - > ContentsRegionRect . Max - window - > Pos ;
ImVec2 mx = window - > ContentsRegionRect . Max - window - > Pos ;
if ( window - > DC . ColumnsSet )
if ( window - > DC . CurrentC olumns )
mx . x = GetColumnOffset ( window - > DC . ColumnsSet - > Current + 1 ) - window - > WindowPadding . x ;
mx . x = GetColumnOffset ( window - > DC . CurrentC olumns - > Current + 1 ) - window - > WindowPadding . x ;
return mx ;
return mx ;
}
}
@ -8275,11 +8275,11 @@ void ImGui::NavUpdateWindowingList()
void ImGui : : NextColumn ( )
void ImGui : : NextColumn ( )
{
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems | | window - > DC . ColumnsSet = = NULL )
if ( window - > SkipItems | | window - > DC . CurrentC olumns = = NULL )
return ;
return ;
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
ImGuiColumnsSet * columns = window - > DC . ColumnsSet ;
ImGuiColumns * columns = window - > DC . CurrentC olumns ;
if ( columns - > Count = = 1 )
if ( columns - > Count = = 1 )
{
{
@ -8318,28 +8318,28 @@ void ImGui::NextColumn()
int ImGui : : GetColumnIndex ( )
int ImGui : : GetColumnIndex ( )
{
{
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
return window - > DC . ColumnsSet ? window - > DC . ColumnsSet - > Current : 0 ;
return window - > DC . CurrentC olumns ? window - > DC . CurrentC olumns - > Current : 0 ;
}
}
int ImGui : : GetColumnsCount ( )
int ImGui : : GetColumnsCount ( )
{
{
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
return window - > DC . ColumnsSet ? window - > DC . ColumnsSet - > Count : 1 ;
return window - > DC . CurrentC olumns ? window - > DC . CurrentC olumns - > Count : 1 ;
}
}
static float OffsetNormToPixels ( const ImGuiColumnsSet * columns , float offset_norm )
static float OffsetNormToPixels ( const ImGuiColumns * columns , float offset_norm )
{
{
return offset_norm * ( columns - > MaxX - columns - > MinX ) ;
return offset_norm * ( columns - > MaxX - columns - > MinX ) ;
}
}
static float PixelsToOffsetNorm ( const ImGuiColumnsSet * columns , float offset )
static float PixelsToOffsetNorm ( const ImGuiColumns * columns , float offset )
{
{
return offset / ( columns - > MaxX - columns - > MinX ) ;
return offset / ( columns - > MaxX - columns - > MinX ) ;
}
}
static inline float GetColumnsRectHalfWidth ( ) { return 4.0f ; }
static inline float GetColumnsRectHalfWidth ( ) { return 4.0f ; }
static float GetDraggedColumnOffset ( ImGuiColumnsSet * columns , int column_index )
static float GetDraggedColumnOffset ( ImGuiColumns * columns , int column_index )
{
{
// Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing
// Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing
// window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning.
// window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning.
@ -8359,7 +8359,7 @@ static float GetDraggedColumnOffset(ImGuiColumnsSet* columns, int column_index)
float ImGui : : GetColumnOffset ( int column_index )
float ImGui : : GetColumnOffset ( int column_index )
{
{
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiColumnsSet * columns = window - > DC . ColumnsSet ;
ImGuiColumns * columns = window - > DC . CurrentC olumns ;
IM_ASSERT ( columns ! = NULL ) ;
IM_ASSERT ( columns ! = NULL ) ;
if ( column_index < 0 )
if ( column_index < 0 )
@ -8371,7 +8371,7 @@ float ImGui::GetColumnOffset(int column_index)
return x_offset ;
return x_offset ;
}
}
static float GetColumnWidthEx ( ImGuiColumnsSet * columns , int column_index , bool before_resize = false )
static float GetColumnWidthEx ( ImGuiColumns * columns , int column_index , bool before_resize = false )
{
{
if ( column_index < 0 )
if ( column_index < 0 )
column_index = columns - > Current ;
column_index = columns - > Current ;
@ -8387,7 +8387,7 @@ static float GetColumnWidthEx(ImGuiColumnsSet* columns, int column_index, bool b
float ImGui : : GetColumnWidth ( int column_index )
float ImGui : : GetColumnWidth ( int column_index )
{
{
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiColumnsSet * columns = window - > DC . ColumnsSet ;
ImGuiColumns * columns = window - > DC . CurrentC olumns ;
IM_ASSERT ( columns ! = NULL ) ;
IM_ASSERT ( columns ! = NULL ) ;
if ( column_index < 0 )
if ( column_index < 0 )
@ -8399,7 +8399,7 @@ void ImGui::SetColumnOffset(int column_index, float offset)
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
ImGuiWindow * window = g . CurrentWindow ;
ImGuiColumnsSet * columns = window - > DC . ColumnsSet ;
ImGuiColumns * columns = window - > DC . CurrentC olumns ;
IM_ASSERT ( columns ! = NULL ) ;
IM_ASSERT ( columns ! = NULL ) ;
if ( column_index < 0 )
if ( column_index < 0 )
@ -8420,7 +8420,7 @@ void ImGui::SetColumnOffset(int column_index, float offset)
void ImGui : : SetColumnWidth ( int column_index , float width )
void ImGui : : SetColumnWidth ( int column_index , float width )
{
{
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiColumnsSet * columns = window - > DC . ColumnsSet ;
ImGuiColumns * columns = window - > DC . CurrentC olumns ;
IM_ASSERT ( columns ! = NULL ) ;
IM_ASSERT ( columns ! = NULL ) ;
if ( column_index < 0 )
if ( column_index < 0 )
@ -8431,46 +8431,57 @@ void ImGui::SetColumnWidth(int column_index, float width)
void ImGui : : PushColumnClipRect ( int column_index )
void ImGui : : PushColumnClipRect ( int column_index )
{
{
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiWindow * window = GetCurrentWindowRead ( ) ;
ImGuiColumnsSet * columns = window - > DC . ColumnsSet ;
ImGuiColumns * columns = window - > DC . CurrentC olumns ;
if ( column_index < 0 )
if ( column_index < 0 )
column_index = columns - > Current ;
column_index = columns - > Current ;
PushClipRect ( columns - > Columns [ column_index ] . ClipRect . Min , columns - > Columns [ column_index ] . ClipRect . Max , false ) ;
ImGuiColumnData * column = & columns - > Columns [ column_index ] ;
PushClipRect ( column - > ClipRect . Min , column - > ClipRect . Max , false ) ;
}
}
static ImGuiColumnsSet * FindOrAddColumnsSet ( ImGuiWindow * window , ImGuiID id )
ImGuiColumns * ImGui : : FindOrCreateColumns ( ImGuiWindow * window , ImGuiID id )
{
{
// We have few columns per window so for now we don't need bother much with turning this into a faster lookup.
for ( int n = 0 ; n < window - > ColumnsStorage . Size ; n + + )
for ( int n = 0 ; n < window - > ColumnsStorage . Size ; n + + )
if ( window - > ColumnsStorage [ n ] . ID = = id )
if ( window - > ColumnsStorage [ n ] . ID = = id )
return & window - > ColumnsStorage [ n ] ;
return & window - > ColumnsStorage [ n ] ;
window - > ColumnsStorage . push_back ( ImGuiColumnsSet ( ) ) ;
window - > ColumnsStorage . push_back ( ImGuiColumns ( ) ) ;
ImGuiColumnsSet * columns = & window - > ColumnsStorage . back ( ) ;
ImGuiColumns * columns = & window - > ColumnsStorage . back ( ) ;
columns - > ID = id ;
columns - > ID = id ;
return columns ;
return columns ;
}
}
void ImGui : : BeginColumns ( const char * str_id , int columns_count , ImGuiColumnsFlags flags )
ImGuiID ImGui : : GetColumnsID ( const char * str_id , int columns_count )
{
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
IM_ASSERT ( columns_count > = 1 ) ;
IM_ASSERT ( window - > DC . ColumnsSet = = NULL ) ; // Nested columns are currently not supported
// Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget.
// Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget.
// In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer.
// In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer.
PushID ( 0x11223347 + ( str_id ? 0 : columns_count ) ) ;
PushID ( 0x11223347 + ( str_id ? 0 : columns_count ) ) ;
ImGuiID id = window - > GetID ( str_id ? str_id : " columns " ) ;
ImGuiID id = window - > GetID ( str_id ? str_id : " columns " ) ;
PopID ( ) ;
PopID ( ) ;
return id ;
}
void ImGui : : BeginColumns ( const char * str_id , int columns_count , ImGuiColumnsFlags flags )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
IM_ASSERT ( columns_count > = 1 ) ;
IM_ASSERT ( window - > DC . CurrentColumns = = NULL ) ; // Nested columns are currently not supported
ImGuiID id = GetColumnsID ( str_id , columns_count ) ;
// Acquire storage for the columns set
// Acquire storage for the columns set
ImGuiColumnsSet * columns = FindOrAddColumnsSet ( window , id ) ;
ImGuiColumns * columns = FindOrCreateColumns ( window , id ) ;
IM_ASSERT ( columns - > ID = = id ) ;
IM_ASSERT ( columns - > ID = = id ) ;
columns - > Current = 0 ;
columns - > Current = 0 ;
columns - > Count = columns_count ;
columns - > Count = columns_count ;
columns - > Flags = flags ;
columns - > Flags = flags ;
window - > DC . ColumnsSet = columns ;
window - > DC . CurrentC olumns = columns ;
// Set state for first column
// Set state for first column
const float content_region_width = ( window - > SizeContentsExplicit . x ! = 0.0f ) ? ( window - > SizeContentsExplicit . x ) : ( window - > InnerClipRect . Max . x - window - > Pos . x ) ;
const float content_region_width = ( window - > SizeContentsExplicit . x ! = 0.0f ) ? ( window - > SizeContentsExplicit . x ) : ( window - > InnerClipRect . Max . x - window - > Pos . x ) ;
@ -8521,7 +8532,7 @@ void ImGui::EndColumns()
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
ImGuiColumnsSet * columns = window - > DC . ColumnsSet ;
ImGuiColumns * columns = window - > DC . CurrentC olumns ;
IM_ASSERT ( columns ! = NULL ) ;
IM_ASSERT ( columns ! = NULL ) ;
PopItemWidth ( ) ;
PopItemWidth ( ) ;
@ -8582,7 +8593,7 @@ void ImGui::EndColumns()
}
}
columns - > IsBeingResized = is_being_resized ;
columns - > IsBeingResized = is_being_resized ;
window - > DC . ColumnsSet = NULL ;
window - > DC . CurrentC olumns = NULL ;
window - > DC . ColumnsOffset . x = 0.0f ;
window - > DC . ColumnsOffset . x = 0.0f ;
window - > DC . CursorPos . x = ( float ) ( int ) ( window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ) ;
window - > DC . CursorPos . x = ( float ) ( int ) ( window - > Pos . x + window - > DC . Indent . x + window - > DC . ColumnsOffset . x ) ;
}
}
@ -8595,10 +8606,10 @@ void ImGui::Columns(int columns_count, const char* id, bool border)
ImGuiColumnsFlags flags = ( border ? 0 : ImGuiColumnsFlags_NoBorder ) ;
ImGuiColumnsFlags flags = ( border ? 0 : ImGuiColumnsFlags_NoBorder ) ;
//flags |= ImGuiColumnsFlags_NoPreserveWidths; // NB: Legacy behavior
//flags |= ImGuiColumnsFlags_NoPreserveWidths; // NB: Legacy behavior
if ( window - > DC . ColumnsSet ! = NULL & & window - > DC . ColumnsSet - > Count = = columns_count & & window - > DC . ColumnsSet - > Flags = = flags )
if ( window - > DC . CurrentC olumns ! = NULL & & window - > DC . CurrentC olumns - > Count = = columns_count & & window - > DC . CurrentC olumns - > Flags = = flags )
return ;
return ;
if ( window - > DC . ColumnsSet ! = NULL )
if ( window - > DC . CurrentC olumns ! = NULL )
EndColumns ( ) ;
EndColumns ( ) ;
if ( columns_count ! = 1 )
if ( columns_count ! = 1 )
@ -9582,7 +9593,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
{
{
for ( int n = 0 ; n < window - > ColumnsStorage . Size ; n + + )
for ( int n = 0 ; n < window - > ColumnsStorage . Size ; n + + )
{
{
const ImGuiColumnsSet * columns = & window - > ColumnsStorage [ n ] ;
const ImGuiColumns * columns = & window - > ColumnsStorage [ n ] ;
if ( ImGui : : TreeNode ( ( void * ) ( uintptr_t ) columns - > ID , " Columns Id: 0x%08X, Count: %d, Flags: 0x%04X " , columns - > ID , columns - > Count , columns - > Flags ) )
if ( ImGui : : TreeNode ( ( void * ) ( uintptr_t ) columns - > ID , " Columns Id: 0x%08X, Count: %d, Flags: 0x%04X " , columns - > ID , columns - > Count , columns - > Flags ) )
{
{
ImGui : : BulletText ( " Width: %.1f (MinX: %.1f, MaxX: %.1f) " , columns - > MaxX - columns - > MinX , columns - > MinX , columns - > MaxX ) ;
ImGui : : BulletText ( " Width: %.1f (MinX: %.1f, MaxX: %.1f) " , columns - > MaxX - columns - > MinX , columns - > MinX , columns - > MaxX ) ;