Commit 1617f15b authored by Maciej Suminski's avatar Maciej Suminski
Browse files

FOOTPRINT_EDIT_FRAME undo buffer handles operations done with GAL editor.

parent 7ade7db0
Loading
Loading
Loading
Loading
+47 −11
Original line number Original line Diff line number Diff line
@@ -2,8 +2,11 @@
/*  library editor: undo and redo functions */
/*  library editor: undo and redo functions */
/********************************************/
/********************************************/


#include <boost/bind.hpp>
#include <fctsys.h>
#include <fctsys.h>
#include <class_drawpanel.h>
#include <class_drawpanel.h>
#include <class_draw_panel_gal.h>
#include <tool/tool_manager.h>
#include <wxPcbStruct.h>
#include <wxPcbStruct.h>


#include <class_board.h>
#include <class_board.h>
@@ -50,23 +53,39 @@ void FOOTPRINT_EDIT_FRAME::SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsLi
                                               UNDO_REDO_T        aTypeCommand,
                                               UNDO_REDO_T        aTypeCommand,
                                               const wxPoint&     aTransformPoint )
                                               const wxPoint&     aTransformPoint )
{
{
    // Currently unused in modedit, because the module itself is saved for each change
    assert( aItemsList.GetPickedItem( 0 )->GetParent()->Type() == PCB_MODULE_T );
    wxMessageBox( wxT( "SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList..) not yet in use" ) );
    MODULE* owner = static_cast<MODULE*>( 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 )
    if( GetScreen()->GetRedoCommandCount() <= 0 )
        return;
        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
    // Save current module state in undo list
    PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST();
    PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST();
    MODULE* module = GetBoard()->m_Modules.PopFront();
    MODULE* module = GetBoard()->m_Modules.PopFront();
    ITEM_PICKER wrapper( module, UR_MODEDIT );
    ITEM_PICKER wrapper( module, UR_MODEDIT );
    KIGFX::VIEW* view = GetGalCanvas()->GetView();
    lastcmd->PushItem( wrapper );
    lastcmd->PushItem( wrapper );
    GetScreen()->PushCommandToUndoList( lastcmd );
    GetScreen()->PushCommandToUndoList( lastcmd );


    view->Remove( module );
    module->RunOnChildren( boost::bind( &KIGFX::VIEW::Remove, view, _1 ) );

    // Retrieve last module state from undo list
    // Retrieve last module state from undo list
    lastcmd = GetScreen()->PopCommandFromRedoList();
    lastcmd = GetScreen()->PopCommandFromRedoList();
    wrapper = lastcmd->PopItem();
    wrapper = lastcmd->PopItem();
@@ -74,7 +93,12 @@ void FOOTPRINT_EDIT_FRAME::GetComponentFromRedoList( wxCommandEvent& event )
    delete lastcmd;
    delete lastcmd;


    if( module )
    if( module )
    {
        GetBoard()->Add( module );
        GetBoard()->Add( module );
        GetGalCanvas()->GetView()->Add( module );
        module->RunOnChildren( boost::bind( &KIGFX::VIEW::Add, view, _1 ) );
        module->ViewUpdate();
    }


    SetCurItem( NULL );
    SetCurItem( NULL );


@@ -83,18 +107,26 @@ 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 )
    if( GetScreen()->GetUndoCommandCount() <= 0 )
        return;
        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
    // Save current module state in redo list
    PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST();
    PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST();
    MODULE* module = GetBoard()->m_Modules.PopFront();
    MODULE* module = GetBoard()->m_Modules.PopFront();
    ITEM_PICKER wrapper( module, UR_MODEDIT );
    ITEM_PICKER wrapper( module, UR_MODEDIT );
    KIGFX::VIEW* view = GetGalCanvas()->GetView();
    lastcmd->PushItem( wrapper );
    lastcmd->PushItem( wrapper );
    GetScreen()->PushCommandToRedoList( lastcmd );
    GetScreen()->PushCommandToRedoList( lastcmd );


    view->Remove( module );
    module->RunOnChildren( boost::bind( &KIGFX::VIEW::Remove, view, _1 ) );

    // Retrieve last module state from undo list
    // Retrieve last module state from undo list
    lastcmd = GetScreen()->PopCommandFromUndoList();
    lastcmd = GetScreen()->PopCommandFromUndoList();
    wrapper = lastcmd->PopItem();
    wrapper = lastcmd->PopItem();
@@ -102,8 +134,12 @@ void FOOTPRINT_EDIT_FRAME::GetComponentFromUndoList( wxCommandEvent& event )
    delete lastcmd;
    delete lastcmd;


    if( module )
    if( module )
    {
        GetBoard()->Add( module, ADD_APPEND );
        GetBoard()->Add( module, ADD_APPEND );

        view->Add( module );
        module->RunOnChildren( boost::bind( &KIGFX::VIEW::Add, view, _1 ) );
        module->ViewUpdate();
    }


    SetCurItem( NULL );
    SetCurItem( NULL );