diff --git a/common/dialogs/panel_setup_netclasses.cpp b/common/dialogs/panel_setup_netclasses.cpp index 51beec93f4..6ec366717e 100644 --- a/common/dialogs/panel_setup_netclasses.cpp +++ b/common/dialogs/panel_setup_netclasses.cpp @@ -87,7 +87,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(); @@ -233,6 +235,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(); @@ -276,6 +283,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 ); } @@ -642,6 +653,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 28e8e48a77..cac1c77885 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 ); @@ -96,6 +97,9 @@ private: std::bitset<64> m_shownColumns; int m_lastNetclassGridWidth; + + bool m_sortAsc; + int m_sortCol; }; #endif //PANEL_SETUP_NETCLASSES_H