Don't clear the undo/redo list when we're just trimming it.

We only allow a certain number of commands on the lists
and trim them when they overflow.  PCB_BASE_EDIT_FRAME and
PL_EDITOR_FRAME implemented this correctly; SCH_EDIT_FRAME
and SYMBOL_EDIT_FRAME did not.
This commit is contained in:
Jeff Young 2024-02-07 14:49:50 +00:00
parent 98bc03919d
commit bce372c8a3
4 changed files with 71 additions and 43 deletions

View File

@ -474,18 +474,29 @@ void SCH_EDIT_FRAME::ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItemCou
if( aItemCount == 0 )
return;
UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
for( PICKED_ITEMS_LIST* command : list.m_CommandsList )
if( aItemCount < 0 )
{
command->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
{
delete aItem;
} );
delete command;
list.ClearCommandList();
}
else
{
for( int ii = 0; ii < aItemCount; ii++ )
{
if( list.m_CommandsList.size() == 0 )
break;
list.m_CommandsList.clear();
PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
list.m_CommandsList.erase( list.m_CommandsList.begin() );
curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
{
delete aItem;
} );
delete curr_cmd; // Delete command
}
}
}

View File

@ -1556,18 +1556,29 @@ void SYMBOL_EDIT_FRAME::ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItem
if( aItemCount == 0 )
return;
UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
for( PICKED_ITEMS_LIST* command : list.m_CommandsList )
if( aItemCount < 0 )
{
command->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
{
delete aItem;
} );
delete command;
list.ClearCommandList();
}
else
{
for( int ii = 0; ii < aItemCount; ii++ )
{
if( list.m_CommandsList.size() == 0 )
break;
list.m_CommandsList.clear();
PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
list.m_CommandsList.erase( list.m_CommandsList.begin() );
curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
{
delete aItem;
} );
delete curr_cmd; // Delete command
}
}
}

View File

@ -934,25 +934,28 @@ void PL_EDITOR_FRAME::ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItemCo
if( aItemCount == 0 )
return;
UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
unsigned icnt = list.m_CommandsList.size();
UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
if( aItemCount > 0 )
icnt = aItemCount;
for( unsigned ii = 0; ii < icnt; ii++ )
if( aItemCount < 0 )
{
if( list.m_CommandsList.size() == 0 )
break;
list.ClearCommandList();
}
else
{
for( int ii = 0; ii < aItemCount; ii++ )
{
if( list.m_CommandsList.size() == 0 )
break;
PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
list.m_CommandsList.erase( list.m_CommandsList.begin() );
PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
list.m_CommandsList.erase( list.m_CommandsList.begin() );
curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
{
delete aItem;
} );
delete curr_cmd; // Delete command
curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
{
delete aItem;
} );
delete curr_cmd; // Delete command
}
}
}

View File

@ -503,21 +503,24 @@ void PCB_BASE_EDIT_FRAME::ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aIt
if( aItemCount == 0 )
return;
UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
unsigned icnt = list.m_CommandsList.size();
UNDO_REDO_CONTAINER& list = ( whichList == UNDO_LIST ) ? m_undoList : m_redoList;
if( aItemCount > 0 )
icnt = aItemCount;
for( unsigned ii = 0; ii < icnt; ii++ )
if( aItemCount < 0 )
{
if( list.m_CommandsList.size() == 0 )
break;
list.ClearCommandList();
}
else
{
for( int ii = 0; ii < aItemCount; ii++ )
{
if( list.m_CommandsList.size() == 0 )
break;
PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
list.m_CommandsList.erase( list.m_CommandsList.begin() );
ClearListAndDeleteItems( curr_cmd );
delete curr_cmd; // Delete command
PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
list.m_CommandsList.erase( list.m_CommandsList.begin() );
ClearListAndDeleteItems( curr_cmd );
delete curr_cmd; // Delete command
}
}
}