pcbnew: Add sorting functionality for netclass assignments

Fixes: https://gitlab.com/kicad/code/kicad/-/issues/18819
This commit is contained in:
Dmitry Rezvanov 2025-04-15 21:32:16 +05:00 committed by Seth Hillbrand
parent 4bc099429c
commit a3fae053c4
2 changed files with 67 additions and 1 deletions

View File

@ -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<std::pair<wxString, wxString>> 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<wxString, wxString>& assign1,
const std::pair<wxString, wxString>& 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 )
{

View File

@ -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