mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 02:03:12 +02:00
pcbnew: Add sorting functionality for netclass assignments
Fixes: https://gitlab.com/kicad/code/kicad/-/issues/18819
This commit is contained in:
parent
4bc099429c
commit
a3fae053c4
@ -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 )
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user