Store group id rather than group

We only need the group storage id for lookup.  Storing the KIID instead
of a copy of the group avoids unneeded overhead

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17175

(cherry picked from commit 7d1adff071)
This commit is contained in:
Seth Hillbrand 2024-02-28 13:23:20 -08:00
parent b8cd337826
commit 6a8d2a7eb3
5 changed files with 47 additions and 10 deletions

View File

@ -213,6 +213,27 @@ EDA_ITEM_FLAGS PICKED_ITEMS_LIST::GetPickerFlags( unsigned aIdx ) const
} }
KIID PICKED_ITEMS_LIST::GetPickedItemGroupId( unsigned aIdx ) const
{
if( aIdx < m_ItemsList.size() )
return m_ItemsList[aIdx].GetGroupId();
return KIID();
}
bool PICKED_ITEMS_LIST::SetPickedItemGroupId( KIID aGroupId, unsigned aIdx )
{
if( aIdx < m_ItemsList.size() )
{
m_ItemsList[aIdx].SetGroupId( aGroupId );
return true;
}
return false;
}
bool PICKED_ITEMS_LIST::SetPickedItem( EDA_ITEM* aItem, unsigned aIdx ) bool PICKED_ITEMS_LIST::SetPickedItem( EDA_ITEM* aItem, unsigned aIdx )
{ {
if( aIdx < m_ItemsList.size() ) if( aIdx < m_ItemsList.size() )

View File

@ -29,6 +29,7 @@
#include <core/typeinfo.h> #include <core/typeinfo.h>
#include <eda_item_flags.h> #include <eda_item_flags.h>
#include <functional> #include <functional>
#include <kiid.h>
#include <vector> #include <vector>
#include <wx/string.h> #include <wx/string.h>
@ -99,6 +100,10 @@ public:
EDA_ITEM* GetLink() const { return m_link; } EDA_ITEM* GetLink() const { return m_link; }
KIID GetGroupId() const { return m_groupId; }
void SetGroupId( KIID aId ) { m_groupId = aId; }
BASE_SCREEN* GetScreen() const { return m_screen; } BASE_SCREEN* GetScreen() const { return m_screen; }
private: private:
@ -116,6 +121,7 @@ private:
* duplicate) m_Item points the duplicate (i.e the old * duplicate) m_Item points the duplicate (i.e the old
* copy of an active item) and m_Link points the active * copy of an active item) and m_Link points the active
* item in schematic */ * item in schematic */
KIID m_groupId; /* Id of the group of items in case this is a group/ungroup command */
BASE_SCREEN* m_screen; /* For new and deleted items the screen the item should BASE_SCREEN* m_screen; /* For new and deleted items the screen the item should
* be added to/removed from. */ * be added to/removed from. */
@ -225,6 +231,12 @@ public:
*/ */
UNDO_REDO GetPickedItemStatus( unsigned int aIdx ) const; UNDO_REDO GetPickedItemStatus( unsigned int aIdx ) const;
/**
* @return The group id of the picked item, or null KIID if does not exist.
* @param aIdx Index of the picked item in the picked list.
*/
KIID GetPickedItemGroupId( unsigned int aIdx ) const;
/** /**
* Return the value of the picker flag. * Return the value of the picker flag.
* *
@ -257,6 +269,15 @@ public:
*/ */
bool SetPickedItemLink( EDA_ITEM* aLink, unsigned aIdx ); bool SetPickedItemLink( EDA_ITEM* aLink, unsigned aIdx );
/**
* Set the group id associated to a given picked item.
*
* @param aId is the group id to associate to the picked item.
* @param aIdx is index of the picker in the picked list.
* @return true if the picker exists, or false if does not exist.
*/
bool SetPickedItemGroupId( KIID aId, unsigned aIdx );
/** /**
* Set the type of undo/redo operation for a given picked item. * Set the type of undo/redo operation for a given picked item.
* *

View File

@ -412,7 +412,7 @@ void BOARD_COMMIT::Push( const wxString& aMessage, int aCommitFlags )
if( !( aCommitFlags & SKIP_UNDO ) ) if( !( aCommitFlags & SKIP_UNDO ) )
{ {
ITEM_PICKER itemWrapper( nullptr, boardItem, UNDO_REDO::UNGROUP ); ITEM_PICKER itemWrapper( nullptr, boardItem, UNDO_REDO::UNGROUP );
itemWrapper.SetLink( MakeImage( group ) ); itemWrapper.SetGroupId( group->m_Uuid );
undoList.PushItem( itemWrapper ); undoList.PushItem( itemWrapper );
} }

View File

@ -2347,7 +2347,7 @@ void EDIT_TOOL::DeleteItems( const PCB_SELECTION& aItems, bool aIsCut )
break; break;
default: default:
wxASSERT_MSG( parentFP == nullptr, wxT( "Try to delete an item living in a footrprint" ) ); wxASSERT_MSG( parentFP == nullptr, wxT( "Try to delete an item living in a footprint" ) );
commit.Remove( board_item ); commit.Remove( board_item );
break; break;
} }

View File

@ -418,8 +418,7 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
{ {
if( PCB_GROUP* group = boardItem->GetParentGroup() ) if( PCB_GROUP* group = boardItem->GetParentGroup() )
{ {
if( !aList->GetPickedItemLink( ii ) ) aList->SetPickedItemGroupId( group->m_Uuid, ii );
aList->SetPickedItemLink( BOARD_COMMIT::MakeImage( group ), ii );
group->RemoveItem( boardItem ); group->RemoveItem( boardItem );
} }
@ -432,12 +431,8 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( eda_item ) ) if( BOARD_ITEM* boardItem = dynamic_cast<BOARD_ITEM*>( eda_item ) )
{ {
PCB_GROUP* group = nullptr; PCB_GROUP* group = dynamic_cast<PCB_GROUP*>(
GetBoard()->GetItem( aList->GetPickedItemGroupId( ii ) ) );
// The link is just a clone of the original parent group; we need to look up
// the UUID in the document to find the real parent.
if( EDA_ITEM* link = aList->GetPickedItemLink( ii ) )
group = dynamic_cast<PCB_GROUP*>( GetBoard()->GetItem( link->m_Uuid ) );
if( group ) if( group )
group->AddItem( boardItem ); group->AddItem( boardItem );