mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Tables: (Breaking change) Sorting: Made it users responsability to clear SpecsDirty back to false, so TableGetSortSpecs() doesn't have side-effect any more. + comments
This commit is contained in:
		@@ -3250,6 +3250,8 @@ struct MyItem
 | 
			
		||||
    // however qsort doesn't allow passing user data to comparing function.
 | 
			
		||||
    // As a workaround, we are storing the sort specs in a static/global for the comparing function to access.
 | 
			
		||||
    // In your own use case you would probably pass the sort specs to your sorting/comparing functions directly and not use a global.
 | 
			
		||||
    // We could technically call ImGui::TableGetSortSpecs() in CompareWithSortSpecs(), but considering that this function is called
 | 
			
		||||
    // very often by the sorting algorithm it would be a little wasteful.
 | 
			
		||||
    static const ImGuiTableSortSpecs* s_current_sort_specs;
 | 
			
		||||
 | 
			
		||||
    // Compare function to be used by qsort()
 | 
			
		||||
@@ -4201,12 +4203,14 @@ static void ShowDemoWindowTables()
 | 
			
		||||
            ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending | ImGuiTableColumnFlags_WidthStretch, -1.0f, MyItemColumnID_Quantity);
 | 
			
		||||
 | 
			
		||||
            // Sort our data if sort specs have been changed!
 | 
			
		||||
            if (const ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs())
 | 
			
		||||
                if (sorts_specs->SpecsChanged && items.Size > 1)
 | 
			
		||||
            if (ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs())
 | 
			
		||||
                if (sorts_specs->SpecsDirty)
 | 
			
		||||
                {
 | 
			
		||||
                    MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function.
 | 
			
		||||
                    qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs);
 | 
			
		||||
                    if (items.Size > 1)
 | 
			
		||||
                        qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs);
 | 
			
		||||
                    MyItem::s_current_sort_specs = NULL;
 | 
			
		||||
                    sorts_specs->SpecsDirty = false;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            // Display data
 | 
			
		||||
@@ -4389,14 +4393,15 @@ static void ShowDemoWindowTables()
 | 
			
		||||
            ImGui::TableSetupColumn("Hidden",      ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort);
 | 
			
		||||
 | 
			
		||||
            // Sort our data if sort specs have been changed!
 | 
			
		||||
            const ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs();
 | 
			
		||||
            if (sorts_specs && sorts_specs->SpecsChanged)
 | 
			
		||||
            ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs();
 | 
			
		||||
            if (sorts_specs && sorts_specs->SpecsDirty)
 | 
			
		||||
                items_need_sort = true;
 | 
			
		||||
            if (sorts_specs && items_need_sort && items.Size > 1)
 | 
			
		||||
            {
 | 
			
		||||
                MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function.
 | 
			
		||||
                qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs);
 | 
			
		||||
                MyItem::s_current_sort_specs = NULL;
 | 
			
		||||
                sorts_specs->SpecsDirty = false;
 | 
			
		||||
            }
 | 
			
		||||
            items_need_sort = false;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user