diff --git a/pcbnew/modedit_undo_redo.cpp b/pcbnew/modedit_undo_redo.cpp index 613f4d8d2b..4e057c3e3c 100644 --- a/pcbnew/modedit_undo_redo.cpp +++ b/pcbnew/modedit_undo_redo.cpp @@ -2,8 +2,11 @@ /* library editor: undo and redo functions */ /********************************************/ +#include #include #include +#include +#include #include #include @@ -50,31 +53,52 @@ void FOOTPRINT_EDIT_FRAME::SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsLi UNDO_REDO_T aTypeCommand, const wxPoint& aTransformPoint ) { - // Currently unused in modedit, because the module itself is saved for each change - wxMessageBox( wxT( "SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList..) not yet in use" ) ); + assert( aItemsList.GetPickedItem( 0 )->GetParent()->Type() == PCB_MODULE_T ); + MODULE* owner = static_cast( aItemsList.GetPickedItem( 0 )->GetParent() ); + +#ifndef NDEBUG + // All items should have the same parent (MODULE) to make undo/redo entry valid + for( unsigned int i = 0; i < aItemsList.GetCount(); ++i ) + assert( aItemsList.GetPickedItem( i )->GetParent() == owner ); +#endif /* not NDEBUG */ + + SaveCopyInUndoList( owner, aTypeCommand, aTransformPoint ); } -void FOOTPRINT_EDIT_FRAME::GetComponentFromRedoList( wxCommandEvent& event ) +void FOOTPRINT_EDIT_FRAME::GetComponentFromRedoList( wxCommandEvent& aEvent ) { if( GetScreen()->GetRedoCommandCount() <= 0 ) return; + // Inform tools that undo command was issued + TOOL_EVENT event( TC_MESSAGE, TA_UNDO_REDO, AS_GLOBAL ); + m_toolManager->ProcessEvent( event ); + // Save current module state in undo list PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST(); - MODULE * module = GetBoard()->m_Modules.PopFront(); - ITEM_PICKER wrapper( module, UR_MODEDIT ); + MODULE* module = GetBoard()->m_Modules.PopFront(); + ITEM_PICKER wrapper( module, UR_MODEDIT ); + KIGFX::VIEW* view = GetGalCanvas()->GetView(); lastcmd->PushItem( wrapper ); GetScreen()->PushCommandToUndoList( lastcmd ); + view->Remove( module ); + module->RunOnChildren( boost::bind( &KIGFX::VIEW::Remove, view, _1 ) ); + // Retrieve last module state from undo list lastcmd = GetScreen()->PopCommandFromRedoList(); wrapper = lastcmd->PopItem(); - module = (MODULE *)wrapper.GetItem(); + module = (MODULE*) wrapper.GetItem(); delete lastcmd; if( module ) + { GetBoard()->Add( module ); + GetGalCanvas()->GetView()->Add( module ); + module->RunOnChildren( boost::bind( &KIGFX::VIEW::Add, view, _1 ) ); + module->ViewUpdate(); + } SetCurItem( NULL ); @@ -83,27 +107,39 @@ void FOOTPRINT_EDIT_FRAME::GetComponentFromRedoList( wxCommandEvent& event ) } -void FOOTPRINT_EDIT_FRAME::GetComponentFromUndoList( wxCommandEvent& event ) +void FOOTPRINT_EDIT_FRAME::GetComponentFromUndoList( wxCommandEvent& aEvent ) { if( GetScreen()->GetUndoCommandCount() <= 0 ) return; + // Inform tools that undo command was issued + TOOL_EVENT event( TC_MESSAGE, TA_UNDO_REDO, AS_GLOBAL ); + m_toolManager->ProcessEvent( event ); + // Save current module state in redo list PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST(); - MODULE * module = GetBoard()->m_Modules.PopFront(); - ITEM_PICKER wrapper( module, UR_MODEDIT ); + MODULE* module = GetBoard()->m_Modules.PopFront(); + ITEM_PICKER wrapper( module, UR_MODEDIT ); + KIGFX::VIEW* view = GetGalCanvas()->GetView(); lastcmd->PushItem( wrapper ); GetScreen()->PushCommandToRedoList( lastcmd ); + view->Remove( module ); + module->RunOnChildren( boost::bind( &KIGFX::VIEW::Remove, view, _1 ) ); + // Retrieve last module state from undo list lastcmd = GetScreen()->PopCommandFromUndoList(); wrapper = lastcmd->PopItem(); - module = (MODULE *)wrapper.GetItem(); + module = (MODULE*) wrapper.GetItem(); delete lastcmd; if( module ) + { GetBoard()->Add( module, ADD_APPEND ); - + view->Add( module ); + module->RunOnChildren( boost::bind( &KIGFX::VIEW::Add, view, _1 ) ); + module->ViewUpdate(); + } SetCurItem( NULL );