Commit aa35b980 authored by charras's avatar charras
Browse files

Eeschema: fixed some issues in undo/redo and ESC commands related to hierarchical sheets

parent be946a75
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -92,8 +92,7 @@ void WinEDA_SchematicFrame::StartMoveBusEntry( SCH_BUS_ENTRY* BusEntry,
    if( BusEntry == NULL )
    if( BusEntry == NULL )
        return;
        return;


    if( (BusEntry->m_Flags & IS_NEW) == 0 )    // => not already in edit, save
    if( (BusEntry->m_Flags & IS_NEW) == 0 )    // not already in edit, save shape
                                               // shape */
    {
    {
        delete g_ItemToUndoCopy;
        delete g_ItemToUndoCopy;
        g_ItemToUndoCopy = BusEntry->GenCopy();
        g_ItemToUndoCopy = BusEntry->GenCopy();
+16 −0
Original line number Original line Diff line number Diff line
@@ -208,6 +208,22 @@ void SCH_SHEET::Place( WinEDA_SchematicFrame* frame, wxDC* DC )
            return;
            return;
        }
        }
    }
    }
    else    /* save old text in undo list */
    {
        if( g_ItemToUndoCopy && ( g_ItemToUndoCopy->Type() == Type() ) )
        {
            /* restore old values and save new ones */
            SwapData( (SCH_SHEET*) g_ItemToUndoCopy );

            /* save in undo list */
            frame->SaveCopyInUndoList( this, UR_CHANGED );

            /* restore new values */
            SwapData( (SCH_SHEET*) g_ItemToUndoCopy );

            SAFE_DELETE( g_ItemToUndoCopy );
        }
    }


    SCH_ITEM::Place( frame, DC ); //puts it on the EEDrawList.
    SCH_ITEM::Place( frame, DC ); //puts it on the EEDrawList.
    if( isnew )
    if( isnew )
+7 −5
Original line number Original line Diff line number Diff line
@@ -551,7 +551,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
            GetScreen()->SetCurItem( (SCH_ITEM*) DrawStruct );
            GetScreen()->SetCurItem( (SCH_ITEM*) DrawStruct );


            // Create the events for moving a component or other schematic item
            // Create the events for moving a component or other schematic item
            wxCommandEvent eventMoveComponent( wxEVT_COMMAND_TOOL_CLICKED,
            wxCommandEvent eventMoveOrDragComponent( wxEVT_COMMAND_TOOL_CLICKED,
                                               HK_Descr->m_IdMenuEvent );
                                               HK_Descr->m_IdMenuEvent );
            wxCommandEvent eventMoveItem( wxEVT_COMMAND_TOOL_CLICKED,
            wxCommandEvent eventMoveItem( wxEVT_COMMAND_TOOL_CLICKED,
                                          ID_POPUP_SCH_MOVE_ITEM_REQUEST );
                                          ID_POPUP_SCH_MOVE_ITEM_REQUEST );
@@ -564,21 +564,23 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
            {
            {
            // select the correct event for moving an schematic object
            // select the correct event for moving an schematic object
            // and add it to the event queue
            // and add it to the event queue
            case DRAW_SHEET_STRUCT_TYPE:
            case TYPE_SCH_COMPONENT:
            case TYPE_SCH_COMPONENT:
                wxPostEvent( this, eventMoveComponent );
                wxPostEvent( this, eventMoveOrDragComponent );
                break;
                break;


            case TYPE_SCH_TEXT:
            case TYPE_SCH_TEXT:
            case TYPE_SCH_LABEL:
            case TYPE_SCH_LABEL:
            case TYPE_SCH_GLOBALLABEL:
            case TYPE_SCH_GLOBALLABEL:
            case TYPE_SCH_HIERLABEL:
            case TYPE_SCH_HIERLABEL:
            case DRAW_SHEET_STRUCT_TYPE:
            case DRAW_PART_TEXT_STRUCT_TYPE:
            case DRAW_PART_TEXT_STRUCT_TYPE:
            case DRAW_BUSENTRY_STRUCT_TYPE:
            case DRAW_BUSENTRY_STRUCT_TYPE:
                if( HK_Descr->m_Idcommand != HK_DRAG )
                    wxPostEvent( this, eventMoveItem );
                    wxPostEvent( this, eventMoveItem );
                break;
                break;


            case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE:
            case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE:
                if( HK_Descr->m_Idcommand != HK_DRAG )
                    wxPostEvent( this, eventMovePinsheet );
                    wxPostEvent( this, eventMovePinsheet );
                break;
                break;


+7 −2
Original line number Original line Diff line number Diff line
@@ -439,11 +439,11 @@ void AddMenusForHLabel( wxMenu* PopMenu, SCH_HIERLABEL* HLabel )
    msg = AddHotkeyName( _( "Rotate Hierarchical Label" ), s_Schematic_Hokeys_Descr,
    msg = AddHotkeyName( _( "Rotate Hierarchical Label" ), s_Schematic_Hokeys_Descr,
                             HK_ROTATE );
                             HK_ROTATE );
    ADD_MENUITEM( PopMenu, ID_POPUP_SCH_ROTATE_TEXT,
    ADD_MENUITEM( PopMenu, ID_POPUP_SCH_ROTATE_TEXT,
                  _( "Rotate Hierarchical Label" ), rotate_glabel_xpm );
                  msg, rotate_glabel_xpm );
    msg = AddHotkeyName( _( "Edit Hierarchical Label" ), s_Schematic_Hokeys_Descr,
    msg = AddHotkeyName( _( "Edit Hierarchical Label" ), s_Schematic_Hokeys_Descr,
                             HK_EDIT );
                             HK_EDIT );
    ADD_MENUITEM( PopMenu, ID_POPUP_SCH_EDIT_TEXT,
    ADD_MENUITEM( PopMenu, ID_POPUP_SCH_EDIT_TEXT,
                  _( "Edit Hierarchical Label" ), edit_text_xpm );
                  msg, edit_text_xpm );
    msg = AddHotkeyName( _( "Delete Hierarchical Label" ), s_Schematic_Hokeys_Descr,
    msg = AddHotkeyName( _( "Delete Hierarchical Label" ), s_Schematic_Hokeys_Descr,
                             HK_DELETE );
                             HK_DELETE );
    ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE,
    ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DELETE,
@@ -678,6 +678,11 @@ void AddMenusForHierchicalSheet( wxMenu* PopMenu, SCH_SHEET* Sheet )
                                     s_Schematic_Hokeys_Descr, HK_MOVE_COMPONENT_OR_ITEM );
                                     s_Schematic_Hokeys_Descr, HK_MOVE_COMPONENT_OR_ITEM );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST,
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST,
                      msg, move_sheet_xpm );
                      msg, move_sheet_xpm );

        msg = AddHotkeyName( _( "Drag Sheet" ), s_Schematic_Hokeys_Descr,
                             HK_DRAG );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DRAG_CMP_REQUEST,
                      msg, move_sheet_xpm );
    }
    }


    if( Sheet->m_Flags )
    if( Sheet->m_Flags )
+32 −19
Original line number Original line Diff line number Diff line
@@ -181,79 +181,92 @@ void DuplicateItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList,
}
}




/* Routine to create a new copy of given struct.
/** function DuplicateStruct
 *  Routine to create a new copy of given struct.
 *  The new object is not put in draw list (not linked)
 *  The new object is not put in draw list (not linked)
 * @param aDrawStruct = the SCH_ITEM to duplicate
 * @param aClone (default = false)
 *     if true duplicate also some parameters that must be unique
 *     (timestamp and sheet name)
 *      aClone must be false. use true only is undo/redo duplications
 */
 */
SCH_ITEM* DuplicateStruct( SCH_ITEM* DrawStruct )
SCH_ITEM* DuplicateStruct( SCH_ITEM* aDrawStruct, bool aClone )
{
{
    SCH_ITEM* NewDrawStruct = NULL;
    SCH_ITEM* NewDrawStruct = NULL;


    if( DrawStruct == NULL )
    if( aDrawStruct == NULL )
    {
    {
        wxMessageBox( wxT( "DuplicateStruct error: NULL struct" ) );
        wxMessageBox( wxT( "DuplicateStruct error: NULL struct" ) );
        return NULL;
        return NULL;
    }
    }
    
    
    switch( DrawStruct->Type() )
    switch( aDrawStruct->Type() )
    {
    {
    case DRAW_POLYLINE_STRUCT_TYPE:
    case DRAW_POLYLINE_STRUCT_TYPE:
        NewDrawStruct = ( (SCH_POLYLINE*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_POLYLINE*) aDrawStruct )->GenCopy();
        break;
        break;


    case DRAW_SEGMENT_STRUCT_TYPE:
    case DRAW_SEGMENT_STRUCT_TYPE:
        NewDrawStruct = ( (SCH_LINE*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_LINE*) aDrawStruct )->GenCopy();
        break;
        break;


    case DRAW_BUSENTRY_STRUCT_TYPE:
    case DRAW_BUSENTRY_STRUCT_TYPE:
        NewDrawStruct = ( (SCH_BUS_ENTRY*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_BUS_ENTRY*) aDrawStruct )->GenCopy();
        break;
        break;


    case DRAW_JUNCTION_STRUCT_TYPE:
    case DRAW_JUNCTION_STRUCT_TYPE:
        NewDrawStruct = ( (SCH_JUNCTION*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_JUNCTION*) aDrawStruct )->GenCopy();
        break;
        break;


    case TYPE_SCH_MARKER:
    case TYPE_SCH_MARKER:
        NewDrawStruct = ( (SCH_MARKER*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_MARKER*) aDrawStruct )->GenCopy();
        break;
        break;


    case DRAW_NOCONNECT_STRUCT_TYPE:
    case DRAW_NOCONNECT_STRUCT_TYPE:
        NewDrawStruct = ( (SCH_NO_CONNECT*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_NO_CONNECT*) aDrawStruct )->GenCopy();
        break;
        break;


    case TYPE_SCH_TEXT:
    case TYPE_SCH_TEXT:
        NewDrawStruct = ( (SCH_TEXT*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_TEXT*) aDrawStruct )->GenCopy();
        break;
        break;


    case TYPE_SCH_LABEL:
    case TYPE_SCH_LABEL:
        NewDrawStruct = ( (SCH_LABEL*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_LABEL*) aDrawStruct )->GenCopy();
        break;
        break;


    case TYPE_SCH_HIERLABEL:
    case TYPE_SCH_HIERLABEL:
        NewDrawStruct = ( (SCH_HIERLABEL*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_HIERLABEL*) aDrawStruct )->GenCopy();
        break;
        break;


    case TYPE_SCH_GLOBALLABEL:
    case TYPE_SCH_GLOBALLABEL:
        NewDrawStruct = ( (SCH_GLOBALLABEL*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_GLOBALLABEL*) aDrawStruct )->GenCopy();
        break;
        break;


    case TYPE_SCH_COMPONENT:
    case TYPE_SCH_COMPONENT:
        NewDrawStruct = ( (SCH_COMPONENT*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_COMPONENT*) aDrawStruct )->GenCopy();
        break;
        break;


    case DRAW_SHEET_STRUCT_TYPE:
    case DRAW_SHEET_STRUCT_TYPE:
        NewDrawStruct = ( (SCH_SHEET*) DrawStruct )->GenCopy();
        NewDrawStruct = ( (SCH_SHEET*) aDrawStruct )->GenCopy();
        if ( aClone )
        {
            ((SCH_SHEET*)NewDrawStruct)->m_SheetName = ((SCH_SHEET*)aDrawStruct)->m_SheetName;
        }
        break;
        break;


    default:
    default:
    {
    {
        wxString msg;
        wxString msg;
        msg << wxT( "DuplicateStruct error: unexpected StructType " )
        msg << wxT( "DuplicateStruct error: unexpected StructType " )
            << DrawStruct->Type() << wxT( " " ) << DrawStruct->GetClass();
            << aDrawStruct->Type() << wxT( " " ) << aDrawStruct->GetClass();
        wxMessageBox( msg );
        wxMessageBox( msg );
    }
    }
    break;
    break;
    }
    }


    NewDrawStruct->m_Image = DrawStruct;
    if ( aClone )
        NewDrawStruct->m_TimeStamp = aDrawStruct->m_TimeStamp;

    NewDrawStruct->m_Image = aDrawStruct;
    return NewDrawStruct;
    return NewDrawStruct;
}
}
Loading