Make sure group items get added to commit.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/16705
This commit is contained in:
parent
92ed389ad2
commit
d47a000564
|
@ -198,7 +198,8 @@ public:
|
|||
* Invoke a function on all descendants.
|
||||
* @note This function should not add or remove items.
|
||||
*/
|
||||
virtual void RunOnDescendants( const std::function<void ( BOARD_ITEM* )>& aFunction ) const { }
|
||||
virtual void RunOnDescendants( const std::function<void ( BOARD_ITEM* )>& aFunction,
|
||||
int aDepth = 0 ) const { }
|
||||
|
||||
BOARD_ITEM_CONTAINER* GetParent() const { return (BOARD_ITEM_CONTAINER*) m_parent; }
|
||||
|
||||
|
|
|
@ -1724,8 +1724,13 @@ void FOOTPRINT::RunOnChildren( const std::function<void ( BOARD_ITEM* )>& aFunct
|
|||
}
|
||||
|
||||
|
||||
void FOOTPRINT::RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFunction ) const
|
||||
void FOOTPRINT::RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFunction,
|
||||
int aDepth ) const
|
||||
{
|
||||
// Avoid freezes with infinite recursion
|
||||
if( aDepth > 20 )
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
for( PCB_FIELD* field : m_fields )
|
||||
|
@ -1740,13 +1745,13 @@ void FOOTPRINT::RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFun
|
|||
for( PCB_GROUP* group : m_groups )
|
||||
{
|
||||
aFunction( group );
|
||||
group->RunOnDescendants( aFunction );
|
||||
group->RunOnDescendants( aFunction, aDepth + 1 );
|
||||
}
|
||||
|
||||
for( BOARD_ITEM* drawing : m_drawings )
|
||||
{
|
||||
aFunction( drawing );
|
||||
drawing->RunOnDescendants( aFunction );
|
||||
drawing->RunOnDescendants( aFunction, aDepth + 1 );
|
||||
}
|
||||
}
|
||||
catch( std::bad_function_call& )
|
||||
|
|
|
@ -831,7 +831,8 @@ public:
|
|||
void RunOnChildren( const std::function<void (BOARD_ITEM*)>& aFunction ) const override;
|
||||
|
||||
///< @copydoc BOARD_ITEM::RunOnDescendants
|
||||
void RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFunction ) const override;
|
||||
void RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFunction,
|
||||
int aDepth = 0 ) const override;
|
||||
|
||||
virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
|
||||
|
||||
|
|
|
@ -179,22 +179,6 @@ void PCB_GROUP::SetPosition( const VECTOR2I& aNewpos )
|
|||
}
|
||||
|
||||
|
||||
void PCB_GROUP::SetLayerRecursive( PCB_LAYER_ID aLayer, int aDepth )
|
||||
{
|
||||
for( BOARD_ITEM* item : m_items )
|
||||
{
|
||||
if( ( item->Type() == PCB_GROUP_T ) && ( aDepth > 0 ) )
|
||||
{
|
||||
static_cast<PCB_GROUP*>( item )->SetLayerRecursive( aLayer, aDepth - 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
item->SetLayer( aLayer );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PCB_GROUP::SetLocked( bool aLockState )
|
||||
{
|
||||
BOARD_ITEM::SetLocked( aLockState );
|
||||
|
@ -417,8 +401,13 @@ void PCB_GROUP::RunOnChildren( const std::function<void( BOARD_ITEM* )>& aFuncti
|
|||
}
|
||||
|
||||
|
||||
void PCB_GROUP::RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFunction ) const
|
||||
void PCB_GROUP::RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFunction,
|
||||
int aDepth ) const
|
||||
{
|
||||
// Avoid freezes with infinite recursion
|
||||
if( aDepth > 20 )
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
for( BOARD_ITEM* item : m_items )
|
||||
|
@ -426,7 +415,7 @@ void PCB_GROUP::RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFun
|
|||
aFunction( item );
|
||||
|
||||
if( item->Type() == PCB_GROUP_T )
|
||||
item->RunOnDescendants( aFunction );
|
||||
item->RunOnDescendants( aFunction, aDepth + 1 );
|
||||
}
|
||||
}
|
||||
catch( std::bad_function_call& )
|
||||
|
|
|
@ -125,7 +125,7 @@ public:
|
|||
/// @copydoc BOARD_ITEM::SetLayer
|
||||
void SetLayer( PCB_LAYER_ID aLayer ) override
|
||||
{
|
||||
wxFAIL_MSG( wxT( "groups don't support layer SetLayer" ) );
|
||||
// NOP
|
||||
}
|
||||
|
||||
bool IsOnCopperLayer() const override
|
||||
|
@ -134,12 +134,6 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
/** Set layer for all items within the group.
|
||||
*
|
||||
* To avoid freezes with circular references, the maximum depth is 20 by default.
|
||||
*/
|
||||
void SetLayerRecursive( PCB_LAYER_ID aLayer, int aDepth );
|
||||
|
||||
void SetLocked( bool aLocked ) override;
|
||||
|
||||
/// @copydoc EDA_ITEM::Clone
|
||||
|
@ -203,7 +197,8 @@ public:
|
|||
void RunOnChildren( const std::function<void ( BOARD_ITEM* )>& aFunction ) const override;
|
||||
|
||||
///< @copydoc BOARD_ITEM::RunOnDescendants
|
||||
void RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFunction ) const override;
|
||||
void RunOnDescendants( const std::function<void( BOARD_ITEM* )>& aFunction,
|
||||
int aDepth = 0 ) const override;
|
||||
|
||||
/**
|
||||
* Check if the proposed type can be added to a group
|
||||
|
|
|
@ -638,10 +638,13 @@ int DRAWING_TOOL::InteractivePlaceWithPreview( const TOOL_EVENT& aEvent,
|
|||
|
||||
for( BOARD_ITEM* item : aItems )
|
||||
{
|
||||
if( item->Type() == PCB_GROUP_T )
|
||||
static_cast<PCB_GROUP*>( item )->SetLayerRecursive( destLayer, 200 );
|
||||
else
|
||||
item->SetLayer( destLayer );
|
||||
item->SetLayer( destLayer );
|
||||
|
||||
item->RunOnDescendants(
|
||||
[&]( BOARD_ITEM* descendant )
|
||||
{
|
||||
descendant->SetLayer( destLayer );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -649,6 +652,12 @@ int DRAWING_TOOL::InteractivePlaceWithPreview( const TOOL_EVENT& aEvent,
|
|||
{
|
||||
item->Move( cursorPosition );
|
||||
commit.Add( item );
|
||||
|
||||
item->RunOnDescendants(
|
||||
[&]( BOARD_ITEM* descendant )
|
||||
{
|
||||
commit.Add( descendant );
|
||||
} );
|
||||
}
|
||||
|
||||
commit.Push( wxT( "Placing items" ) );
|
||||
|
|
Loading…
Reference in New Issue