bool SELECTION_TOOL::SanitizeSelection() { std::set<BOARD_ITEM*> rejected; std::set<BOARD_ITEM*> added; if( !m_editModules ) { for( auto item : m_selection ) { if( item->Type() == PCB_PAD_T ) { MODULE* mod = static_cast<MODULE*>( item->GetParent() ); // case 1: module (or its pads) are locked if( mod && ( mod->PadsLocked() || mod->IsLocked() ) ) { rejected.insert( item ); if( !mod->IsLocked() && !mod->IsSelected() ) added.insert( mod ); } // case 2: multi-item selection contains both the module and its pads - remove the pads if( mod && m_selection.Contains( mod ) ) rejected.insert( item ); } } } if( !rejected.empty() ) { for( BOARD_ITEM* item : rejected ) unselect( item ); // Inform other potentially interested tools m_toolMgr->ProcessEvent( UnselectedEvent ); } if( !added.empty() ) { for( BOARD_ITEM* item : added ) select( item ); // Inform other potentially interested tools m_toolMgr->ProcessEvent( UnselectedEvent ); } return true; }