diff --git a/pcbnew/tools/selection_tool.cpp b/pcbnew/tools/selection_tool.cpp index 728fb03905..e0e0e72907 100644 --- a/pcbnew/tools/selection_tool.cpp +++ b/pcbnew/tools/selection_tool.cpp @@ -414,13 +414,31 @@ SELECTION& SELECTION_TOOL::RequestSelection( CLIENT_SELECTION_FILTER aClientFilt aClientFilter( VECTOR2I(), collector ); + /* + * The first step is to find the items that may have been added by the client filter + * This can happen if the locked pads select the module instead + */ + std::vector new_items; + std::set_difference( collector.begin(), collector.end(), m_selection.begin(), m_selection.end(), + std::back_inserter( new_items ) ); + + /** + * The second step is to find the items that were removed by the client filter + */ std::vector diff; std::set_difference( m_selection.begin(), m_selection.end(), collector.begin(), collector.end(), std::back_inserter( diff ) ); + /** + * Once we find the adjustments to m_selection that are required by the client filter, we + * apply them both + */ for( auto item : diff ) unhighlight( static_cast( item ), SELECTED, m_selection ); + for( auto item : new_items ) + highlight( static_cast( item ), SELECTED, m_selection ); + m_frame->GetGalCanvas()->ForceRefresh(); }