Make sure original part record always has the write library nickname.
Fixes: lp:1804293
* https://bugs.launchpad.net/kicad/+bug/1804293
(cherry picked from commit 023a445e9f
)
This commit is contained in:
parent
82c9e54735
commit
03132cabee
|
@ -359,14 +359,20 @@ LIB_PART* LIB_MANAGER::GetBufferedPart( const wxString& aAlias, const wxString&
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
LIB_ALIAS* alias = symTable()->LoadSymbol( aLibrary, aAlias );
|
LIB_ALIAS* alias = symTable()->LoadSymbol( aLibrary, aAlias );
|
||||||
wxCHECK( alias, nullptr );
|
|
||||||
|
if( alias == nullptr )
|
||||||
|
THROW_IO_ERROR( _( "Symbol not found." ) );
|
||||||
|
|
||||||
bufferedPart = new LIB_PART( *alias->GetPart(), nullptr );
|
bufferedPart = new LIB_PART( *alias->GetPart(), nullptr );
|
||||||
libBuf.CreateBuffer( bufferedPart, new SCH_SCREEN( &m_frame.Kiway() ) );
|
libBuf.CreateBuffer( bufferedPart, new SCH_SCREEN( &m_frame.Kiway() ) );
|
||||||
}
|
}
|
||||||
catch( const IO_ERROR& e )
|
catch( const IO_ERROR& e )
|
||||||
{
|
{
|
||||||
DisplayErrorMessage( &m_frame, wxString::Format( _( "Cannot load "
|
wxString msg = wxString::Format( _( "Error loading symbol \"%s\" from library \"%s\"." ),
|
||||||
"symbol \"%s\" from library \"%s\"" ), aAlias, aLibrary ), e.What() );
|
aAlias,
|
||||||
|
aLibrary);
|
||||||
|
DisplayErrorMessage( &m_frame, msg, e.What() );
|
||||||
|
|
||||||
bufferedPart = nullptr;
|
bufferedPart = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -396,6 +402,8 @@ bool LIB_MANAGER::UpdatePart( LIB_PART* aPart, const wxString& aLibrary )
|
||||||
auto partBuf = libBuf.GetBuffer( aPart->GetName() );
|
auto partBuf = libBuf.GetBuffer( aPart->GetName() );
|
||||||
LIB_PART* partCopy = new LIB_PART( *aPart, nullptr );
|
LIB_PART* partCopy = new LIB_PART( *aPart, nullptr );
|
||||||
|
|
||||||
|
partCopy->SetLibId( LIB_ID( aLibrary, aPart->GetLibId().GetLibItemName() ) );
|
||||||
|
|
||||||
if( partBuf )
|
if( partBuf )
|
||||||
{
|
{
|
||||||
libBuf.UpdateBuffer( partBuf, partCopy );
|
libBuf.UpdateBuffer( partBuf, partCopy );
|
||||||
|
@ -416,14 +424,15 @@ bool LIB_MANAGER::UpdatePart( LIB_PART* aPart, const wxString& aLibrary )
|
||||||
bool LIB_MANAGER::UpdatePartAfterRename( LIB_PART* aPart, const wxString& oldAlias,
|
bool LIB_MANAGER::UpdatePartAfterRename( LIB_PART* aPart, const wxString& oldAlias,
|
||||||
const wxString& aLibrary )
|
const wxString& aLibrary )
|
||||||
{
|
{
|
||||||
// This is essentially a delete/update, but we have to make a copy of the "original"
|
// This is essentially a delete/update.
|
||||||
// LIB_PART from the old buffer to give to the new one.
|
|
||||||
|
|
||||||
LIB_BUFFER& libBuf = getLibraryBuffer( aLibrary );
|
LIB_BUFFER& libBuf = getLibraryBuffer( aLibrary );
|
||||||
auto partBuf = libBuf.GetBuffer( oldAlias );
|
auto partBuf = libBuf.GetBuffer( oldAlias );
|
||||||
wxCHECK( partBuf, false );
|
wxCHECK( partBuf, false );
|
||||||
|
|
||||||
LIB_PART* original = new LIB_PART( *partBuf->GetOriginal() );
|
// Save the original record so it is transferred to the new buffer
|
||||||
|
std::unique_ptr<LIB_PART> original( new LIB_PART( *partBuf->GetOriginal() ) );
|
||||||
|
|
||||||
// Save the screen object, so it is transferred to the new buffer
|
// Save the screen object, so it is transferred to the new buffer
|
||||||
std::unique_ptr<SCH_SCREEN> screen = partBuf->RemoveScreen();
|
std::unique_ptr<SCH_SCREEN> screen = partBuf->RemoveScreen();
|
||||||
|
|
||||||
|
@ -436,7 +445,7 @@ bool LIB_MANAGER::UpdatePartAfterRename( LIB_PART* aPart, const wxString& oldAli
|
||||||
partBuf = libBuf.GetBuffer( aPart->GetName() );
|
partBuf = libBuf.GetBuffer( aPart->GetName() );
|
||||||
partBuf->SetScreen( std::move( screen ) );
|
partBuf->SetScreen( std::move( screen ) );
|
||||||
wxCHECK( partBuf, false );
|
wxCHECK( partBuf, false );
|
||||||
partBuf->SetOriginal( original ); // part buffer takes ownership of pointer
|
partBuf->SetOriginal( original.release() ); // part buffer takes ownership of pointer
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -713,6 +722,13 @@ void LIB_MANAGER::PART_BUFFER::SetPart( LIB_PART* aPart )
|
||||||
wxASSERT( aPart );
|
wxASSERT( aPart );
|
||||||
delete m_part;
|
delete m_part;
|
||||||
m_part = aPart;
|
m_part = aPart;
|
||||||
|
|
||||||
|
// If the part moves libraries then the original moves with it
|
||||||
|
if( m_original->GetLibId().GetLibNickname() != m_part->GetLibId().GetLibNickname() )
|
||||||
|
{
|
||||||
|
m_original->SetLibId( LIB_ID( m_part->GetLibId().GetLibNickname(),
|
||||||
|
m_original->GetLibId().GetLibItemName() ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -722,6 +738,13 @@ void LIB_MANAGER::PART_BUFFER::SetOriginal( LIB_PART* aPart )
|
||||||
wxASSERT( aPart );
|
wxASSERT( aPart );
|
||||||
delete m_original;
|
delete m_original;
|
||||||
m_original = aPart;
|
m_original = aPart;
|
||||||
|
|
||||||
|
// The original is not allowed to have a different library than its part
|
||||||
|
if( m_original->GetLibId().GetLibNickname() != m_part->GetLibId().GetLibNickname() )
|
||||||
|
{
|
||||||
|
m_original->SetLibId( LIB_ID( m_part->GetLibId().GetLibNickname(),
|
||||||
|
m_original->GetLibId().GetLibItemName() ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue