mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-29 20:21:40 +01:00 
			
		
		
		
	Tables: Better preserve column data (mainly widths) when columns count changes. (#4046) + .ini skips columns with no data.
This commit is contained in:
		| @@ -44,6 +44,7 @@ Other Changes: | ||||
| - Scrolling: Fix mouse wheel axis swap when using SHIFT on macOS (system already does it). (#4010) | ||||
| - Window: Fix IsWindowAppearing() from returning true twice in most cases. (#3982, #1497, #1061) | ||||
| - Tables: Expose TableSetColumnEnabled() in public api. (#3935) | ||||
| - Tables: Better preserve widths when columns count changes. (#4046) | ||||
| - TabBar: Fixed mouse reordering with very fast movements (e.g. crossing multiple tabs in a single | ||||
|   frame and then immediately standling still (would only affect automation/bots). [@rokups] | ||||
| - Drags, Sliders, Inputs: Specifying a NULL format to Float functions default them to "%.3f" to be | ||||
|   | ||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -61,7 +61,7 @@ Index of this file: | ||||
| // Version | ||||
| // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) | ||||
| #define IMGUI_VERSION               "1.83 WIP" | ||||
| #define IMGUI_VERSION_NUM           18203 | ||||
| #define IMGUI_VERSION_NUM           18204 | ||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | ||||
| #define IMGUI_HAS_TABLE | ||||
|  | ||||
|   | ||||
| @@ -470,10 +470,14 @@ bool    ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG | ||||
|     table->MemoryCompacted = false; | ||||
|  | ||||
|     // Setup memory buffer (clear data if columns count changed) | ||||
|     const int stored_size = table->Columns.size(); | ||||
|     if (stored_size != 0 && stored_size != columns_count) | ||||
|     ImGuiTableColumn* old_columns_to_preserve = NULL; | ||||
|     void* old_columns_raw_data = NULL; | ||||
|     const int old_columns_count = table->Columns.size(); | ||||
|     if (old_columns_count != 0 && old_columns_count != columns_count) | ||||
|     { | ||||
|         IM_FREE(table->RawData); | ||||
|         // Attempt to preserve width on column count change (#4046) | ||||
|         old_columns_to_preserve = table->Columns.Data; | ||||
|         old_columns_raw_data = table->RawData; | ||||
|         table->RawData = NULL; | ||||
|     } | ||||
|     if (table->RawData == NULL) | ||||
| @@ -496,14 +500,24 @@ bool    ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG | ||||
|         for (int n = 0; n < columns_count; n++) | ||||
|         { | ||||
|             ImGuiTableColumn* column = &table->Columns[n]; | ||||
|             float width_auto = column->WidthAuto; | ||||
|             *column = ImGuiTableColumn(); | ||||
|             column->WidthAuto = width_auto; | ||||
|             column->IsPreserveWidthAuto = true; // Preserve WidthAuto when reinitializing a live table: not technically necessary but remove a visible flicker | ||||
|             if (old_columns_to_preserve && n < old_columns_count) | ||||
|             { | ||||
|                 // FIXME: We don't attempt to preserve column order in this path. | ||||
|                 *column = old_columns_to_preserve[n]; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 float width_auto = column->WidthAuto; | ||||
|                 *column = ImGuiTableColumn(); | ||||
|                 column->WidthAuto = width_auto; | ||||
|                 column->IsPreserveWidthAuto = true; // Preserve WidthAuto when reinitializing a live table: not technically necessary but remove a visible flicker | ||||
|                 column->IsEnabled = column->IsEnabledNextFrame = true; | ||||
|             } | ||||
|             column->DisplayOrder = table->DisplayOrderToIndex[n] = (ImGuiTableColumnIdx)n; | ||||
|             column->IsEnabled = column->IsEnabledNextFrame = true; | ||||
|         } | ||||
|     } | ||||
|     if (old_columns_raw_data) | ||||
|         IM_FREE(old_columns_raw_data); | ||||
|  | ||||
|     // Load settings | ||||
|     if (table->IsSettingsRequestLoad) | ||||
| @@ -3350,6 +3364,9 @@ static void TableSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandle | ||||
|         for (int column_n = 0; column_n < settings->ColumnsCount; column_n++, column++) | ||||
|         { | ||||
|             // "Column 0  UserID=0x42AD2D21 Width=100 Visible=1 Order=0 Sort=0v" | ||||
|             bool save_column = column->UserID != 0 || save_size || save_visible || save_order || (save_sort && column->SortOrder != -1); | ||||
|             if (!save_column) | ||||
|                 continue; | ||||
|             buf->appendf("Column %-2d", column_n); | ||||
|             if (column->UserID != 0)                    buf->appendf(" UserID=%08X", column->UserID); | ||||
|             if (save_size && column->IsStretch)         buf->appendf(" Weight=%.4f", column->WidthOrWeight); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user