groups: dialog needs shared_ptr for lifetime issues

Tool resets were deleting the commit out from under us.
This commit is contained in:
Mike Williams 2025-05-06 10:59:13 -04:00
parent 9ca881112b
commit 71f71641c2
6 changed files with 14 additions and 14 deletions

View File

@ -32,9 +32,8 @@
#include <dialogs/dialog_group_properties.h>
DIALOG_GROUP_PROPERTIES::DIALOG_GROUP_PROPERTIES( EDA_DRAW_FRAME* aParent,
EDA_GROUP* aGroup,
COMMIT& aCommit ) :
DIALOG_GROUP_PROPERTIES::DIALOG_GROUP_PROPERTIES( EDA_DRAW_FRAME* aParent, EDA_GROUP* aGroup,
const std::shared_ptr<COMMIT>& aCommit ) :
DIALOG_GROUP_PROPERTIES_BASE( aParent ),
m_frame( aParent ),
m_toolMgr( aParent->GetToolManager() ),
@ -82,7 +81,7 @@ bool DIALOG_GROUP_PROPERTIES::TransferDataToWindow()
bool DIALOG_GROUP_PROPERTIES::TransferDataFromWindow()
{
m_commit.Modify( m_group->AsEdaItem(), m_frame->GetScreen() );
m_commit->Modify( m_group->AsEdaItem(), m_frame->GetScreen() );
for( size_t ii = 0; ii < m_membersList->GetCount(); ++ii )
{
@ -91,10 +90,10 @@ bool DIALOG_GROUP_PROPERTIES::TransferDataFromWindow()
if( existingGroup != m_group )
{
m_commit.Modify( item, m_frame->GetScreen() );
m_commit->Modify( item, m_frame->GetScreen() );
if( existingGroup )
m_commit.Modify( existingGroup->AsEdaItem(), m_frame->GetScreen() );
m_commit->Modify( existingGroup->AsEdaItem(), m_frame->GetScreen() );
}
}
@ -112,7 +111,7 @@ bool DIALOG_GROUP_PROPERTIES::TransferDataFromWindow()
m_toolMgr->RunAction<EDA_ITEM*>( ACTIONS::selectItem, m_group->AsEdaItem() );
m_commit.Push( _( "Edit Group Properties" ) );
m_commit->Push( _( "Edit Group Properties" ) );
return true;
}

View File

@ -24,6 +24,7 @@
#ifndef DIALOG_GROUP_PROPERTIES_H
#define DIALOG_GROUP_PROPERTIES_H
#include <memory>
#include <dialogs/dialog_group_properties_base.h>
class EDA_DRAW_FRAME;
@ -37,7 +38,7 @@ class BASE_SCREEN;
class DIALOG_GROUP_PROPERTIES : public DIALOG_GROUP_PROPERTIES_BASE
{
public:
DIALOG_GROUP_PROPERTIES( EDA_DRAW_FRAME* aParent, EDA_GROUP* aTarget, COMMIT& aCommit );
DIALOG_GROUP_PROPERTIES( EDA_DRAW_FRAME* aParent, EDA_GROUP* aTarget, const std::shared_ptr<COMMIT>& aCommit );
~DIALOG_GROUP_PROPERTIES() override;
void OnMemberSelected( wxCommandEvent& event ) override;
@ -53,7 +54,7 @@ private:
EDA_DRAW_FRAME* m_frame;
TOOL_MANAGER* m_toolMgr;
EDA_GROUP* m_group;
COMMIT& m_commit;
std::shared_ptr<COMMIT> m_commit;
};
#endif // DIALOG_GROUP_PROPERTIES_H

View File

@ -128,7 +128,7 @@ int GROUP_TOOL::GroupProperties( const TOOL_EVENT& aEvent )
if( m_propertiesDialog )
m_propertiesDialog->Destroy();
m_propertiesDialog = new DIALOG_GROUP_PROPERTIES( m_frame, group, *m_commit );
m_propertiesDialog = new DIALOG_GROUP_PROPERTIES( m_frame, group, m_commit );
m_propertiesDialog->Show( true );

View File

@ -66,12 +66,12 @@ protected:
void setTransitions() override;
///< Subclasses implement to provide correct *_COMMIT object type
virtual std::unique_ptr<COMMIT> createCommit() = 0;
virtual std::shared_ptr<COMMIT> createCommit() = 0;
EDA_DRAW_FRAME* m_frame = nullptr;
DIALOG_GROUP_PROPERTIES* m_propertiesDialog = nullptr;
SELECTION_TOOL* m_selectionTool = nullptr;
std::unique_ptr<COMMIT> m_commit = nullptr;
std::shared_ptr<COMMIT> m_commit;
bool m_isFootprintEditor = false;
};

View File

@ -13,5 +13,5 @@ public:
int Group( const TOOL_EVENT& aEvent ) override;
protected:
std::unique_ptr<COMMIT> createCommit() override { return std::make_unique<SCH_COMMIT>( m_toolMgr ); }
std::shared_ptr<COMMIT> createCommit() override { return std::make_shared<SCH_COMMIT>( m_toolMgr ); }
};

View File

@ -13,5 +13,5 @@ public:
int Group( const TOOL_EVENT& aEvent ) override;
protected:
std::unique_ptr<COMMIT> createCommit() override { return std::make_unique<BOARD_COMMIT>( this ); }
std::shared_ptr<COMMIT> createCommit() override { return std::make_shared<BOARD_COMMIT>( this ); }
};