Eeschema: Fix a subtle bug in SYMBOL_PREVIEW_WIDGET.
The dialog was using a LIB_ALIAS from library cache to show the symbol to the canvas without making a local copy. Unfortunately, the library viewer is doing the same thing. Now the GAL is used in Eeschema, a link to the VIEW used by the GAL canvas is stored in this class. When The selector symbol dialog is used to choose a symbol to display in the Library viewer, a race condition between the Library viewer GAL canvas and the dtor dialog that destroyed this link in the same instancied class. Now, the SYMBOL_PREVIEW_WIDGET used in the dialog works on a local copy of the symbol to display.
This commit is contained in:
parent
c4cd81a906
commit
7985234556
|
@ -603,8 +603,7 @@ void LIB_VIEW_FRAME::ClickOnCmpList( wxCommandEvent& event )
|
||||||
|
|
||||||
void LIB_VIEW_FRAME::SetSelectedComponent( const wxString& aComponentName )
|
void LIB_VIEW_FRAME::SetSelectedComponent( const wxString& aComponentName )
|
||||||
{
|
{
|
||||||
// Aren't component names case sensitive now?
|
if( m_entryName != aComponentName )
|
||||||
if( m_entryName.CmpNoCase( aComponentName ) != 0 )
|
|
||||||
{
|
{
|
||||||
m_entryName = aComponentName;
|
m_entryName = aComponentName;
|
||||||
|
|
||||||
|
@ -621,8 +620,8 @@ void LIB_VIEW_FRAME::SetSelectedComponent( const wxString& aComponentName )
|
||||||
m_selection_changed = false;
|
m_selection_changed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Zoom_Automatique( false );
|
|
||||||
updatePreviewSymbol();
|
updatePreviewSymbol();
|
||||||
|
Zoom_Automatique( false );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,29 +45,31 @@
|
||||||
void LIB_VIEW_FRAME::OnSelectSymbol( wxCommandEvent& aEvent )
|
void LIB_VIEW_FRAME::OnSelectSymbol( wxCommandEvent& aEvent )
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> dialogLock( DIALOG_CHOOSE_COMPONENT::g_Mutex, std::defer_lock );
|
std::unique_lock<std::mutex> dialogLock( DIALOG_CHOOSE_COMPONENT::g_Mutex, std::defer_lock );
|
||||||
wxString dialogTitle;
|
|
||||||
SYMBOL_LIB_TABLE* libs = Prj().SchSymbolLibTable();
|
|
||||||
|
|
||||||
// One CHOOSE_COMPONENT dialog at a time. User probaby can't handle more anyway.
|
// One CHOOSE_COMPONENT dialog at a time. User probaby can't handle more anyway.
|
||||||
if( !dialogLock.try_lock() )
|
if( !dialogLock.try_lock() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Container doing search-as-you-type.
|
// Container doing search-as-you-type.
|
||||||
|
SYMBOL_LIB_TABLE* libs = Prj().SchSymbolLibTable();
|
||||||
auto adapterPtr( SYMBOL_TREE_MODEL_ADAPTER::Create( libs ) );
|
auto adapterPtr( SYMBOL_TREE_MODEL_ADAPTER::Create( libs ) );
|
||||||
auto adapter = static_cast<SYMBOL_TREE_MODEL_ADAPTER*>( adapterPtr.get() );
|
auto adapter = static_cast<SYMBOL_TREE_MODEL_ADAPTER*>( adapterPtr.get() );
|
||||||
|
|
||||||
const auto libNicknames = libs->GetLogicalLibs();
|
const auto libNicknames = libs->GetLogicalLibs();
|
||||||
|
|
||||||
adapter->AddLibraries( libNicknames, this );
|
adapter->AddLibraries( libNicknames, this );
|
||||||
|
|
||||||
|
LIB_ID id;
|
||||||
|
int unit;
|
||||||
|
|
||||||
|
wxString dialogTitle;
|
||||||
dialogTitle.Printf( _( "Choose Symbol (%d items loaded)" ), adapter->GetItemCount() );
|
dialogTitle.Printf( _( "Choose Symbol (%d items loaded)" ), adapter->GetItemCount() );
|
||||||
|
|
||||||
DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapterPtr, m_convert, false, false, false );
|
DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapterPtr, m_convert, false, false, false );
|
||||||
|
|
||||||
if( dlg.ShowQuasiModal() == wxID_CANCEL )
|
if( dlg.ShowQuasiModal() == wxID_CANCEL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int unit;
|
id = dlg.GetSelectedLibId( &unit );
|
||||||
LIB_ID id = dlg.GetSelectedLibId( &unit );
|
|
||||||
|
|
||||||
if( !id.IsValid() )
|
if( !id.IsValid() )
|
||||||
return;
|
return;
|
||||||
|
@ -75,8 +77,6 @@ void LIB_VIEW_FRAME::OnSelectSymbol( wxCommandEvent& aEvent )
|
||||||
SetSelectedLibrary( id.GetLibNickname() );
|
SetSelectedLibrary( id.GetLibNickname() );
|
||||||
SetSelectedComponent( id.GetLibItemName() );
|
SetSelectedComponent( id.GetLibItemName() );
|
||||||
SetUnitAndConvert( unit, 1 );
|
SetUnitAndConvert( unit, 1 );
|
||||||
|
|
||||||
Zoom_Automatique( false );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,8 @@ SYMBOL_PREVIEW_WIDGET::~SYMBOL_PREVIEW_WIDGET()
|
||||||
{
|
{
|
||||||
if( m_previewItem )
|
if( m_previewItem )
|
||||||
m_preview->GetView()->Remove( m_previewItem );
|
m_preview->GetView()->Remove( m_previewItem );
|
||||||
|
|
||||||
|
delete m_previewItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -149,6 +151,7 @@ void SYMBOL_PREVIEW_WIDGET::DisplaySymbol( const LIB_ID& aSymbolID, int aUnit )
|
||||||
if( m_previewItem )
|
if( m_previewItem )
|
||||||
{
|
{
|
||||||
view->Remove( m_previewItem );
|
view->Remove( m_previewItem );
|
||||||
|
delete m_previewItem;
|
||||||
m_previewItem = nullptr;
|
m_previewItem = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,11 +169,11 @@ void SYMBOL_PREVIEW_WIDGET::DisplaySymbol( const LIB_ID& aSymbolID, int aUnit )
|
||||||
// For symbols having a De Morgan body style, use the first style
|
// For symbols having a De Morgan body style, use the first style
|
||||||
settings->m_ShowConvert = part->HasConversion() ? 1 : 0;
|
settings->m_ShowConvert = part->HasConversion() ? 1 : 0;
|
||||||
|
|
||||||
view->Add( alias );
|
m_previewItem = new LIB_ALIAS( *alias, part );
|
||||||
m_previewItem = alias;
|
view->Add( m_previewItem );
|
||||||
|
|
||||||
// Get the symbole size, in internal units
|
// Get the symbole size, in internal units
|
||||||
m_itemBBox = alias->GetPart()->GetUnitBoundingBox( aUnit, 0 );
|
m_itemBBox = part->GetUnitBoundingBox( aUnit, 0 );
|
||||||
|
|
||||||
// Calculate the draw scale to fit the drawing area
|
// Calculate the draw scale to fit the drawing area
|
||||||
fitOnDrawArea();
|
fitOnDrawArea();
|
||||||
|
@ -190,6 +193,7 @@ void SYMBOL_PREVIEW_WIDGET::DisplayPart( LIB_PART* aPart, int aUnit )
|
||||||
if( m_previewItem )
|
if( m_previewItem )
|
||||||
{
|
{
|
||||||
view->Remove( m_previewItem );
|
view->Remove( m_previewItem );
|
||||||
|
delete m_previewItem;
|
||||||
m_previewItem = nullptr;
|
m_previewItem = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,9 +207,8 @@ void SYMBOL_PREVIEW_WIDGET::DisplayPart( LIB_PART* aPart, int aUnit )
|
||||||
// For symbols having a De Morgan body style, use the first style
|
// For symbols having a De Morgan body style, use the first style
|
||||||
auto settings = static_cast<KIGFX::SCH_RENDER_SETTINGS*>( view->GetPainter()->GetSettings() );
|
auto settings = static_cast<KIGFX::SCH_RENDER_SETTINGS*>( view->GetPainter()->GetSettings() );
|
||||||
settings->m_ShowConvert = aPart->HasConversion() ? 1 : 0;
|
settings->m_ShowConvert = aPart->HasConversion() ? 1 : 0;
|
||||||
|
m_previewItem = new LIB_PART( *aPart );
|
||||||
view->Add( aPart );
|
view->Add( m_previewItem );
|
||||||
m_previewItem = aPart;
|
|
||||||
|
|
||||||
// Get the symbole size, in internal units
|
// Get the symbole size, in internal units
|
||||||
m_itemBBox = aPart->GetUnitBoundingBox( aUnit, 0 );
|
m_itemBBox = aPart->GetUnitBoundingBox( aUnit, 0 );
|
||||||
|
|
|
@ -75,8 +75,12 @@ private:
|
||||||
wxStaticText* m_status;
|
wxStaticText* m_status;
|
||||||
wxSizer* m_statusSizer;
|
wxSizer* m_statusSizer;
|
||||||
|
|
||||||
|
/** a local copy of the LIB_ALIAS or the LIB_PART to display on the canvas
|
||||||
|
*/
|
||||||
EDA_ITEM* m_previewItem;
|
EDA_ITEM* m_previewItem;
|
||||||
BOX2I m_itemBBox; // The size of the current item
|
|
||||||
|
/// The bounding box of the current item
|
||||||
|
BOX2I m_itemBBox;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue