Fixed a memory leak in CONDITIONAL_MENU
CONDITIONAL_MENU::ENTRY now owns the wxItem object.
This commit is contained in:
parent
e7dfa91525
commit
8e8979e317
|
@ -64,10 +64,10 @@ void CONDITIONAL_MENU::AddItem( int aId, const wxString& aText, const wxString&
|
||||||
BITMAP_DEF aIcon, const SELECTION_CONDITION& aCondition,
|
BITMAP_DEF aIcon, const SELECTION_CONDITION& aCondition,
|
||||||
int aOrder )
|
int aOrder )
|
||||||
{
|
{
|
||||||
wxMenuItem* item = new wxMenuItem( nullptr, aId, aText, aTooltip, wxITEM_NORMAL );
|
wxMenuItem item( nullptr, aId, aText, aTooltip, wxITEM_NORMAL );
|
||||||
|
|
||||||
if( aIcon )
|
if( aIcon )
|
||||||
AddBitmapToMenuItem( item, KiBitmap( aIcon ) );
|
AddBitmapToMenuItem( &item, KiBitmap( aIcon ) );
|
||||||
|
|
||||||
addEntry( ENTRY( item, aIcon, aCondition, aOrder, false ) );
|
addEntry( ENTRY( item, aIcon, aCondition, aOrder, false ) );
|
||||||
}
|
}
|
||||||
|
@ -77,10 +77,10 @@ void CONDITIONAL_MENU::AddCheckItem( int aId, const wxString& aText, const wxStr
|
||||||
BITMAP_DEF aIcon, const SELECTION_CONDITION& aCondition,
|
BITMAP_DEF aIcon, const SELECTION_CONDITION& aCondition,
|
||||||
int aOrder )
|
int aOrder )
|
||||||
{
|
{
|
||||||
wxMenuItem* item = new wxMenuItem( nullptr, aId, aText, aTooltip, wxITEM_CHECK );
|
wxMenuItem item( nullptr, aId, aText, aTooltip, wxITEM_CHECK );
|
||||||
|
|
||||||
if( aIcon )
|
if( aIcon )
|
||||||
AddBitmapToMenuItem( item, KiBitmap( aIcon ) );
|
AddBitmapToMenuItem( &item, KiBitmap( aIcon ) );
|
||||||
|
|
||||||
addEntry( ENTRY( item, aIcon, aCondition, aOrder, true ) );
|
addEntry( ENTRY( item, aIcon, aCondition, aOrder, true ) );
|
||||||
}
|
}
|
||||||
|
@ -249,3 +249,39 @@ void CONDITIONAL_MENU::addEntry( ENTRY aEntry )
|
||||||
|
|
||||||
m_entries.insert( it, aEntry );
|
m_entries.insert( it, aEntry );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CONDITIONAL_MENU::ENTRY::ENTRY( const ENTRY& aEntry )
|
||||||
|
{
|
||||||
|
m_type = aEntry.m_type;
|
||||||
|
m_icon = aEntry.m_icon;
|
||||||
|
|
||||||
|
switch( aEntry.m_type )
|
||||||
|
{
|
||||||
|
case ACTION:
|
||||||
|
m_data.action = aEntry.m_data.action;
|
||||||
|
break;
|
||||||
|
case MENU:
|
||||||
|
m_data.menu = aEntry.m_data.menu;
|
||||||
|
break;
|
||||||
|
case WXITEM:
|
||||||
|
// We own the wxItem, so we need to make a new one for the new object
|
||||||
|
m_data.wxItem = new wxMenuItem( nullptr,
|
||||||
|
aEntry.m_data.wxItem->GetId(),
|
||||||
|
aEntry.m_data.wxItem->GetItemLabel(),
|
||||||
|
aEntry.m_data.wxItem->GetHelp(),
|
||||||
|
aEntry.m_data.wxItem->GetKind() );
|
||||||
|
break;
|
||||||
|
case SEPARATOR:
|
||||||
|
break; //No data to copy
|
||||||
|
}
|
||||||
|
m_condition = aEntry.m_condition;
|
||||||
|
m_order = aEntry.m_order;
|
||||||
|
m_isCheckmarkEntry = aEntry.m_isCheckmarkEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONDITIONAL_MENU::ENTRY::~ENTRY()
|
||||||
|
{
|
||||||
|
if( WXITEM == m_type )
|
||||||
|
delete m_data.wxItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,14 +160,15 @@ private:
|
||||||
m_data.menu = aMenu;
|
m_data.menu = aMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
ENTRY( wxMenuItem* aItem, const BITMAP_OPAQUE* aWxMenuBitmap,
|
ENTRY( const wxMenuItem& aItem, const BITMAP_OPAQUE* aWxMenuBitmap,
|
||||||
SELECTION_CONDITION aCondition, int aOrder, bool aCheckmark ) :
|
SELECTION_CONDITION aCondition, int aOrder, bool aCheckmark ) :
|
||||||
m_type( WXITEM ), m_icon( aWxMenuBitmap ),
|
m_type( WXITEM ), m_icon( aWxMenuBitmap ),
|
||||||
m_condition( aCondition ),
|
m_condition( aCondition ),
|
||||||
m_order( aOrder ),
|
m_order( aOrder ),
|
||||||
m_isCheckmarkEntry( aCheckmark )
|
m_isCheckmarkEntry( aCheckmark )
|
||||||
{
|
{
|
||||||
m_data.wxItem = aItem;
|
m_data.wxItem = new wxMenuItem( nullptr, aItem.GetId(), aItem.GetItemLabel(),
|
||||||
|
aItem.GetHelp(), aItem.GetKind() );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Separator
|
// Separator
|
||||||
|
@ -179,6 +180,10 @@ private:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENTRY( const ENTRY& aEntry );
|
||||||
|
|
||||||
|
~ENTRY();
|
||||||
|
|
||||||
///> Possible entry types.
|
///> Possible entry types.
|
||||||
enum ENTRY_TYPE {
|
enum ENTRY_TYPE {
|
||||||
ACTION,
|
ACTION,
|
||||||
|
@ -239,6 +244,8 @@ private:
|
||||||
ENTRY_TYPE m_type;
|
ENTRY_TYPE m_type;
|
||||||
const BITMAP_OPAQUE* m_icon;
|
const BITMAP_OPAQUE* m_icon;
|
||||||
|
|
||||||
|
// This class owns the wxItem object and needs to create, copy and delete it accordingly
|
||||||
|
// But it does not own the action nor menu item
|
||||||
union {
|
union {
|
||||||
const TOOL_ACTION* action;
|
const TOOL_ACTION* action;
|
||||||
ACTION_MENU* menu;
|
ACTION_MENU* menu;
|
||||||
|
|
Loading…
Reference in New Issue