SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibTree( const SCHLIB_FILTER* aFilter, std::vector<COMPONENT_SELECTION>& aHistoryList, bool aAllowBrowser, int aUnit, int aConvert, bool aShowFootprints, const LIB_ID* aHighlight, bool aAllowFields ) { 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. if( !dialogLock.try_lock() ) return COMPONENT_SELECTION(); auto adapterPtr( SYMBOL_TREE_MODEL_ADAPTER::Create( libs ) ); auto adapter = static_cast<SYMBOL_TREE_MODEL_ADAPTER*>( adapterPtr.get() ); bool loaded = false; if( aFilter ) { const wxArrayString& liblist = aFilter->GetAllowedLibList(); for( unsigned ii = 0; ii < liblist.GetCount(); ii++ ) { if( libs->HasLibrary( liblist[ii], true ) ) { loaded = true; adapter->AddLibrary( liblist[ii] ); } } adapter->AssignIntrinsicRanks(); if( aFilter->GetFilterPowerParts() ) adapter->SetFilter( SYMBOL_TREE_MODEL_ADAPTER::CMP_FILTER_POWER ); } std::vector< LIB_TREE_ITEM* > history_list; for( auto const& i : aHistoryList ) { LIB_ALIAS* alias = GetLibAlias( i.LibId ); if( alias ) history_list.push_back( alias ); } adapter->DoAddLibrary( "-- " + _( "Recently Used" ) + " --", wxEmptyString, history_list, true ); if( !aHistoryList.empty() ) adapter->SetPreselectNode( aHistoryList[0].LibId, aHistoryList[0].Unit ); const std::vector< wxString > libNicknames = libs->GetLogicalLibs(); if( !loaded ) adapter->AddLibraries( libNicknames, this ); if( aHighlight && aHighlight->IsValid() ) adapter->SetPreselectNode( *aHighlight, /* aUnit */ 0 ); if( adapter->GetFilter() == SYMBOL_TREE_MODEL_ADAPTER::CMP_FILTER_POWER ) dialogTitle.Printf( _( "Choose Power Symbol (%d items loaded)" ), adapter->GetItemCount() ); else dialogTitle.Printf( _( "Choose Symbol (%d items loaded)" ), adapter->GetItemCount() ); DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapterPtr, aConvert, aAllowFields, aShowFootprints, aAllowBrowser ); if( dlg.ShowQuasiModal() == wxID_CANCEL ) return COMPONENT_SELECTION(); COMPONENT_SELECTION sel; LIB_ID id = dlg.GetSelectedLibId( &sel.Unit ); if( dlg.IsExternalBrowserSelected() ) // User requested component browser. { sel = SelectComponentFromLibBrowser( this, aFilter, id, sel.Unit, sel.Convert ); id = sel.LibId; } if( !id.IsValid() ) // Dialog closed by OK button, // or the selection by lib browser was requested, // but no symbol selected return COMPONENT_SELECTION(); if( sel.Unit == 0 ) sel.Unit = 1; sel.Fields = dlg.GetFields(); sel.LibId = id; if( sel.LibId.IsValid() ) { aHistoryList.erase( std::remove_if( aHistoryList.begin(), aHistoryList.end(), [ &sel ]( COMPONENT_SELECTION const& i ){ return i.LibId == sel.LibId; } ), aHistoryList.end() ); aHistoryList.insert( aHistoryList.begin(), sel ); } return sel; }
void LIB_EDIT_FRAME::DeleteOnePart( wxCommandEvent& event ) { wxString cmp_name; LIB_ALIAS* libEntry; wxArrayString nameList; wxString msg; m_canvas->EndMouseCapture( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor() ); m_lastDrawItem = NULL; m_drawItem = NULL; LIB_PART *part = GetCurPart(); PART_LIB* lib = GetCurLib(); if( !lib ) { SelectActiveLibrary(); lib = GetCurLib(); if( !lib ) { DisplayError( this, _( "Please select a component library." ) ); return; } } auto adapter( CMP_TREE_MODEL_ADAPTER::Create( Prj().SchLibs() ) ); wxString name = part ? part->GetName() : wxString( wxEmptyString ); adapter->SetPreselectNode( name, /* aUnit */ 0 ); adapter->ShowUnits( false ); adapter->AddLibrary( *lib ); wxString dialogTitle; dialogTitle.Printf( _( "Delete Component (%u items loaded)" ), adapter->GetComponentsCount() ); DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapter, m_convert ); if( dlg.ShowModal() == wxID_CANCEL ) { return; } libEntry = dlg.GetSelectedAlias( NULL ); if( !libEntry ) { msg.Printf( _( "Entry '%s' not found in library '%s'." ), GetChars( libEntry->GetName() ), GetChars( lib->GetName() ) ); DisplayError( this, msg ); return; } msg.Printf( _( "Delete component '%s' from library '%s' ?" ), GetChars( libEntry->GetName() ), GetChars( lib->GetName() ) ); if( !IsOK( this, msg ) ) return; part = GetCurPart(); if( !part || !part->HasAlias( libEntry->GetName() ) ) { lib->RemoveAlias( libEntry ); m_canvas->Refresh(); return; } // If deleting the current entry or removing one of the aliases for // the current entry, sync the changes in the current entry as well. if( GetScreen()->IsModify() && !IsOK( this, _( "The component being deleted has been modified." " All changes will be lost. Discard changes?" ) ) ) { return; } LIB_ALIAS* nextEntry = lib->RemoveAlias( libEntry ); if( nextEntry != NULL ) { if( LoadOneLibraryPartAux( nextEntry, lib ) ) Zoom_Automatique( false ); } else { SetCurPart( NULL ); // delete CurPart m_aliasName.Empty(); } m_canvas->Refresh(); }