From aa69aa63be8744fe6059abd87b9d22709078fb35 Mon Sep 17 00:00:00 2001 From: Dmitry Rezvanov Date: Tue, 15 Apr 2025 21:32:16 +0500 Subject: [PATCH] pcbnew: Add sorting functionality for netclass assignments Fixes: https://gitlab.com/kicad/code/kicad/-/issues/18819 (cherry picked from commit a3fae053c46941121886f121321135ce0b3b56e1) --- common/dialogs/panel_setup_netclasses.cpp | 64 ++++++++++++++++++++++- include/dialogs/panel_setup_netclasses.h | 4 ++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/common/dialogs/panel_setup_netclasses.cpp b/common/dialogs/panel_setup_netclasses.cpp index 9e4658c853..a238f8cce5 100644 --- a/common/dialogs/panel_setup_netclasses.cpp +++ b/common/dialogs/panel_setup_netclasses.cpp @@ -86,7 +86,9 @@ PANEL_SETUP_NETCLASSES::PANEL_SETUP_NETCLASSES( wxWindow* aParentWindow, EDA_DRA m_netNames( aNetNames ), m_lastCheckedTicker( 0 ), m_hoveredCol( -1 ), - m_lastNetclassGridWidth( -1 ) + m_lastNetclassGridWidth( -1 ), + m_sortAsc( false ), + m_sortCol( 0 ) { // Clear and re-load each time. Language (or darkmode) might have changed. g_lineStyleIcons.clear(); @@ -232,6 +234,11 @@ PANEL_SETUP_NETCLASSES::PANEL_SETUP_NETCLASSES( wxWindow* aParentWindow, EDA_DRA &PANEL_SETUP_NETCLASSES::OnNetclassGridMouseEvent, this ); + // Allow sorting assignments by column + m_assignmentGrid->Connect( + wxEVT_GRID_LABEL_LEFT_CLICK, + wxGridEventHandler( PANEL_SETUP_NETCLASSES::OnNetclassAssignmentSort ), nullptr, this ); + m_frame->Bind( EDA_EVT_UNITS_CHANGED, &PANEL_SETUP_NETCLASSES::onUnitsChanged, this ); m_netclassGrid->EndBatch(); @@ -275,6 +282,10 @@ PANEL_SETUP_NETCLASSES::~PANEL_SETUP_NETCLASSES() wxGridEventHandler( PANEL_SETUP_NETCLASSES::OnNetclassGridCellChanging ), nullptr, this ); + m_assignmentGrid->Disconnect( + wxEVT_GRID_LABEL_LEFT_CLICK, + wxGridEventHandler( PANEL_SETUP_NETCLASSES::OnNetclassAssignmentSort ), nullptr, this ); + m_frame->Unbind( EDA_EVT_UNITS_CHANGED, &PANEL_SETUP_NETCLASSES::onUnitsChanged, this ); } @@ -617,6 +628,57 @@ void PANEL_SETUP_NETCLASSES::OnNetclassGridCellChanging( wxGridEvent& event ) } } +void PANEL_SETUP_NETCLASSES::OnNetclassAssignmentSort( wxGridEvent& event ) +{ + event.Skip(); + + if( !m_assignmentGrid->CommitPendingChanges() ) + return; + + if( ( event.GetCol() < 0 ) || ( event.GetCol() >= m_assignmentGrid->GetNumberCols() ) ) + return; + + // Toggle sort order if the same column is clicked + if( event.GetCol() != m_sortCol ) + { + m_sortCol = event.GetCol(); + m_sortAsc = true; + } + else + { + m_sortAsc = !m_sortAsc; + } + + std::vector> netclassesassignments; + netclassesassignments.reserve( m_assignmentGrid->GetNumberRows() ); + + for( int row = 0; row < m_assignmentGrid->GetNumberRows(); ++row ) + { + netclassesassignments.emplace_back( m_assignmentGrid->GetCellValue( row, 0 ), + m_assignmentGrid->GetCellValue( row, 1 ) ); + } + + std::sort( netclassesassignments.begin(), netclassesassignments.end(), + [this]( const std::pair& assign1, + const std::pair& assign2 ) + { + const wxString& str1 = ( m_sortCol == 0 ) ? assign1.first : assign1.second; + const wxString& str2 = ( m_sortCol == 0 ) ? assign2.first : assign2.second; + return m_sortAsc ? ( str1 < str2 ) : ( str1 > str2 ); + } ); + + m_assignmentGrid->ClearRows(); + m_assignmentGrid->AppendRows( netclassesassignments.size() ); + + int row = 0; + + for( const auto& [pattern, netclassName] : netclassesassignments ) + { + m_assignmentGrid->SetCellValue( row, 0, pattern ); + m_assignmentGrid->SetCellValue( row, 1, netclassName ); + row++; + } +} void PANEL_SETUP_NETCLASSES::OnNetclassGridMouseEvent( wxMouseEvent& aEvent ) { diff --git a/include/dialogs/panel_setup_netclasses.h b/include/dialogs/panel_setup_netclasses.h index 174f6556ac..172fdeac6e 100644 --- a/include/dialogs/panel_setup_netclasses.h +++ b/include/dialogs/panel_setup_netclasses.h @@ -61,6 +61,7 @@ private: void OnUpdateUI( wxUpdateUIEvent &event ) override; void OnNetclassGridCellChanging( wxGridEvent& event ); void OnNetclassGridMouseEvent( wxMouseEvent& event ); + void OnNetclassAssignmentSort( wxGridEvent& event ); void onUnitsChanged( wxCommandEvent& aEvent ); @@ -95,6 +96,9 @@ private: std::bitset<64> m_shownColumns; int m_lastNetclassGridWidth; + + bool m_sortAsc; + int m_sortCol; }; #endif //PANEL_SETUP_NETCLASSES_H