Confine allow-locked-pad-selection-even-when-filtered to single-select.

Also make sure text in a locked footprint is not selected if the locked
items filter is unset.

Fixes https://gitlab.com/kicad/code/kicad/issues/9227
This commit is contained in:
Jeff Young 2021-09-24 18:57:22 +01:00
parent a1a2076aee
commit bf145dd633
4 changed files with 29 additions and 64 deletions

View File

@ -959,7 +959,7 @@ int BOARD_INSPECTION_TOOL::HighlightItem( const TOOL_EVENT& aEvent )
bool saved = filter.lockedItems; bool saved = filter.lockedItems;
filter.lockedItems = true; filter.lockedItems = true;
selectionTool->FilterCollectedItems( collector ); selectionTool->FilterCollectedItems( collector, true );
filter.lockedItems = saved; filter.lockedItems = saved;

View File

@ -688,7 +688,7 @@ bool PCB_SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag,
aClientFilter( aWhere, collector, this ); aClientFilter( aWhere, collector, this );
// Apply the stateful filter // Apply the stateful filter
FilterCollectedItems( collector ); FilterCollectedItems( collector, false );
FilterCollectorForHierarchy( collector, false ); FilterCollectorForHierarchy( collector, false );
@ -853,7 +853,7 @@ bool PCB_SELECTION_TOOL::selectMultiple()
} }
// Apply the stateful filter // Apply the stateful filter
FilterCollectedItems( collector ); FilterCollectedItems( collector, true );
FilterCollectorForHierarchy( collector, true ); FilterCollectorForHierarchy( collector, true );
@ -978,7 +978,7 @@ int PCB_SELECTION_TOOL::SelectAll( const TOOL_EVENT& aEvent )
{ {
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( item_pair.first ); BOARD_ITEM* item = static_cast<BOARD_ITEM*>( item_pair.first );
if( !item || !Selectable( item ) || !itemPassesFilter( item ) ) if( !item || !Selectable( item ) || !itemPassesFilter( item, true ) )
continue; continue;
collection.Append( item ); collection.Append( item );
@ -1248,7 +1248,7 @@ void PCB_SELECTION_TOOL::selectAllItemsOnNet( int aNetCode, bool aSelect )
for( BOARD_CONNECTED_ITEM* item : connectivity->GetNetItems( aNetCode, types ) ) for( BOARD_CONNECTED_ITEM* item : connectivity->GetNetItems( aNetCode, types ) )
{ {
if( itemPassesFilter( item ) ) if( itemPassesFilter( item, true ) )
aSelect ? select( item ) : unselect( item ); aSelect ? select( item ) : unselect( item );
} }
} }
@ -1591,7 +1591,7 @@ int PCB_SELECTION_TOOL::filterSelection( const TOOL_EVENT& aEvent )
} }
void PCB_SELECTION_TOOL::FilterCollectedItems( GENERAL_COLLECTOR& aCollector ) void PCB_SELECTION_TOOL::FilterCollectedItems( GENERAL_COLLECTOR& aCollector, bool aMultiSelect )
{ {
if( aCollector.GetCount() == 0 ) if( aCollector.GetCount() == 0 )
return; return;
@ -1602,7 +1602,7 @@ void PCB_SELECTION_TOOL::FilterCollectedItems( GENERAL_COLLECTOR& aCollector )
{ {
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( i ); BOARD_ITEM* item = static_cast<BOARD_ITEM*>( i );
if( !itemPassesFilter( item ) ) if( !itemPassesFilter( item, aMultiSelect ) )
rejected.insert( item ); rejected.insert( item );
} }
@ -1611,10 +1611,23 @@ void PCB_SELECTION_TOOL::FilterCollectedItems( GENERAL_COLLECTOR& aCollector )
} }
bool PCB_SELECTION_TOOL::itemPassesFilter( BOARD_ITEM* aItem ) bool PCB_SELECTION_TOOL::itemPassesFilter( BOARD_ITEM* aItem, bool aMultiSelect )
{ {
if( aItem->IsLocked() && !m_filter.lockedItems && aItem->Type() != PCB_PAD_T ) if( !m_filter.lockedItems )
return false; {
if( aItem->IsLocked() || ( aItem->GetParent() && aItem->GetParent()->IsLocked() ) )
{
if( aItem->Type() == PCB_PAD_T && !aMultiSelect )
{
// allow a single pad to be selected -- there are a lot of operations that
// require this so we allow this one inconsistency
}
else
{
return false;
}
}
}
switch( aItem->Type() ) switch( aItem->Type() )
{ {

View File

@ -204,7 +204,7 @@ public:
void FilterCollectorForHierarchy( GENERAL_COLLECTOR& aCollector, bool aMultiselect ) const; void FilterCollectorForHierarchy( GENERAL_COLLECTOR& aCollector, bool aMultiselect ) const;
///< Apply the SELECTION_FILTER_OPTIONS to a collection of items ///< Apply the SELECTION_FILTER_OPTIONS to a collection of items
void FilterCollectedItems( GENERAL_COLLECTOR& aCollector ); void FilterCollectedItems( GENERAL_COLLECTOR& aCollector, bool aMultiSelect );
private: private:
@ -324,7 +324,7 @@ private:
int filterSelection( const TOOL_EVENT& aEvent ); int filterSelection( const TOOL_EVENT& aEvent );
///< Return true if the given item passes the current SELECTION_FILTER_OPTIONS. ///< Return true if the given item passes the current SELECTION_FILTER_OPTIONS.
bool itemPassesFilter( BOARD_ITEM* aItem ); bool itemPassesFilter( BOARD_ITEM* aItem, bool aMultiSelect );
/** /**
* Take necessary action mark an item as unselected. * Take necessary action mark an item as unselected.

View File

@ -283,7 +283,6 @@ PCB_SELECTION_TOOL::PCB_SELECTION_TOOL() :
m_nonModifiedCursor( KICURSOR::ARROW ), m_nonModifiedCursor( KICURSOR::ARROW ),
m_priv( nullptr ) m_priv( nullptr )
{ {
} }
@ -294,33 +293,28 @@ PCB_SELECTION_TOOL::~PCB_SELECTION_TOOL()
bool PCB_SELECTION_TOOL::Init() bool PCB_SELECTION_TOOL::Init()
{ {
return true; return true;
} }
void PCB_SELECTION_TOOL::Reset( RESET_REASON aReason ) void PCB_SELECTION_TOOL::Reset( RESET_REASON aReason )
{ {
} }
int PCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
void PCB_SELECTION_TOOL::EnterGroup() void PCB_SELECTION_TOOL::EnterGroup()
{ {
} }
void PCB_SELECTION_TOOL::ExitGroup( bool aSelectGroup ) void PCB_SELECTION_TOOL::ExitGroup( bool aSelectGroup )
{ {
} }
@ -333,7 +327,6 @@ PCB_SELECTION& PCB_SELECTION_TOOL::GetSelection()
PCB_SELECTION& PCB_SELECTION_TOOL::RequestSelection( CLIENT_SELECTION_FILTER aClientFilter, PCB_SELECTION& PCB_SELECTION_TOOL::RequestSelection( CLIENT_SELECTION_FILTER aClientFilter,
bool aConfirmLockedItems ) bool aConfirmLockedItems )
{ {
return m_selection; return m_selection;
} }
@ -348,43 +341,36 @@ bool PCB_SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag,
bool* aSelectionCancelledFlag, bool* aSelectionCancelledFlag,
CLIENT_SELECTION_FILTER aClientFilter ) CLIENT_SELECTION_FILTER aClientFilter )
{ {
return false; return false;
} }
bool PCB_SELECTION_TOOL::selectCursor( bool aForceSelect, CLIENT_SELECTION_FILTER aClientFilter ) bool PCB_SELECTION_TOOL::selectCursor( bool aForceSelect, CLIENT_SELECTION_FILTER aClientFilter )
{ {
return false; return false;
} }
bool PCB_SELECTION_TOOL::selectMultiple() bool PCB_SELECTION_TOOL::selectMultiple()
{ {
return false; return false;
} }
int PCB_SELECTION_TOOL::CursorSelection( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::CursorSelection( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
int PCB_SELECTION_TOOL::ClearSelection( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::ClearSelection( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
int PCB_SELECTION_TOOL::SelectItems( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::SelectItems( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
@ -397,21 +383,17 @@ int PCB_SELECTION_TOOL::SelectItem( const TOOL_EVENT& aEvent )
int PCB_SELECTION_TOOL::SelectAll( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::SelectAll( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
void PCB_SELECTION_TOOL::AddItemToSel( BOARD_ITEM* aItem, bool aQuietMode ) void PCB_SELECTION_TOOL::AddItemToSel( BOARD_ITEM* aItem, bool aQuietMode )
{ {
} }
int PCB_SELECTION_TOOL::UnselectItems( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::UnselectItems( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
@ -424,7 +406,6 @@ int PCB_SELECTION_TOOL::UnselectItem( const TOOL_EVENT& aEvent )
void PCB_SELECTION_TOOL::RemoveItemFromSel( BOARD_ITEM* aItem, bool aQuietMode ) void PCB_SELECTION_TOOL::RemoveItemFromSel( BOARD_ITEM* aItem, bool aQuietMode )
{ {
} }
@ -438,11 +419,8 @@ void PCB_SELECTION_TOOL::UnbrightenItem( BOARD_ITEM* aItem )
} }
int PCB_SELECTION_TOOL::expandConnection( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::expandConnection( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
@ -450,45 +428,38 @@ int PCB_SELECTION_TOOL::expandConnection( const TOOL_EVENT& aEvent )
void PCB_SELECTION_TOOL::selectConnectedTracks( BOARD_CONNECTED_ITEM& aStartItem, void PCB_SELECTION_TOOL::selectConnectedTracks( BOARD_CONNECTED_ITEM& aStartItem,
STOP_CONDITION aStopCondition ) STOP_CONDITION aStopCondition )
{ {
} }
void PCB_SELECTION_TOOL::selectAllItemsOnNet( int aNetCode, bool aSelect ) void PCB_SELECTION_TOOL::selectAllItemsOnNet( int aNetCode, bool aSelect )
{ {
} }
int PCB_SELECTION_TOOL::selectNet( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::selectNet( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
void PCB_SELECTION_TOOL::selectAllItemsOnSheet( wxString& aSheetPath ) void PCB_SELECTION_TOOL::selectAllItemsOnSheet( wxString& aSheetPath )
{ {
} }
void PCB_SELECTION_TOOL::zoomFitSelection() void PCB_SELECTION_TOOL::zoomFitSelection()
{ {
} }
int PCB_SELECTION_TOOL::selectSheetContents( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::selectSheetContents( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
int PCB_SELECTION_TOOL::selectSameSheet( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::selectSameSheet( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
@ -503,48 +474,39 @@ int PCB_SELECTION_TOOL::selectSameSheet( const TOOL_EVENT& aEvent )
static bool itemIsIncludedByFilter( const BOARD_ITEM& aItem, const BOARD& aBoard, static bool itemIsIncludedByFilter( const BOARD_ITEM& aItem, const BOARD& aBoard,
const DIALOG_FILTER_SELECTION::OPTIONS& aFilterOptions ) const DIALOG_FILTER_SELECTION::OPTIONS& aFilterOptions )
{ {
return false; return false;
} }
int PCB_SELECTION_TOOL::filterSelection( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::filterSelection( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
void PCB_SELECTION_TOOL::FilterCollectedItems( GENERAL_COLLECTOR& aCollector ) void PCB_SELECTION_TOOL::FilterCollectedItems( GENERAL_COLLECTOR& aCollector, bool aMultiSelect )
{ {
} }
bool PCB_SELECTION_TOOL::itemPassesFilter( BOARD_ITEM* aItem ) bool PCB_SELECTION_TOOL::itemPassesFilter( BOARD_ITEM* aItem, bool aMultiSelect )
{ {
return true; return true;
} }
void PCB_SELECTION_TOOL::ClearSelection( bool aQuietMode ) void PCB_SELECTION_TOOL::ClearSelection( bool aQuietMode )
{ {
} }
void PCB_SELECTION_TOOL::RebuildSelection() void PCB_SELECTION_TOOL::RebuildSelection()
{ {
} }
int PCB_SELECTION_TOOL::SelectionMenu( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::SelectionMenu( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
@ -563,49 +525,40 @@ bool PCB_SELECTION_TOOL::Selectable( const BOARD_ITEM* aItem, bool checkVisibili
void PCB_SELECTION_TOOL::select( BOARD_ITEM* aItem ) void PCB_SELECTION_TOOL::select( BOARD_ITEM* aItem )
{ {
} }
void PCB_SELECTION_TOOL::unselect( BOARD_ITEM* aItem ) void PCB_SELECTION_TOOL::unselect( BOARD_ITEM* aItem )
{ {
} }
void PCB_SELECTION_TOOL::highlight( BOARD_ITEM* aItem, int aMode, PCB_SELECTION* aGroup ) void PCB_SELECTION_TOOL::highlight( BOARD_ITEM* aItem, int aMode, PCB_SELECTION* aGroup )
{ {
} }
void PCB_SELECTION_TOOL::highlightInternal( BOARD_ITEM* aItem, int aMode, bool aUsingOverlay ) void PCB_SELECTION_TOOL::highlightInternal( BOARD_ITEM* aItem, int aMode, bool aUsingOverlay )
{ {
} }
void PCB_SELECTION_TOOL::unhighlight( BOARD_ITEM* aItem, int aMode, PCB_SELECTION* aGroup ) void PCB_SELECTION_TOOL::unhighlight( BOARD_ITEM* aItem, int aMode, PCB_SELECTION* aGroup )
{ {
} }
void PCB_SELECTION_TOOL::unhighlightInternal( BOARD_ITEM* aItem, int aMode, bool aUsingOverlay ) void PCB_SELECTION_TOOL::unhighlightInternal( BOARD_ITEM* aItem, int aMode, bool aUsingOverlay )
{ {
} }
bool PCB_SELECTION_TOOL::selectionContains( const VECTOR2I& aPoint ) const bool PCB_SELECTION_TOOL::selectionContains( const VECTOR2I& aPoint ) const
{ {
return false; return false;
} }
void PCB_SELECTION_TOOL::GuessSelectionCandidates( GENERAL_COLLECTOR& aCollector, void PCB_SELECTION_TOOL::GuessSelectionCandidates( GENERAL_COLLECTOR& aCollector,
const VECTOR2I& aWhere ) const const VECTOR2I& aWhere ) const
{ {
} }
@ -613,20 +566,19 @@ void PCB_SELECTION_TOOL::GuessSelectionCandidates( GENERAL_COLLECTOR& aCollector
int PCB_SELECTION_TOOL::updateSelection( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::updateSelection( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
int PCB_SELECTION_TOOL::UpdateMenu( const TOOL_EVENT& aEvent ) int PCB_SELECTION_TOOL::UpdateMenu( const TOOL_EVENT& aEvent )
{ {
return 0; return 0;
} }
void PCB_SELECTION_TOOL::setTransitions() void PCB_SELECTION_TOOL::setTransitions()
{} {
}
void PCB_TOOL_BASE::doInteractiveItemPlacement( const std::string& aTool, void PCB_TOOL_BASE::doInteractiveItemPlacement( const std::string& aTool,
INTERACTIVE_PLACER_BASE* aPlacer, INTERACTIVE_PLACER_BASE* aPlacer,