Commit 9d6daf56 authored by charras's avatar charras
Browse files

undo-redo rework

parent f21d7bc6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ set(COMMON_SRCS
    block_commande.cpp
    class_drawpickedstruct.cpp
    class_marker_base.cpp
    class_undoredo_container.cpp
    common.cpp
    common_plot_functions.cpp
    common_plotHPGL_functions.cpp
+1 −1
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@
#include "appl_wxstruct.h"


#define BUILD_VERSION "(20090712-unstable)"
#define BUILD_VERSION "(20090723-unstable)"


#ifdef HAVE_SVN_VERSION
+20 −86
Original line number Diff line number Diff line
@@ -28,9 +28,7 @@ BASE_SCREEN* ActiveScreen = NULL;
BASE_SCREEN::BASE_SCREEN( KICAD_T aType ) : EDA_BaseStruct( aType )
{
    EEDrawList         = NULL;   /* Schematic items list */
    m_UndoList         = NULL;
    m_RedoList         = NULL;
    m_UndoRedoCountMax = 1;
    m_UndoRedoCountMax = 1;     /* undo/Redo command Max depth */
    m_FirstRedraw      = TRUE;
    m_ScreenNumber     = 1;
    m_NumberOfScreen   = 1;  /* Hierarchy: Root: ScreenNumber = 1 */
@@ -486,121 +484,57 @@ void BASE_SCREEN::ClearUndoRedoList()
/* free the undo and the redo lists
 */
{
    EDA_BaseStruct* nextitem;

    while( m_UndoList )
    {
        nextitem = m_UndoList->Next();
        delete m_UndoList;
        m_UndoList = nextitem;
    }

    while( m_RedoList )
    {
        nextitem = m_RedoList->Next();
        delete m_RedoList;
        m_RedoList = nextitem;
    }
    m_UndoList.ClearCommandList();
    m_RedoList.ClearCommandList();
}


/***********************************************************/
void BASE_SCREEN::AddItemToUndoList( EDA_BaseStruct* newitem )
void BASE_SCREEN::PushCommandToUndoList( PICKED_ITEMS_LIST* aNewitem )
/************************************************************/

/* Put newitem in head of undo list
/* Put aNewitem in top of undo list
 *  Deletes olds items if > count max.
 */
{
    int             ii;
    EDA_BaseStruct* item;
    EDA_BaseStruct* nextitem;

    if( newitem == NULL )
        return;

    newitem->SetNext( m_UndoList );
    m_UndoList = newitem;

    /* Free first items, if count max reached */
    for( ii = 0, item = m_UndoList; ii < m_UndoRedoCountMax; ii++ )
    m_UndoList.PushCommand(aNewitem);
    while( m_UndoList.m_CommandsList.size() > 0 &&
            m_UndoList.m_CommandsList.size() >= m_UndoRedoCountMax )
    {
        if( item->Next() == NULL )
            return;
        item = item->Next();
        delete m_UndoList.m_CommandsList[0];
        m_UndoList.m_CommandsList.erase( m_UndoList.m_CommandsList.begin() );
    }

    if( item == NULL )
        return;

    nextitem    = item->Next();
    item->SetNext( NULL ); // Set end of chain

    // Delete the extra  items
    for( item = nextitem; item != NULL; item = nextitem )
    {
        nextitem = item->Next();
        delete item;
    }
}


/***********************************************************/
void BASE_SCREEN::AddItemToRedoList( EDA_BaseStruct* newitem )
void BASE_SCREEN::PushCommandToRedoList( PICKED_ITEMS_LIST* aNewitem )
/***********************************************************/
{
    int             ii;
    EDA_BaseStruct* item, * nextitem;

    if( newitem == NULL )
        return;

    newitem->SetNext( m_RedoList );
    m_RedoList = newitem;
    /* Free first items, if count max reached */
    for( ii = 0, item = m_RedoList; ii < m_UndoRedoCountMax; ii++ )
    m_RedoList.PushCommand(aNewitem);
    while( m_RedoList.m_CommandsList.size() > 0 &&
            m_RedoList.m_CommandsList.size() >= m_UndoRedoCountMax )
    {
        if( item->Next() == NULL )
            break;
        item = item->Next();
    }

    if( item == NULL )
        return;

    nextitem    = item->Next();
    item->SetNext( NULL );      // Set end of chain

    // Delete the extra items
    for( item = nextitem; item != NULL; item = nextitem )
    {
        nextitem = item->Next();
        delete item;
        delete m_RedoList.m_CommandsList[0];
        m_RedoList.m_CommandsList.erase( m_RedoList.m_CommandsList.begin() );
    }
}


/*****************************************************/
EDA_BaseStruct* BASE_SCREEN::GetItemFromUndoList()
PICKED_ITEMS_LIST* BASE_SCREEN::PopCommandFromUndoList( )
/*****************************************************/
{
    EDA_BaseStruct* item = m_UndoList;

    if( item )
        m_UndoList = item->Next();
    return item;
    return m_UndoList.PopCommand( );
}


/******************************************************/
EDA_BaseStruct* BASE_SCREEN::GetItemFromRedoList()
PICKED_ITEMS_LIST* BASE_SCREEN::PopCommandFromRedoList( )
/******************************************************/
{
    EDA_BaseStruct* item = m_RedoList;

    if( item )
        m_RedoList = item->Next();
    return item;
    return m_RedoList.PopCommand( );
}


+41 −19
Original line number Diff line number Diff line
@@ -21,19 +21,29 @@ void WinEDA_LibeditFrame::SaveCopyInUndoList( EDA_BaseStruct* ItemToCopy,
{
    EDA_BaseStruct*         item;
    EDA_LibComponentStruct* CopyItem;
    PICKED_ITEMS_LIST* lastcmd;

    CopyItem = CopyLibEntryStruct( this, (EDA_LibComponentStruct*) ItemToCopy );
    GetScreen()->AddItemToUndoList( (EDA_BaseStruct*) CopyItem );

    lastcmd = new PICKED_ITEMS_LIST();
    ITEM_PICKER wrapper(CopyItem);
    lastcmd->PushItem(wrapper);
    GetScreen()->PushCommandToUndoList( lastcmd );
    /* Clear current flags (which can be temporary set by a current edit command) */
    for( item = CopyItem->m_Drawings; item != NULL; item = item->Next() )
        item->m_Flags = 0;

    /* Clear redo list, because after new save there is no redo to do */
    while( GetScreen()->m_RedoList )
    while( (lastcmd = GetScreen()->PopCommandFromRedoList( ) ) != NULL )
    {
        while ( 1 )
        {
        item = GetScreen()->m_RedoList->Next();
        delete( GetScreen()->m_RedoList );
        GetScreen()->m_RedoList = item;
            wrapper = lastcmd->PopItem();
            if ( wrapper.m_Item == NULL )
                break;      // All items are removed
            delete wrapper.m_Item;
        }
        delete lastcmd;
    }
}

@@ -45,15 +55,21 @@ bool WinEDA_LibeditFrame::GetComponentFromRedoList()
/* Redo the last edition:
  * - Place the current edited library component in undo list
  * - Get old version of the current edited library component
 *  @return FALSE if nothing done, else TRUE
 *  @return FALSE if nothing done, else true
 */
{
    if( GetScreen()->m_RedoList == NULL )
        return FALSE;
    if ( GetScreen()->GetRedoCommandCount() <= 0 )
        return false;

    PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST();
    ITEM_PICKER wrapper(CurrentLibEntry);
    lastcmd->PushItem(wrapper);
    GetScreen()->PushCommandToUndoList( lastcmd );

    GetScreen()->AddItemToUndoList( (EDA_BaseStruct*) CurrentLibEntry );
    CurrentLibEntry =
        (EDA_LibComponentStruct*) GetScreen()->GetItemFromRedoList();
    lastcmd = GetScreen()->PopCommandFromRedoList( );

    wrapper = lastcmd->PopItem();
    CurrentLibEntry = (EDA_LibComponentStruct*) wrapper.m_Item;
    if( CurrentLibEntry )
        CurrentLibEntry->SetNext( NULL );
    CurrentDrawItem = NULL;
@@ -61,7 +77,7 @@ bool WinEDA_LibeditFrame::GetComponentFromRedoList()
    ReCreateHToolbar();
    SetToolbars();

    return TRUE;
    return true;
}


@@ -72,15 +88,21 @@ bool WinEDA_LibeditFrame::GetComponentFromUndoList()
/* Undo the last edition:
  * - Place the current edited library component in Redo list
  * - Get old version of the current edited library component
 *  @return FALSE if nothing done, else TRUE
 *  @return FALSE if nothing done, else true
 */
{
    if( GetScreen()->m_UndoList == NULL )
        return FALSE;
    if ( GetScreen()->GetUndoCommandCount() <= 0 )
        return false;

    PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST();
    ITEM_PICKER wrapper(CurrentLibEntry);
    lastcmd->PushItem(wrapper);
    GetScreen()->PushCommandToRedoList( lastcmd );

    lastcmd = GetScreen()->PopCommandFromUndoList( );

    GetScreen()->AddItemToRedoList( (EDA_BaseStruct*) CurrentLibEntry );
    CurrentLibEntry =
        (EDA_LibComponentStruct*) GetScreen()->GetItemFromUndoList();
    wrapper = lastcmd->PopItem();
    CurrentLibEntry = (EDA_LibComponentStruct*) wrapper.m_Item;

    if( CurrentLibEntry )
        CurrentLibEntry->SetNext( NULL );
@@ -89,5 +111,5 @@ bool WinEDA_LibeditFrame::GetComponentFromUndoList()
    ReCreateHToolbar();
    SetToolbars();

    return TRUE;
    return true;
}
+2 −2
Original line number Diff line number Diff line
@@ -279,8 +279,8 @@ void WinEDA_LibeditFrame::SetToolbars()

            if( GetScreen() )
            {
                m_HToolBar->EnableTool( ID_LIBEDIT_UNDO, GetScreen()->m_UndoList );
                m_HToolBar->EnableTool( ID_LIBEDIT_REDO, GetScreen()->m_RedoList );
                m_HToolBar->EnableTool( ID_LIBEDIT_UNDO, GetScreen()->GetUndoCommandCount() );
                m_HToolBar->EnableTool( ID_LIBEDIT_REDO, GetScreen()->GetRedoCommandCount() );
            }
        }

Loading