From 2cfcb2b9fb6b410f8447ae0e32317d5f962717be Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Sun, 25 Nov 2018 08:30:51 -0800 Subject: [PATCH] SELECTION: Allow RequestSelection() to add items The client filter might add items in the case where locked pads are filtered. We need to handle this case when requesting selection by adding new items to the m_selection Fixes: lp:1802686 * https://bugs.launchpad.net/kicad/+bug/1802686 --- pcbnew/tools/selection_tool.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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(); }