From 71f71641c269c9cce953e75c2c258ad2e2666011 Mon Sep 17 00:00:00 2001 From: Mike Williams Date: Tue, 6 May 2025 10:59:13 -0400 Subject: [PATCH] groups: dialog needs shared_ptr for lifetime issues Tool resets were deleting the commit out from under us. --- common/dialogs/dialog_group_properties.cpp | 13 ++++++------- common/dialogs/dialog_group_properties.h | 5 +++-- common/tool/group_tool.cpp | 2 +- common/tool/group_tool.h | 4 ++-- eeschema/tools/sch_group_tool.h | 2 +- pcbnew/tools/pcb_group_tool.h | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/common/dialogs/dialog_group_properties.cpp b/common/dialogs/dialog_group_properties.cpp index 15afb14c6f..42f15c6ecd 100644 --- a/common/dialogs/dialog_group_properties.cpp +++ b/common/dialogs/dialog_group_properties.cpp @@ -32,9 +32,8 @@ #include -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& 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( ACTIONS::selectItem, m_group->AsEdaItem() ); - m_commit.Push( _( "Edit Group Properties" ) ); + m_commit->Push( _( "Edit Group Properties" ) ); return true; } diff --git a/common/dialogs/dialog_group_properties.h b/common/dialogs/dialog_group_properties.h index c0d34f84b7..00c931f0b0 100644 --- a/common/dialogs/dialog_group_properties.h +++ b/common/dialogs/dialog_group_properties.h @@ -24,6 +24,7 @@ #ifndef DIALOG_GROUP_PROPERTIES_H #define DIALOG_GROUP_PROPERTIES_H +#include #include 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& 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 m_commit; }; #endif // DIALOG_GROUP_PROPERTIES_H diff --git a/common/tool/group_tool.cpp b/common/tool/group_tool.cpp index 66c08b8da6..b21e9a02e1 100644 --- a/common/tool/group_tool.cpp +++ b/common/tool/group_tool.cpp @@ -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 ); diff --git a/common/tool/group_tool.h b/common/tool/group_tool.h index 0ac2c426db..d413087648 100644 --- a/common/tool/group_tool.h +++ b/common/tool/group_tool.h @@ -66,12 +66,12 @@ protected: void setTransitions() override; ///< Subclasses implement to provide correct *_COMMIT object type - virtual std::unique_ptr createCommit() = 0; + virtual std::shared_ptr createCommit() = 0; EDA_DRAW_FRAME* m_frame = nullptr; DIALOG_GROUP_PROPERTIES* m_propertiesDialog = nullptr; SELECTION_TOOL* m_selectionTool = nullptr; - std::unique_ptr m_commit = nullptr; + std::shared_ptr m_commit; bool m_isFootprintEditor = false; }; diff --git a/eeschema/tools/sch_group_tool.h b/eeschema/tools/sch_group_tool.h index aa492c911a..a0b2217ca7 100644 --- a/eeschema/tools/sch_group_tool.h +++ b/eeschema/tools/sch_group_tool.h @@ -13,5 +13,5 @@ public: int Group( const TOOL_EVENT& aEvent ) override; protected: - std::unique_ptr createCommit() override { return std::make_unique( m_toolMgr ); } + std::shared_ptr createCommit() override { return std::make_shared( m_toolMgr ); } }; diff --git a/pcbnew/tools/pcb_group_tool.h b/pcbnew/tools/pcb_group_tool.h index a9ccc70d58..a71331f7ab 100644 --- a/pcbnew/tools/pcb_group_tool.h +++ b/pcbnew/tools/pcb_group_tool.h @@ -13,5 +13,5 @@ public: int Group( const TOOL_EVENT& aEvent ) override; protected: - std::unique_ptr createCommit() override { return std::make_unique( this ); } + std::shared_ptr createCommit() override { return std::make_shared( this ); } };