Change the behavior of ACTION_MENU::Add to require clones if required outside the function

Fix https://gitlab.com/kicad/code/kicad/-/issues/10994
This commit is contained in:
Marek Roszko 2022-04-10 22:35:39 -04:00
parent 5bb2cdf73d
commit 403992a6f4
6 changed files with 13 additions and 14 deletions

View File

@ -183,21 +183,20 @@ wxMenuItem* ACTION_MENU::Add( const TOOL_ACTION& aAction, bool aIsCheckmarkEntry
wxMenuItem* ACTION_MENU::Add( ACTION_MENU* aMenu ) wxMenuItem* ACTION_MENU::Add( ACTION_MENU* aMenu )
{ {
ACTION_MENU* menuCopy = aMenu->Clone(); m_submenus.push_back( aMenu );
m_submenus.push_back( menuCopy );
wxASSERT_MSG( !menuCopy->m_title.IsEmpty(), "Set a title for ACTION_MENU using SetTitle()" ); wxASSERT_MSG( !aMenu->m_title.IsEmpty(), "Set a title for ACTION_MENU using SetTitle()" );
if( !!aMenu->m_icon ) if( !!aMenu->m_icon )
{ {
wxMenuItem* newItem = new wxMenuItem( this, -1, menuCopy->m_title ); wxMenuItem* newItem = new wxMenuItem( this, -1, aMenu->m_title );
AddBitmapToMenuItem( newItem, KiBitmap( aMenu->m_icon ) ); AddBitmapToMenuItem( newItem, KiBitmap( aMenu->m_icon ) );
newItem->SetSubMenu( menuCopy ); newItem->SetSubMenu( aMenu );
return Append( newItem ); return Append( newItem );
} }
else else
{ {
return AppendSubMenu( menuCopy, menuCopy->m_title ); return AppendSubMenu( aMenu, aMenu->m_title );
} }
} }

View File

@ -72,7 +72,7 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
fileMenu->Add( ACTIONS::doNew ); fileMenu->Add( ACTIONS::doNew );
fileMenu->Add( ACTIONS::open ); fileMenu->Add( ACTIONS::open );
wxMenuItem* item = fileMenu->Add( openRecentMenu ); wxMenuItem* item = fileMenu->Add( openRecentMenu->Clone() );
// Add the file menu condition here since it needs the item ID for the submenu // Add the file menu condition here since it needs the item ID for the submenu
ACTION_CONDITIONS cond; ACTION_CONDITIONS cond;

View File

@ -74,7 +74,7 @@ void GERBVIEW_FRAME::ReCreateMenuBar()
fileMenu->Add( GERBVIEW_ACTIONS::openAutodetected ); fileMenu->Add( GERBVIEW_ACTIONS::openAutodetected );
fileMenu->Add( GERBVIEW_ACTIONS::openGerber ); fileMenu->Add( GERBVIEW_ACTIONS::openGerber );
wxMenuItem* gbrItem = fileMenu->Add( openRecentGbrMenu ); wxMenuItem* gbrItem = fileMenu->Add( openRecentGbrMenu->Clone() );
RegisterUIUpdateHandler( gbrItem->GetId(), FileHistoryCond( recentGbrFiles) ); RegisterUIUpdateHandler( gbrItem->GetId(), FileHistoryCond( recentGbrFiles) );
@ -92,7 +92,7 @@ void GERBVIEW_FRAME::ReCreateMenuBar()
} }
fileMenu->Add( GERBVIEW_ACTIONS::openDrillFile ); fileMenu->Add( GERBVIEW_ACTIONS::openDrillFile );
wxMenuItem* drillItem = fileMenu->Add( openRecentDrlMenu ); wxMenuItem* drillItem = fileMenu->Add( openRecentDrlMenu->Clone() );
RegisterUIUpdateHandler( drillItem->GetId(), FileHistoryCond( m_drillFileHistory ) ); RegisterUIUpdateHandler( drillItem->GetId(), FileHistoryCond( m_drillFileHistory ) );
@ -110,7 +110,7 @@ void GERBVIEW_FRAME::ReCreateMenuBar()
} }
fileMenu->Add( GERBVIEW_ACTIONS::openJobFile ); fileMenu->Add( GERBVIEW_ACTIONS::openJobFile );
wxMenuItem* jobItem = fileMenu->Add( openRecentJobMenu ); wxMenuItem* jobItem = fileMenu->Add( openRecentJobMenu->Clone() );
RegisterUIUpdateHandler( jobItem->GetId(), FileHistoryCond( m_jobFileHistory ) ); RegisterUIUpdateHandler( jobItem->GetId(), FileHistoryCond( m_jobFileHistory ) );
@ -128,7 +128,7 @@ void GERBVIEW_FRAME::ReCreateMenuBar()
} }
fileMenu->Add( GERBVIEW_ACTIONS::openZipFile ); fileMenu->Add( GERBVIEW_ACTIONS::openZipFile );
wxMenuItem* zipItem = fileMenu->Add( openRecentZipMenu ); wxMenuItem* zipItem = fileMenu->Add( openRecentZipMenu->Clone() );
RegisterUIUpdateHandler( zipItem->GetId(), FileHistoryCond( m_zipFileHistory ) ); RegisterUIUpdateHandler( zipItem->GetId(), FileHistoryCond( m_zipFileHistory ) );
#undef FileHistoryCond #undef FileHistoryCond

View File

@ -79,7 +79,7 @@ void KICAD_MANAGER_FRAME::ReCreateMenuBar()
fileMenu->Add( KICAD_MANAGER_ACTIONS::openProject ); fileMenu->Add( KICAD_MANAGER_ACTIONS::openProject );
wxMenuItem* item = fileMenu->Add( openRecentMenu ); wxMenuItem* item = fileMenu->Add( openRecentMenu->Clone() );
// Add the file menu condition here since it needs the item ID for the submenu // Add the file menu condition here since it needs the item ID for the submenu
ACTION_CONDITIONS cond; ACTION_CONDITIONS cond;

View File

@ -68,7 +68,7 @@ void PL_EDITOR_FRAME::ReCreateMenuBar()
fileMenu->Add( ACTIONS::doNew ); fileMenu->Add( ACTIONS::doNew );
fileMenu->Add( ACTIONS::open ); fileMenu->Add( ACTIONS::open );
wxMenuItem* item = fileMenu->Add( openRecentMenu ); wxMenuItem* item = fileMenu->Add( openRecentMenu->Clone() );
// Add the file menu condition here since it needs the item ID for the submenu // Add the file menu condition here since it needs the item ID for the submenu
ACTION_CONDITIONS cond; ACTION_CONDITIONS cond;

View File

@ -74,7 +74,7 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
fileMenu->Add( ACTIONS::doNew ); fileMenu->Add( ACTIONS::doNew );
fileMenu->Add( ACTIONS::open ); fileMenu->Add( ACTIONS::open );
wxMenuItem* item = fileMenu->Add( openRecentMenu ); wxMenuItem* item = fileMenu->Add( openRecentMenu->Clone() );
// Add the file menu condition here since it needs the item ID for the submenu // Add the file menu condition here since it needs the item ID for the submenu
ACTION_CONDITIONS cond; ACTION_CONDITIONS cond;