Simplify logic when setting field vector
Previous logic could get stuck in infinite loop if removing element from
the middle of the vector
Fixes https://gitlab.com/kicad/code/kicad/-/issues/15498
(cherry picked from commit 9636321c09
)
This commit is contained in:
parent
5d6bb4b04f
commit
4b0416e92a
|
@ -347,19 +347,17 @@ void SCH_SHEET::SwapData( SCH_ITEM* aItem )
|
||||||
void SCH_SHEET::SetFields( const std::vector<SCH_FIELD>& aFields )
|
void SCH_SHEET::SetFields( const std::vector<SCH_FIELD>& aFields )
|
||||||
{
|
{
|
||||||
m_fields = aFields;
|
m_fields = aFields;
|
||||||
int next_id = SHEET_MANDATORY_FIELDS;
|
|
||||||
|
|
||||||
for( int ii = 0; ii < int( m_fields.size() ); )
|
// Ensure that mandatory fields are at the beginning
|
||||||
|
std::sort( m_fields.begin(), m_fields.end(),
|
||||||
|
[]( const SCH_FIELD& a, const SCH_FIELD& b )
|
||||||
{
|
{
|
||||||
if( m_fields[ii].GetId() < 0 || m_fields[ii].GetId() >= ssize_t( m_fields.size() ) )
|
return a.GetId() < b.GetId();
|
||||||
m_fields[ii].SetId( next_id++ );
|
} );
|
||||||
|
|
||||||
if( m_fields[ii].GetId() != ii )
|
// After mandatory fields, the rest should be sequential user fields
|
||||||
std::swap( m_fields[ii], m_fields[m_fields[ii].GetId()]);
|
for( int ii = SHEET_MANDATORY_FIELDS; ii < static_cast<int>( m_fields.size() ); ++ii )
|
||||||
|
m_fields[ii].SetId( ii );
|
||||||
if( m_fields[ii].GetId() == ii )
|
|
||||||
++ii;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure that we get the UNIX variant of the file path
|
// Make sure that we get the UNIX variant of the file path
|
||||||
SetFileName( m_fields[SHEETFILENAME].GetText() );
|
SetFileName( m_fields[SHEETFILENAME].GetText() );
|
||||||
|
|
Loading…
Reference in New Issue