Fix crash in PCBNew undo from uninitialized variable.

This commit is contained in:
Jeff Young 2019-05-27 18:58:36 +01:00
parent 718ad77891
commit ce4c4c9409
1 changed files with 26 additions and 13 deletions

View File

@ -398,12 +398,11 @@ void PCB_BASE_EDIT_FRAME::RestoreCopyFromRedoList( wxCommandEvent& aEvent )
void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRedoCommand, void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRedoCommand,
bool aRebuildRatsnet ) bool aRebuildRatsnet )
{ {
BOARD_ITEM* item; bool not_found = false;
bool not_found = false; bool reBuild_ratsnest = false;
bool reBuild_ratsnest = false; bool deep_reBuild_ratsnest = false; // true later if pointers must be rebuilt
bool deep_reBuild_ratsnest = false; // true later if pointers must be rebuilt
auto view = GetGalCanvas()->GetView(); auto view = GetGalCanvas()->GetView();
auto connectivity = GetBoard()->GetConnectivity(); auto connectivity = GetBoard()->GetConnectivity();
@ -438,7 +437,7 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool
build_item_list = false; build_item_list = false;
if( !TestForExistingItem( GetBoard(), item ) ) if( !TestForExistingItem( GetBoard(), (BOARD_ITEM*) eda_item ) )
{ {
// Checking if it ever happens // Checking if it ever happens
wxASSERT_MSG( false, "Item in the undo buffer does not exist" ); wxASSERT_MSG( false, "Item in the undo buffer does not exist" );
@ -453,7 +452,7 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool
} }
// see if we must rebuild ratsnets and pointers lists // see if we must rebuild ratsnets and pointers lists
switch( item->Type() ) switch( eda_item->Type() )
{ {
case PCB_MODULE_T: case PCB_MODULE_T:
deep_reBuild_ratsnest = true; // Pointers on pads can be invalid deep_reBuild_ratsnest = true; // Pointers on pads can be invalid
@ -480,62 +479,76 @@ void PCB_BASE_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool
{ {
case UR_CHANGED: /* Exchange old and new data for each item */ case UR_CHANGED: /* Exchange old and new data for each item */
{ {
BOARD_ITEM* item = (BOARD_ITEM*) item;
BOARD_ITEM* image = (BOARD_ITEM*) aList->GetPickedItemLink( ii ); BOARD_ITEM* image = (BOARD_ITEM*) aList->GetPickedItemLink( ii );
// Remove all pads/drawings/texts, as they become invalid // Remove all pads/drawings/texts, as they become invalid
// for the VIEW after SwapData() called for modules // for the VIEW after SwapData() called for modules
view->Remove( item ); view->Remove( eda_item );
connectivity->Remove( item ); connectivity->Remove( item );
SwapItemData( item, image ); SwapItemData( item, image );
view->Add( item ); view->Add( eda_item );
connectivity->Add( item ); connectivity->Add( item );
} }
break; break;
case UR_NEW: /* new items are deleted */ case UR_NEW: /* new items are deleted */
aList->SetPickedItemStatus( UR_DELETED, ii ); aList->SetPickedItemStatus( UR_DELETED, ii );
GetModel()->Remove( item ); GetModel()->Remove( (BOARD_ITEM*) eda_item );
view->Remove( item ); view->Remove( eda_item );
break; break;
case UR_DELETED: /* deleted items are put in List, as new items */ case UR_DELETED: /* deleted items are put in List, as new items */
aList->SetPickedItemStatus( UR_NEW, ii ); aList->SetPickedItemStatus( UR_NEW, ii );
GetModel()->Add( item ); GetModel()->Add( (BOARD_ITEM*) eda_item );
view->Add( item ); view->Add( eda_item );
build_item_list = true; build_item_list = true;
break; break;
case UR_MOVED: case UR_MOVED:
{
BOARD_ITEM* item = (BOARD_ITEM*) item;
item->Move( aRedoCommand ? aList->m_TransformPoint : -aList->m_TransformPoint ); item->Move( aRedoCommand ? aList->m_TransformPoint : -aList->m_TransformPoint );
view->Update( item, KIGFX::GEOMETRY ); view->Update( item, KIGFX::GEOMETRY );
connectivity->Update( item ); connectivity->Update( item );
}
break; break;
case UR_ROTATED: case UR_ROTATED:
{
BOARD_ITEM* item = (BOARD_ITEM*) item;
item->Rotate( aList->m_TransformPoint, item->Rotate( aList->m_TransformPoint,
aRedoCommand ? m_rotationAngle : -m_rotationAngle ); aRedoCommand ? m_rotationAngle : -m_rotationAngle );
view->Update( item, KIGFX::GEOMETRY ); view->Update( item, KIGFX::GEOMETRY );
connectivity->Update( item ); connectivity->Update( item );
}
break; break;
case UR_ROTATED_CLOCKWISE: case UR_ROTATED_CLOCKWISE:
{
BOARD_ITEM* item = (BOARD_ITEM*) item;
item->Rotate( aList->m_TransformPoint, item->Rotate( aList->m_TransformPoint,
aRedoCommand ? -m_rotationAngle : m_rotationAngle ); aRedoCommand ? -m_rotationAngle : m_rotationAngle );
view->Update( item, KIGFX::GEOMETRY ); view->Update( item, KIGFX::GEOMETRY );
connectivity->Update( item ); connectivity->Update( item );
}
break; break;
case UR_FLIPPED: case UR_FLIPPED:
{
BOARD_ITEM* item = (BOARD_ITEM*) item;
item->Flip( aList->m_TransformPoint ); item->Flip( aList->m_TransformPoint );
view->Update( item, KIGFX::LAYERS ); view->Update( item, KIGFX::LAYERS );
connectivity->Update( item ); connectivity->Update( item );
}
break; break;
case UR_DRILLORIGIN: case UR_DRILLORIGIN:
case UR_GRIDORIGIN: case UR_GRIDORIGIN:
{ {
BOARD_ITEM* item = (BOARD_ITEM*) item;
BOARD_ITEM* image = (BOARD_ITEM*) aList->GetPickedItemLink( ii ); BOARD_ITEM* image = (BOARD_ITEM*) aList->GetPickedItemLink( ii );
VECTOR2D origin = image->GetPosition(); VECTOR2D origin = image->GetPosition();
image->SetPosition( item->GetPosition() ); image->SetPosition( item->GetPosition() );