Lock/unlock group members when locking/unlocking group.
Also moves the stateful selection filter to after the hierarchy filter since the hierarchy filter might swap a pad selection for a footprint selection. Fixes https://gitlab.com/kicad/code/kicad/issues/9255 Fixes https://gitlab.com/kicad/code/kicad/issues/7542
This commit is contained in:
parent
cef5792e78
commit
544fa939f8
|
@ -130,6 +130,8 @@ public:
|
||||||
*/
|
*/
|
||||||
void SetLayerRecursive( PCB_LAYER_ID aLayer, int aDepth );
|
void SetLayerRecursive( PCB_LAYER_ID aLayer, int aDepth );
|
||||||
|
|
||||||
|
void SetLocked( bool aLocked ) override;
|
||||||
|
|
||||||
///< @copydoc EDA_ITEM::Clone
|
///< @copydoc EDA_ITEM::Clone
|
||||||
EDA_ITEM* Clone() const override;
|
EDA_ITEM* Clone() const override;
|
||||||
|
|
||||||
|
|
|
@ -142,6 +142,18 @@ void PCB_GROUP::SetLayerRecursive( PCB_LAYER_ID aLayer, int aDepth )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PCB_GROUP::SetLocked( bool aLockState )
|
||||||
|
{
|
||||||
|
BOARD_ITEM::SetLocked( aLockState );
|
||||||
|
|
||||||
|
RunOnChildren(
|
||||||
|
[&]( BOARD_ITEM* child )
|
||||||
|
{
|
||||||
|
child->SetLocked( aLockState );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
EDA_ITEM* PCB_GROUP::Clone() const
|
EDA_ITEM* PCB_GROUP::Clone() const
|
||||||
{
|
{
|
||||||
// Use copy constructor to get the same uuid and other fields
|
// Use copy constructor to get the same uuid and other fields
|
||||||
|
|
|
@ -254,6 +254,7 @@ int GROUP_TOOL::Group( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
BOARD* board = getModel<BOARD>();
|
BOARD* board = getModel<BOARD>();
|
||||||
PCB_GROUP* group = nullptr;
|
PCB_GROUP* group = nullptr;
|
||||||
|
bool lockGroup = false;
|
||||||
|
|
||||||
if( m_isFootprintEditor )
|
if( m_isFootprintEditor )
|
||||||
{
|
{
|
||||||
|
@ -264,8 +265,15 @@ int GROUP_TOOL::Group( const TOOL_EVENT& aEvent )
|
||||||
group = new PCB_GROUP( parentFootprint );
|
group = new PCB_GROUP( parentFootprint );
|
||||||
parentFootprint->Add( group );
|
parentFootprint->Add( group );
|
||||||
|
|
||||||
for( EDA_ITEM* item : selection )
|
for( EDA_ITEM* eda_item : selection )
|
||||||
group->AddItem( static_cast<BOARD_ITEM*>( item ) );
|
{
|
||||||
|
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( eda_item );
|
||||||
|
|
||||||
|
if( item->IsLocked() )
|
||||||
|
lockGroup = true;
|
||||||
|
|
||||||
|
group->AddItem( item );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -276,15 +284,24 @@ int GROUP_TOOL::Group( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
undoList.PushItem( ITEM_PICKER( nullptr, group, UNDO_REDO::NEWITEM ) );
|
undoList.PushItem( ITEM_PICKER( nullptr, group, UNDO_REDO::NEWITEM ) );
|
||||||
|
|
||||||
for( EDA_ITEM* item : selection )
|
for( EDA_ITEM* eda_item : selection )
|
||||||
{
|
{
|
||||||
|
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( eda_item );
|
||||||
|
|
||||||
|
if( item->IsLocked() )
|
||||||
|
lockGroup = true;
|
||||||
|
|
||||||
group->AddItem( static_cast<BOARD_ITEM*>( item ) );
|
group->AddItem( static_cast<BOARD_ITEM*>( item ) );
|
||||||
|
|
||||||
undoList.PushItem( ITEM_PICKER( nullptr, item, UNDO_REDO::REGROUP ) );
|
undoList.PushItem( ITEM_PICKER( nullptr, item, UNDO_REDO::REGROUP ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
m_frame->SaveCopyInUndoList( undoList, UNDO_REDO::REGROUP );
|
m_frame->SaveCopyInUndoList( undoList, UNDO_REDO::REGROUP );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( lockGroup )
|
||||||
|
group->SetLocked( true );
|
||||||
|
|
||||||
selTool->ClearSelection();
|
selTool->ClearSelection();
|
||||||
selTool->select( group );
|
selTool->select( group );
|
||||||
|
|
||||||
|
|
|
@ -687,11 +687,11 @@ bool PCB_SELECTION_TOOL::selectPoint( const VECTOR2I& aWhere, bool aOnDrag,
|
||||||
if( aClientFilter )
|
if( aClientFilter )
|
||||||
aClientFilter( aWhere, collector, this );
|
aClientFilter( aWhere, collector, this );
|
||||||
|
|
||||||
|
FilterCollectorForHierarchy( collector, false );
|
||||||
|
|
||||||
// Apply the stateful filter
|
// Apply the stateful filter
|
||||||
FilterCollectedItems( collector, false );
|
FilterCollectedItems( collector, false );
|
||||||
|
|
||||||
FilterCollectorForHierarchy( collector, false );
|
|
||||||
|
|
||||||
// Apply some ugly heuristics to avoid disambiguation menus whenever possible
|
// Apply some ugly heuristics to avoid disambiguation menus whenever possible
|
||||||
if( collector.GetCount() > 1 && !m_skip_heuristics )
|
if( collector.GetCount() > 1 && !m_skip_heuristics )
|
||||||
GuessSelectionCandidates( collector, aWhere );
|
GuessSelectionCandidates( collector, aWhere );
|
||||||
|
|
Loading…
Reference in New Issue