diff --git a/common/class_undoredo_container.cpp b/common/class_undoredo_container.cpp index c0270a0fbf..9b4834d54b 100644 --- a/common/class_undoredo_container.cpp +++ b/common/class_undoredo_container.cpp @@ -32,7 +32,7 @@ PICKED_ITEMS_LIST::PICKED_ITEMS_LIST() { - m_UndoRedoType = 0; + m_Status = UR_UNSPECIFIED; }; PICKED_ITEMS_LIST::~PICKED_ITEMS_LIST() @@ -102,12 +102,12 @@ EDA_BaseStruct* PICKED_ITEMS_LIST::GetImage( unsigned int aIdx ) } -int PICKED_ITEMS_LIST::GetItemStatus( unsigned int aIdx ) +UndoRedoOpType PICKED_ITEMS_LIST::GetItemStatus( unsigned int aIdx ) { if( aIdx < m_ItemsList.size() ) return m_ItemsList[aIdx].m_UndoRedoStatus; else - return 0; + return UR_UNSPECIFIED; } @@ -135,7 +135,7 @@ bool PICKED_ITEMS_LIST::SetLink( EDA_BaseStruct* aItem, unsigned aIdx ) } -bool PICKED_ITEMS_LIST::SetItem( EDA_BaseStruct* aItem, int aStatus, unsigned aIdx ) +bool PICKED_ITEMS_LIST::SetItem( EDA_BaseStruct* aItem, UndoRedoOpType aStatus, unsigned aIdx ) { if( aIdx < m_ItemsList.size() ) { @@ -148,7 +148,7 @@ bool PICKED_ITEMS_LIST::SetItem( EDA_BaseStruct* aItem, int aStatus, unsigned aI } -bool PICKED_ITEMS_LIST::SetItemStatus( int aStatus, unsigned aIdx ) +bool PICKED_ITEMS_LIST::SetItemStatus( UndoRedoOpType aStatus, unsigned aIdx ) { if( aIdx < m_ItemsList.size() ) { diff --git a/common/sch_item_struct.cpp b/common/sch_item_struct.cpp index 2035cebaa2..ea0b818ceb 100644 --- a/common/sch_item_struct.cpp +++ b/common/sch_item_struct.cpp @@ -45,7 +45,7 @@ void SCH_ITEM::Place( WinEDA_SchematicFrame* frame, wxDC* DC ) if( !screen->CheckIfOnDrawList( this ) ) //don't want a loop! screen->AddToDrawList( this ); g_ItemToRepeat = this; - frame->SaveCopyInUndoList( this, IS_NEW ); + frame->SaveCopyInUndoList( this, UR_NEW ); } m_Flags = 0; diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index de0c4e35e1..c3aec359e3 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -73,6 +73,7 @@ set(EESCHEMA_SRCS erc.cpp files-io.cpp find.cpp + geometric_transforms.cpp getpart.cpp hierarch.cpp hotkeys.cpp diff --git a/eeschema/block.cpp b/eeschema/block.cpp index 599bd6af52..ea406f2208 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -14,20 +14,23 @@ #include "program.h" #include "libcmp.h" #include "general.h" -#include "protos.h" #include "class_marker_sch.h" +#include "protos.h" /* Variables Locales */ +// Imported functions: +void MoveItemsInList( SCH_SCREEN* aScreen, PICKED_ITEMS_LIST& aItemsList, const wxPoint aMoveVector ); +void MirrorListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& Center ); +void MirrorOneStruct( SCH_ITEM* DrawStruct, wxPoint& Center ); + /* Fonctions exportees */ void DeleteItemsInList( WinEDA_DrawPanel* panel, PICKED_ITEMS_LIST& aItemsList ); /* Fonctions Locales */ -static void PlaceItemsInList( SCH_SCREEN* aScreen, PICKED_ITEMS_LIST& aItemsList ); -static void MoveListOfItems( SCH_SCREEN* aScreen, PICKED_ITEMS_LIST& aItemsList ); -static void CopyItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList ); +static void DuplicateItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList, const wxPoint aMoveVector ); static void CollectStructsToDrag( SCH_SCREEN* screen ); static void AddPickedItem( SCH_SCREEN* screen, wxPoint aPosition ); static LibEDA_BaseStruct* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem, @@ -37,9 +40,6 @@ static void DrawMovingBlockOutlines( WinEDA_DrawPanel* panel, bool erase ); static void SaveStructListForPaste( PICKED_ITEMS_LIST& aItemsList ); -static void MirrorListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& Center ); -static void MirrorOneStruct( SCH_ITEM* DrawStruct, - wxPoint& Center ); /*************************************************************************/ int WinEDA_SchematicFrame::ReturnBlockCommand( int key ) @@ -138,9 +138,9 @@ void WinEDA_SchematicFrame::HandleBlockPlace( wxDC* DC ) if( DrawPanel->ManageCurseur ) DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); - SaveCopyInUndoList( block->m_ItemsSelection, IS_CHANGED ); + SaveCopyInUndoList( block->m_ItemsSelection, UR_MOVED, block->m_MoveVector ); - MoveListOfItems( GetScreen(), block->m_ItemsSelection ); + MoveItemsInList( GetScreen(), block->m_ItemsSelection, block->m_MoveVector ); block->ClearItemsList(); break; @@ -149,10 +149,10 @@ void WinEDA_SchematicFrame::HandleBlockPlace( wxDC* DC ) if( DrawPanel->ManageCurseur ) DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); - CopyItemsInList( GetScreen(), block->m_ItemsSelection ); + DuplicateItemsInList( GetScreen(), block->m_ItemsSelection, block->m_MoveVector ); SaveCopyInUndoList( block->m_ItemsSelection, - (block->m_Command == BLOCK_PRESELECT_MOVE) ? IS_CHANGED : IS_NEW ); + (block->m_Command == BLOCK_PRESELECT_MOVE) ? UR_CHANGED : UR_NEW ); block->ClearItemsList(); break; @@ -285,11 +285,9 @@ int WinEDA_SchematicFrame::HandleBlockEnd( wxDC* DC ) DrawAndSizingBlockOutlines( DrawPanel, DC, FALSE ); if( block->GetCount() ) { - wxPoint oldpos = GetScreen()->m_Curseur; - GetScreen()->m_Curseur = wxPoint( 0, 0 ); + wxPoint move_vector = -GetScreen()->m_BlockLocate.m_BlockLastCursorPosition; SaveStructListForPaste( block->m_ItemsSelection ); - PlaceItemsInList( GetScreen(), g_BlockSaveDataList.m_ItemsSelection ); - GetScreen()->m_Curseur = oldpos; + MoveItemsInList( GetScreen(), g_BlockSaveDataList.m_ItemsSelection, move_vector); ii = -1; } block->ClearItemsList(); @@ -409,11 +407,9 @@ void WinEDA_SchematicFrame::HandleBlockEndByPopUp( int Command, wxDC* DC ) DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); if( block->GetCount() ) { - wxPoint oldpos = GetScreen()->m_Curseur; - GetScreen()->m_Curseur = wxPoint( 0, 0 ); + wxPoint move_vector = -GetScreen()->m_BlockLocate.m_BlockLastCursorPosition; SaveStructListForPaste( block->m_ItemsSelection ); - PlaceItemsInList( GetScreen(), g_BlockSaveDataList.m_ItemsSelection ); - GetScreen()->m_Curseur = oldpos; + MoveItemsInList( GetScreen(), g_BlockSaveDataList.m_ItemsSelection, move_vector ); ii = -1; } break; @@ -435,13 +431,12 @@ void WinEDA_SchematicFrame::HandleBlockEndByPopUp( int Command, wxDC* DC ) DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); if( block->GetCount() ) { - SaveCopyInUndoList( block->m_ItemsSelection, IS_CHANGED ); - ii = -1; /* Compute the mirror centre and put it on grid */ - wxPoint Center = block->Centre(); - PutOnGrid( &Center ); - MirrorListOfItems( block->m_ItemsSelection, Center ); + wxPoint mirrorPoint = block->Centre(); + PutOnGrid( &mirrorPoint ); + SaveCopyInUndoList( block->m_ItemsSelection, UR_MIRRORED_Y, mirrorPoint ); + MirrorListOfItems( block->m_ItemsSelection, mirrorPoint ); GetScreen()->SetModify(); } TestDanglingEnds( GetScreen()->EEDrawList, DC ); @@ -487,9 +482,7 @@ static void DrawMovingBlockOutlines( WinEDA_DrawPanel* panel, wxDC* DC, for( unsigned ii = 0; ii < block->GetCount(); ii++ ) { schitem = (SCH_ITEM*) block->m_ItemsSelection.GetItemData( ii ); - DrawStructsInGhost( panel, DC, schitem, - block->m_MoveVector.x, - block->m_MoveVector.y ); + DrawStructsInGhost( panel, DC, schitem, block->m_MoveVector ); } } @@ -502,202 +495,14 @@ static void DrawMovingBlockOutlines( WinEDA_DrawPanel* panel, wxDC* DC, for( unsigned ii = 0; ii < block->GetCount(); ii++ ) { schitem = (SCH_ITEM*) block->m_ItemsSelection.GetItemData( ii ); - DrawStructsInGhost( panel, DC, schitem, - block->m_MoveVector.x, - block->m_MoveVector.y ); + DrawStructsInGhost( panel, DC, schitem, block->m_MoveVector ); } } -/***************************************************************************** -* Routine to move objects to a new position. * -*****************************************************************************/ -void MoveListOfItems( SCH_SCREEN* aScreen, PICKED_ITEMS_LIST& aItemsList ) -{ - PlaceItemsInList( aScreen, aItemsList ); /* Place it in its new position. */ -} - - -static void MirrorYPoint( wxPoint& point, wxPoint& Center ) -{ - point.x -= Center.x; - NEGATE( point.x ); - point.x += Center.x; -} - - -/**************************************************************/ -void MirrorOneStruct( SCH_ITEM* DrawStruct, wxPoint& Center ) -/**************************************************************/ - -/* Given a structure rotate it to 90 degrees refer to the Center point. - */ -{ - int dx; - DrawPolylineStruct* DrawPoly; - DrawJunctionStruct* DrawConnect; - EDA_DrawLineStruct* DrawSegment; - DrawBusEntryStruct* DrawRaccord; - SCH_COMPONENT* DrawLibItem; - DrawSheetStruct* DrawSheet; - Hierarchical_PIN_Sheet_Struct* DrawSheetLabel; - MARKER_SCH* DrawMarker; - DrawNoConnectStruct* DrawNoConnect; - SCH_TEXT* DrawText; - wxPoint px; - WinEDA_SchematicFrame* frame; - - if( !DrawStruct ) - return; - - frame = (WinEDA_SchematicFrame*) wxGetApp().GetTopWindow(); - - switch( DrawStruct->Type() ) - { - case TYPE_NOT_INIT: - break; - - case DRAW_POLYLINE_STRUCT_TYPE: - DrawPoly = (DrawPolylineStruct*) DrawStruct; - for( unsigned ii = 0; ii < DrawPoly->GetCornerCount(); ii++ ) - { - wxPoint point; - point = DrawPoly->m_PolyPoints[ii]; - MirrorYPoint( point, Center ); - DrawPoly->m_PolyPoints[ii] = point; - } - - break; - - case DRAW_SEGMENT_STRUCT_TYPE: - DrawSegment = (EDA_DrawLineStruct*) DrawStruct; - if( (DrawSegment->m_Flags & STARTPOINT) == 0 ) - { - MirrorYPoint( DrawSegment->m_Start, Center ); - } - if( (DrawSegment->m_Flags & ENDPOINT) == 0 ) - { - MirrorYPoint( DrawSegment->m_End, Center ); - } - break; - - case DRAW_BUSENTRY_STRUCT_TYPE: - DrawRaccord = (DrawBusEntryStruct*) DrawStruct; - MirrorYPoint( DrawRaccord->m_Pos, Center ); - NEGATE( DrawRaccord->m_Size.x ); - break; - - case DRAW_JUNCTION_STRUCT_TYPE: - DrawConnect = (DrawJunctionStruct*) DrawStruct; - MirrorYPoint( DrawConnect->m_Pos, Center ); - break; - - case DRAW_MARKER_STRUCT_TYPE: - DrawMarker = (MARKER_SCH*) DrawStruct; - MirrorYPoint( DrawMarker->m_Pos, Center ); - break; - - case DRAW_NOCONNECT_STRUCT_TYPE: - DrawNoConnect = (DrawNoConnectStruct*) DrawStruct; - MirrorYPoint( DrawNoConnect->m_Pos, Center ); - break; - - case TYPE_SCH_TEXT: - case TYPE_SCH_LABEL: - - // Text is not really mirrored; it is moved to a suitable position - // which is the closest position for a true mirrored text - // The center position is mirrored and the text is moved for half horizontal len - DrawText = (SCH_TEXT*) DrawStruct; - px = DrawText->m_Pos; - if( DrawText->m_Orient == 0 ) /* horizontal text */ - dx = DrawText->LenSize( DrawText->m_Text ) / 2; - else if( DrawText->m_Orient == 2 ) /* invert horizontal text*/ - dx = -DrawText->LenSize( DrawText->m_Text ) / 2; - else - dx = 0; - px.x += dx; - MirrorYPoint( px, Center ); - px.x -= dx; - - frame->PutOnGrid( &px ); - DrawText->m_Pos.x = px.x; - break; - - case TYPE_SCH_HIERLABEL: - case TYPE_SCH_GLOBALLABEL: - - // Text is not really mirrored: Orientation is changed - DrawText = (SCH_LABEL*) DrawStruct; - if( DrawText->m_Orient == 0 ) /* horizontal text */ - DrawText->m_Orient = 2; - else if( DrawText->m_Orient == 2 ) /* invert horizontal text*/ - DrawText->m_Orient = 0; - - px = DrawText->m_Pos; - MirrorYPoint( px, Center ); - frame->PutOnGrid( &px ); - DrawText->m_Pos.x = px.x; - break; - - case TYPE_SCH_COMPONENT: - DrawLibItem = (SCH_COMPONENT*) DrawStruct; - dx = DrawLibItem->m_Pos.x; - frame->CmpRotationMiroir( DrawLibItem, NULL, CMP_MIROIR_Y ); - MirrorYPoint( DrawLibItem->m_Pos, Center ); - dx -= DrawLibItem->m_Pos.x; - - for( int ii = 0; ii < DrawLibItem->GetFieldCount(); ii++ ) - { - /* move the fields to the new position because the component itself has moved */ - DrawLibItem->GetField( ii )->m_Pos.x -= dx; - } - - break; - - case DRAW_SHEET_STRUCT_TYPE: - DrawSheet = (DrawSheetStruct*) DrawStruct; - MirrorYPoint( DrawSheet->m_Pos, Center ); - DrawSheet->m_Pos.x -= DrawSheet->m_Size.x; - - DrawSheetLabel = DrawSheet->m_Label; - while( DrawSheetLabel != NULL ) - { - MirrorYPoint( DrawSheetLabel->m_Pos, Center ); - DrawSheetLabel->m_Edge = DrawSheetLabel->m_Edge ? 0 : 1; - DrawSheetLabel = - (Hierarchical_PIN_Sheet_Struct*) DrawSheetLabel->Next(); - } - - break; - - case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: - DrawSheetLabel = (Hierarchical_PIN_Sheet_Struct*) DrawStruct; - MirrorYPoint( DrawSheetLabel->m_Pos, Center ); - break; - - default: - break; - } -} - - -/***************************************************************************** -* Routine to Mirror objects. * -*****************************************************************************/ -void MirrorListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& Center ) -{ - for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) - { - SCH_ITEM* item = (SCH_ITEM*) aItemsList.GetItemData( ii ); - MirrorOneStruct( item, Center ); // Place it in its new position. - item->m_Flags = 0; - } -} - /*****************************************************************************/ -void CopyItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList ) +void DuplicateItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList, const wxPoint aMoveVector ) /*****************************************************************************/ /* Routine to copy a new entity of an object for each object in list and reposition it. @@ -713,7 +518,7 @@ void CopyItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList ) { newitem = DuplicateStruct( (SCH_ITEM*) aItemsList.GetItemData( ii ) ); aItemsList.SetItem( newitem, ii ); - aItemsList.SetItemStatus( IS_NEW, ii ); + aItemsList.SetItemStatus( UR_NEW, ii ); { switch( newitem->Type() ) { @@ -751,7 +556,7 @@ void CopyItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList ) } } - PlaceItemsInList( screen, aItemsList ); + MoveItemsInList( screen, aItemsList, aMoveVector ); } @@ -775,7 +580,7 @@ void DeleteStruct( WinEDA_DrawPanel* panel, wxDC* DC, SCH_ITEM* DrawStruct ) * accessible par la liste globale directement */ frame->SaveCopyInUndoList( (SCH_ITEM*)( (Hierarchical_PIN_Sheet_Struct *) DrawStruct )->GetParent(), - IS_CHANGED ); + UR_CHANGED ); frame->DeleteSheetLabel( DC ? true : false, (Hierarchical_PIN_Sheet_Struct*) DrawStruct ); return; @@ -791,7 +596,7 @@ void DeleteStruct( WinEDA_DrawPanel* panel, wxDC* DC, SCH_ITEM* DrawStruct ) DrawStruct->SetNext( 0 ); DrawStruct->SetBack( 0 ); // Only one struct -> no link - frame->SaveCopyInUndoList( DrawStruct, IS_DELETED ); + frame->SaveCopyInUndoList( DrawStruct, UR_DELETED ); } } @@ -836,10 +641,9 @@ void WinEDA_SchematicFrame::PasteListOfItems( wxDC* DC ) } PICKED_ITEMS_LIST picklist; - picklist.m_UndoRedoType = IS_NEW; // Creates data, and push it as new data in undo item list buffer - ITEM_PICKER picker( NULL, IS_NEW ); + ITEM_PICKER picker( NULL, UR_NEW ); for( unsigned ii = 0; ii < g_BlockSaveDataList.GetCount(); ii++ ) { Struct = DuplicateStruct( (SCH_ITEM*) g_BlockSaveDataList.m_ItemsSelection.GetItemData( ii ) ); @@ -858,9 +662,9 @@ void WinEDA_SchematicFrame::PasteListOfItems( wxDC* DC ) GetScreen()->EEDrawList = Struct; } - SaveCopyInUndoList( picklist, IS_NEW ); + SaveCopyInUndoList( picklist, UR_NEW ); - PlaceItemsInList( GetScreen(), picklist ); + MoveItemsInList( GetScreen(), picklist, GetScreen()->m_BlockLocate.m_MoveVector ); /* clear .m_Flags member for all items */ for( Struct = GetScreen()->EEDrawList; Struct != NULL; Struct = Struct->Next() ) @@ -887,7 +691,7 @@ void DeleteItemsInList( WinEDA_DrawPanel* panel, PICKED_ITEMS_LIST& aItemsList ) { SCH_ITEM* item = (SCH_ITEM*) aItemsList.GetItemData( ii ); itemWrapper.m_Item = item; - itemWrapper.m_UndoRedoStatus = IS_DELETED; + itemWrapper.m_UndoRedoStatus = UR_DELETED; if( item->Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) { /* this item is depending on a sheet, and is not in global list */ @@ -897,7 +701,7 @@ void DeleteItemsInList( WinEDA_DrawPanel* panel, PICKED_ITEMS_LIST& aItemsList ) Hierarchical_PIN_Sheet_Struct* pinlabel = (Hierarchical_PIN_Sheet_Struct*) item; frame->DeleteSheetLabel( false, pinlabel->m_Parent ); itemWrapper.m_Item = pinlabel->m_Parent; - itemWrapper.m_UndoRedoStatus = IS_CHANGED; + itemWrapper.m_UndoRedoStatus = UR_CHANGED; itemsList.PushItem( itemWrapper ); #endif } @@ -912,138 +716,7 @@ void DeleteItemsInList( WinEDA_DrawPanel* panel, PICKED_ITEMS_LIST& aItemsList ) } } - frame->SaveCopyInUndoList( itemsList, IS_DELETED ); -} - - -/***************************************************************************** -* Routine to place a given object. * -*****************************************************************************/ -void PlaceItemsInList( SCH_SCREEN* aScreen, PICKED_ITEMS_LIST& aItemsList ) -{ - wxPoint move_vector; - - move_vector = aScreen->m_Curseur - aScreen->m_BlockLocate.m_BlockLastCursorPosition; - for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) - { - SCH_ITEM* item = (SCH_ITEM*) aItemsList.GetItemData( ii ); - MoveOneStruct( item, move_vector ); - } -} - - -/**************************************************************************/ -void MoveOneStruct( SCH_ITEM* DrawStruct, const wxPoint& move_vector ) -/*************************************************************************/ - -/* Given a structure move it by Dx, Dy. - */ -{ - DrawPolylineStruct* DrawPoly; - DrawJunctionStruct* DrawConnect; - EDA_DrawLineStruct* DrawSegment; - DrawBusEntryStruct* DrawRaccord; - SCH_COMPONENT* DrawLibItem; - DrawSheetStruct* DrawSheet; - Hierarchical_PIN_Sheet_Struct* DrawSheetLabel; - MARKER_SCH* DrawMarker; - DrawNoConnectStruct* DrawNoConnect; - - if( !DrawStruct ) - return; - - switch( DrawStruct->Type() ) - { - case TYPE_NOT_INIT: - break; - - case DRAW_POLYLINE_STRUCT_TYPE: - DrawPoly = (DrawPolylineStruct*) DrawStruct; - for( unsigned ii = 0; ii < DrawPoly->GetCornerCount(); ii++ ) - { - DrawPoly->m_PolyPoints[ii] += move_vector; - } - - break; - - case DRAW_SEGMENT_STRUCT_TYPE: - DrawSegment = (EDA_DrawLineStruct*) DrawStruct; - if( (DrawSegment->m_Flags & STARTPOINT) == 0 ) - { - DrawSegment->m_Start += move_vector; - } - if( (DrawSegment->m_Flags & ENDPOINT) == 0 ) - { - DrawSegment->m_End += move_vector; - } - break; - - case DRAW_BUSENTRY_STRUCT_TYPE: - DrawRaccord = (DrawBusEntryStruct*) DrawStruct; - DrawRaccord->m_Pos += move_vector; - break; - - case DRAW_JUNCTION_STRUCT_TYPE: - DrawConnect = (DrawJunctionStruct*) DrawStruct; - DrawConnect->m_Pos += move_vector; - break; - - case DRAW_MARKER_STRUCT_TYPE: - DrawMarker = (MARKER_SCH*) DrawStruct; - DrawMarker->m_Pos += move_vector; - break; - - case DRAW_NOCONNECT_STRUCT_TYPE: - DrawNoConnect = (DrawNoConnectStruct*) DrawStruct; - DrawNoConnect->m_Pos += move_vector; - break; - - case TYPE_SCH_TEXT: - #define DrawText ( (SCH_TEXT*) DrawStruct ) - DrawText->m_Pos += move_vector; - break; - - case TYPE_SCH_LABEL: - #define DrawLabel ( (SCH_LABEL*) DrawStruct ) - DrawLabel->m_Pos += move_vector; - break; - - case TYPE_SCH_HIERLABEL: - case TYPE_SCH_GLOBALLABEL: - #define DrawGHLabel ( (SCH_LABEL*) DrawStruct ) - DrawGHLabel->m_Pos += move_vector; - break; - - case TYPE_SCH_COMPONENT: - DrawLibItem = (SCH_COMPONENT*) DrawStruct; - DrawLibItem->m_Pos += move_vector; - for( int ii = 0; ii < DrawLibItem->GetFieldCount(); ii++ ) - { - DrawLibItem->GetField( ii )->m_Pos += move_vector; - } - - break; - - case DRAW_SHEET_STRUCT_TYPE: - DrawSheet = (DrawSheetStruct*) DrawStruct; - DrawSheet->m_Pos += move_vector; - DrawSheetLabel = DrawSheet->m_Label; - while( DrawSheetLabel != NULL ) - { - DrawSheetLabel->m_Pos += move_vector; - DrawSheetLabel = DrawSheetLabel->Next(); - } - - break; - - case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: - DrawSheetLabel = (Hierarchical_PIN_Sheet_Struct*) DrawStruct; - DrawSheetLabel->m_Pos += move_vector; - break; - - default: - break; - } + frame->SaveCopyInUndoList( itemsList, UR_DELETED ); } @@ -1113,9 +786,6 @@ SCH_ITEM* DuplicateStruct( SCH_ITEM* DrawStruct ) NewDrawStruct = ( (DrawSheetStruct*) DrawStruct )->GenCopy(); break; - case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: - case DRAW_PART_TEXT_STRUCT_TYPE: - case SCREEN_STRUCT_TYPE: default: { wxString msg; diff --git a/eeschema/bus-wire-junction.cpp b/eeschema/bus-wire-junction.cpp index fc9057da85..9ef10fca83 100644 --- a/eeschema/bus-wire-junction.cpp +++ b/eeschema/bus-wire-junction.cpp @@ -357,7 +357,7 @@ void WinEDA_SchematicFrame::EndSegment( wxDC* DC ) DrawPanel->CursorOn( DC ); // Display schematic cursor - SaveCopyInUndoList( s_OldWiresList, IS_WIRE_IMAGE ); + SaveCopyInUndoList( s_OldWiresList, UR_WIRE_IMAGE ); s_OldWiresList = NULL; GetScreen()->SetModify(); @@ -548,7 +548,7 @@ DrawJunctionStruct* WinEDA_SchematicFrame::CreateNewJunctionStruct( GetScreen()->EEDrawList = NewJunction; GetScreen()->SetModify(); if( PutInUndoList ) - SaveCopyInUndoList( NewJunction, IS_NEW ); + SaveCopyInUndoList( NewJunction, UR_NEW ); return NewJunction; } @@ -572,7 +572,7 @@ DrawNoConnectStruct* WinEDA_SchematicFrame::CreateNewNoConnectStruct( wxDC* DC ) NewNoConnect->SetNext( GetScreen()->EEDrawList ); GetScreen()->EEDrawList = NewNoConnect; GetScreen()->SetModify(); - SaveCopyInUndoList( NewNoConnect, IS_NEW ); + SaveCopyInUndoList( NewNoConnect, UR_NEW ); return NewNoConnect; } @@ -734,7 +734,7 @@ void WinEDA_SchematicFrame::RepeatDrawItem( wxDC* DC ) GetScreen()->EEDrawList = g_ItemToRepeat; TestDanglingEnds( GetScreen()->EEDrawList, NULL ); RedrawOneStruct( DrawPanel, DC, g_ItemToRepeat, GR_DEFAULT_DRAWMODE ); - SaveCopyInUndoList( g_ItemToRepeat, IS_NEW ); + SaveCopyInUndoList( g_ItemToRepeat, UR_NEW ); g_ItemToRepeat->m_Flags = 0; // GetScreen()->Curseur = new_pos; diff --git a/eeschema/busentry.cpp b/eeschema/busentry.cpp index 10a065bcf6..29af2e3fe5 100644 --- a/eeschema/busentry.cpp +++ b/eeschema/busentry.cpp @@ -145,7 +145,7 @@ void WinEDA_SchematicFrame::SetBusEntryShape( wxDC* DC, /* Put old item in undo list if it is not currently in edit */ if( BusEntry->m_Flags == 0 ) - SaveCopyInUndoList( BusEntry, IS_CHANGED ); + SaveCopyInUndoList( BusEntry, UR_CHANGED ); RedrawOneStruct( DrawPanel, DC, BusEntry, g_XorMode ); diff --git a/eeschema/class_sch_cmp_field.cpp b/eeschema/class_sch_cmp_field.cpp index ee2132f882..9687565317 100644 --- a/eeschema/class_sch_cmp_field.cpp +++ b/eeschema/class_sch_cmp_field.cpp @@ -416,7 +416,7 @@ void SCH_CMP_FIELD::Place( WinEDA_SchematicFrame* frame, wxDC* DC ) if( g_ItemToUndoCopy && ( g_ItemToUndoCopy->Type() == component->Type()) ) { component->SwapData( (SCH_COMPONENT*) g_ItemToUndoCopy ); - frame->SaveCopyInUndoList( component, IS_CHANGED ); + frame->SaveCopyInUndoList( component, UR_CHANGED ); component->SwapData( (SCH_COMPONENT*) g_ItemToUndoCopy ); } diff --git a/eeschema/class_text-label.cpp b/eeschema/class_text-label.cpp index 0905d9e41d..9005921552 100644 --- a/eeschema/class_text-label.cpp +++ b/eeschema/class_text-label.cpp @@ -454,7 +454,7 @@ void SCH_TEXT::Place( WinEDA_SchematicFrame* frame, wxDC* DC ) SwapData( (SCH_TEXT*) g_ItemToUndoCopy ); /* save in undo list */ - frame->SaveCopyInUndoList( this, IS_CHANGED ); + frame->SaveCopyInUndoList( this, UR_CHANGED ); /* restore new values */ SwapData( (SCH_TEXT*) g_ItemToUndoCopy ); diff --git a/eeschema/cleanup.cpp b/eeschema/cleanup.cpp index 3584dc19bb..72e4795042 100644 --- a/eeschema/cleanup.cpp +++ b/eeschema/cleanup.cpp @@ -155,7 +155,7 @@ void BreakSegment(SCH_SCREEN * aScreen, wxPoint aBreakpoint, /* Ici il faut couper le segment en 2 */ if( aPicklist ) // First: put copy of the old segment in undo list { - ITEM_PICKER picker((SCH_ITEM*) segment->GenCopy(), IS_CHANGED); + ITEM_PICKER picker((SCH_ITEM*) segment->GenCopy(), UR_CHANGED); picker.m_Link = segment; aPicklist->PushItem(picker); } @@ -167,7 +167,7 @@ void BreakSegment(SCH_SCREEN * aScreen, wxPoint aBreakpoint, DrawList = NewSegment; if( aPicklist ) { - ITEM_PICKER picker(NewSegment, IS_NEW); + ITEM_PICKER picker(NewSegment, UR_NEW); aPicklist->PushItem(picker); } } diff --git a/eeschema/component_class.cpp b/eeschema/component_class.cpp index 3015756688..7ff38b28d2 100644 --- a/eeschema/component_class.cpp +++ b/eeschema/component_class.cpp @@ -615,7 +615,7 @@ void SCH_COMPONENT::Place( WinEDA_SchematicFrame* frame, wxDC* DC ) SwapData( (SCH_COMPONENT*) g_ItemToUndoCopy ); /* save in undo list */ - frame->SaveCopyInUndoList( this, IS_CHANGED ); + frame->SaveCopyInUndoList( this, UR_CHANGED ); /* restore new values */ SwapData( (SCH_COMPONENT*) g_ItemToUndoCopy ); diff --git a/eeschema/delete.cpp b/eeschema/delete.cpp index 02a68586c9..6b210aa883 100644 --- a/eeschema/delete.cpp +++ b/eeschema/delete.cpp @@ -138,7 +138,7 @@ void WinEDA_SchematicFrame::DeleteConnection( bool DeleteFullConnection ) /* Locate all the wires, bus or junction under the mouse cursor, and put them in a list * of items to delete */ - ITEM_PICKER picker(NULL, IS_DELETED); + ITEM_PICKER picker(NULL, UR_DELETED); SCH_SCREEN* screen = (SCH_SCREEN*) GetScreen(); SCH_ITEM* savedEEDrawList = screen->EEDrawList; // Save the list entry point of this screen DelStruct = GetScreen()->EEDrawList; diff --git a/eeschema/dialog_edit_component_in_schematic.cpp b/eeschema/dialog_edit_component_in_schematic.cpp index 60efe4e78a..f6a2a40219 100644 --- a/eeschema/dialog_edit_component_in_schematic.cpp +++ b/eeschema/dialog_edit_component_in_schematic.cpp @@ -104,7 +104,7 @@ DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC( wxWindow copySelectedFieldToPanel(); wxToolTip::Enable( true ); - + if( GetSizer() ) { GetSizer()->SetSizeHints( this ); @@ -243,7 +243,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnOKButtonClick( wxCommandEvent& event /* save old cmp in undo list if not already in edit, or moving ... */ if( m_Cmp->m_Flags == 0 ) - m_Parent->SaveCopyInUndoList( m_Cmp, IS_CHANGED ); + m_Parent->SaveCopyInUndoList( m_Cmp, UR_CHANGED ); // change all field positions from relative to absolute for( unsigned i = 0; im_Flags == 0 ) - SaveCopyInUndoList( Cmp, IS_CHANGED ); + SaveCopyInUndoList( Cmp, UR_CHANGED ); wxString newtext = Field->m_Text; DrawPanel->m_IgnoreMouseEvents = TRUE; @@ -270,7 +270,7 @@ void WinEDA_SchematicFrame::RotateCmpField( SCH_CMP_FIELD* Field, wxDC* DC ) /* save old cmp in undo list if not already in edit, or moving ... */ if( Field->m_Flags == 0 ) - SaveCopyInUndoList( Cmp, IS_CHANGED ); + SaveCopyInUndoList( Cmp, UR_CHANGED ); Field->m_AddExtraText = flag; Field->Draw( DrawPanel, DC, wxPoint(0,0), g_XorMode ); @@ -310,7 +310,7 @@ void WinEDA_SchematicFrame::EditComponentReference( SCH_COMPONENT* Cmp, wxDC* DC { /* save old cmp in undo list if not already in edit, or moving ... */ if( Cmp->m_Flags == 0 ) - SaveCopyInUndoList( Cmp, IS_CHANGED ); + SaveCopyInUndoList( Cmp, UR_CHANGED ); Cmp->SetRef(GetSheet(), ref); Cmp->GetField( REFERENCE )->m_AddExtraText = flag; @@ -349,7 +349,7 @@ void WinEDA_SchematicFrame::EditComponentValue( SCH_COMPONENT* Cmp, wxDC* DC ) { /* save old cmp in undo list if not already in edit, or moving ... */ if( Cmp->m_Flags == 0 ) - SaveCopyInUndoList( Cmp, IS_CHANGED ); + SaveCopyInUndoList( Cmp, UR_CHANGED ); TextField->Draw( DrawPanel, DC, wxPoint(0,0), g_XorMode ); TextField->m_Text = message; @@ -388,7 +388,7 @@ void WinEDA_SchematicFrame::EditComponentFootprint( SCH_COMPONENT* Cmp, wxDC* DC // save old cmp in undo list if not already in edit, or moving ... if( Cmp->m_Flags == 0 ) - SaveCopyInUndoList( Cmp, IS_CHANGED ); + SaveCopyInUndoList( Cmp, UR_CHANGED ); Cmp->GetField( FOOTPRINT )->Draw( DrawPanel, DC, wxPoint(0,0), g_XorMode ); // move the field if it was new. diff --git a/eeschema/edit_label.cpp b/eeschema/edit_label.cpp index 09f38688e6..5fc3c244c3 100644 --- a/eeschema/edit_label.cpp +++ b/eeschema/edit_label.cpp @@ -39,7 +39,7 @@ void DialogLabelEditor::TextPropertiesAccept( wxCommandEvent& event ) /* save old text in undo list if not already in edit */ if( m_CurrentText->m_Flags == 0 ) - m_Parent->SaveCopyInUndoList( m_CurrentText, IS_CHANGED ); + m_Parent->SaveCopyInUndoList( m_CurrentText, UR_CHANGED ); text = m_TextLabel->GetValue(); if( !text.IsEmpty() ) @@ -162,7 +162,7 @@ void WinEDA_SchematicFrame::ChangeTextOrient( SCH_TEXT* TextStruct, wxDC* DC ) /* save old text in undo list if is not already in edit */ if( TextStruct->m_Flags == 0 ) - SaveCopyInUndoList( TextStruct, IS_CHANGED ); + SaveCopyInUndoList( TextStruct, UR_CHANGED ); /* Effacement du texte en cours */ DrawPanel->CursorOff( DC ); @@ -432,7 +432,7 @@ void WinEDA_SchematicFrame::ConvertTextType( SCH_TEXT* Text, */ if( (flags & IS_NEW) == 0 ) { - SaveCopyInUndoList( newtext, IS_NEW ); + SaveCopyInUndoList( newtext, UR_NEW ); } else { diff --git a/eeschema/eeredraw.cpp b/eeschema/eeredraw.cpp index b09aab61ad..6f14f44fb4 100644 --- a/eeschema/eeredraw.cpp +++ b/eeschema/eeredraw.cpp @@ -164,25 +164,23 @@ void RedrawOneStruct( WinEDA_DrawPanel* panel, wxDC* DC, * de structures. * Utilisee dans les deplacements de blocs */ -void DrawStructsInGhost( WinEDA_DrawPanel* panel, wxDC* DC, - SCH_ITEM* DrawStruct, int dx, int dy ) +void DrawStructsInGhost( WinEDA_DrawPanel * aPanel, wxDC * aDC, SCH_ITEM * aItem, const wxPoint & aOffset ) { int DrawMode = g_XorMode; int width = g_DrawDefaultLineThickness; + GRSetDrawMode( aDC, DrawMode ); - GRSetDrawMode( DC, DrawMode ); - - switch( DrawStruct->Type() ) + switch( aItem->Type() ) { case DRAW_POLYLINE_STRUCT_TYPE: { - DrawPolylineStruct* Struct = (DrawPolylineStruct*) DrawStruct; - GRMoveTo( Struct->m_PolyPoints[0].x + dx, - Struct->m_PolyPoints[0].y + dy ); + DrawPolylineStruct* Struct = (DrawPolylineStruct*) aItem; + GRMoveTo( Struct->m_PolyPoints[0].x + aOffset.x, + Struct->m_PolyPoints[0].y + aOffset.y ); for( unsigned ii = 1; ii < Struct->GetCornerCount(); ii++ ) - GRLineTo( &panel->m_ClipBox, DC, Struct->m_PolyPoints[ii].x + dx, - Struct->m_PolyPoints[ii].y + dy, width, g_GhostColor ); + GRLineTo( &aPanel->m_ClipBox, aDC, Struct->m_PolyPoints[ii].x + aOffset.x, + Struct->m_PolyPoints[ii].y + aOffset.y, width, g_GhostColor ); break; } @@ -190,10 +188,10 @@ void DrawStructsInGhost( WinEDA_DrawPanel* panel, wxDC* DC, case DRAW_SEGMENT_STRUCT_TYPE: { EDA_DrawLineStruct* Struct; - Struct = (EDA_DrawLineStruct*) DrawStruct; + Struct = (EDA_DrawLineStruct*) aItem; if( (Struct->m_Flags & STARTPOINT) == 0 ) { - GRMoveTo( Struct->m_Start.x + dx, Struct->m_Start.y + dy ); + GRMoveTo( Struct->m_Start.x + aOffset.x, Struct->m_Start.y + aOffset.y ); } else { @@ -201,12 +199,12 @@ void DrawStructsInGhost( WinEDA_DrawPanel* panel, wxDC* DC, } if( (Struct->m_Flags & ENDPOINT) == 0 ) { - GRLineTo( &panel->m_ClipBox, DC, Struct->m_End.x + dx, - Struct->m_End.y + dy, width, g_GhostColor ); + GRLineTo( &aPanel->m_ClipBox, aDC, Struct->m_End.x + aOffset.x, + Struct->m_End.y + aOffset.y, width, g_GhostColor ); } else { - GRLineTo( &panel->m_ClipBox, DC, Struct->m_End.x, + GRLineTo( &aPanel->m_ClipBox, aDC, Struct->m_End.x, Struct->m_End.y, width, g_GhostColor ); } break; @@ -214,27 +212,27 @@ void DrawStructsInGhost( WinEDA_DrawPanel* panel, wxDC* DC, case DRAW_BUSENTRY_STRUCT_TYPE: { - DrawBusEntryStruct* Struct = (DrawBusEntryStruct*) DrawStruct; - int xx = Struct->m_Pos.x + dx, yy = Struct->m_Pos.y + dy; - GRMoveTo( xx, yy ); - GRLineTo( &panel->m_ClipBox, DC, Struct->m_Size.x + xx, - Struct->m_Size.y + yy, width, g_GhostColor ); + DrawBusEntryStruct* Struct = (DrawBusEntryStruct*) aItem; + wxPoint start = Struct->m_Pos + aOffset; + GRMoveTo( start.x, start.y ); + GRLineTo( &aPanel->m_ClipBox, aDC, Struct->m_Size.x + start.x, + Struct->m_Size.y + start.y, width, g_GhostColor ); break; } case DRAW_JUNCTION_STRUCT_TYPE: { DrawJunctionStruct* Struct; - Struct = (DrawJunctionStruct*) DrawStruct; - Struct->Draw( panel, DC, wxPoint(0,0), DrawMode, g_GhostColor ); + Struct = (DrawJunctionStruct*) aItem; + Struct->Draw( aPanel, aDC, aOffset, DrawMode, g_GhostColor ); break; } case TYPE_SCH_TEXT: { SCH_TEXT* Struct; - Struct = (SCH_TEXT*) DrawStruct; - Struct->Draw( panel, DC, wxPoint( dx, dy ), DrawMode, g_GhostColor ); + Struct = (SCH_TEXT*) aItem; + Struct->Draw( aPanel, aDC, aOffset, DrawMode, g_GhostColor ); break; } @@ -243,16 +241,16 @@ void DrawStructsInGhost( WinEDA_DrawPanel* panel, wxDC* DC, case TYPE_SCH_HIERLABEL: { SCH_LABEL* Struct; - Struct = (SCH_LABEL*) DrawStruct; - Struct->Draw( panel, DC, wxPoint( dx, dy ), DrawMode, g_GhostColor ); + Struct = (SCH_LABEL*) aItem; + Struct->Draw( aPanel, aDC, aOffset, DrawMode, g_GhostColor ); break; } case DRAW_NOCONNECT_STRUCT_TYPE: { DrawNoConnectStruct* Struct; - Struct = (DrawNoConnectStruct*) DrawStruct; - Struct->Draw( panel, DC, wxPoint( dx, dy ), DrawMode, g_GhostColor ); + Struct = (DrawNoConnectStruct*) aItem; + Struct->Draw( aPanel, aDC, aOffset, DrawMode, g_GhostColor ); break; } @@ -260,23 +258,23 @@ void DrawStructsInGhost( WinEDA_DrawPanel* panel, wxDC* DC, { EDA_LibComponentStruct* LibEntry; SCH_COMPONENT* Struct; - Struct = (SCH_COMPONENT*) DrawStruct; + Struct = (SCH_COMPONENT*) aItem; LibEntry = FindLibPart( Struct->m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); if( LibEntry == NULL ) break; - DrawingLibInGhost( panel, DC, LibEntry, Struct, Struct->m_Pos.x + dx, - Struct->m_Pos.y + dy, Struct->m_Multi, + DrawingLibInGhost( aPanel, aDC, LibEntry, Struct, Struct->m_Pos.x + aOffset.x, + Struct->m_Pos.y + aOffset.y, Struct->m_Multi, Struct->m_Convert, g_GhostColor, FALSE ); break; } case DRAW_SHEET_STRUCT_TYPE: { - DrawSheetStruct* Struct = (DrawSheetStruct*) DrawStruct; - GRRect( &panel->m_ClipBox, DC, Struct->m_Pos.x + dx, - Struct->m_Pos.y + dy, Struct->m_Pos.x + Struct->m_Size.x + dx, - Struct->m_Pos.y + Struct->m_Size.y + dy, width, g_GhostColor ); + DrawSheetStruct* Struct = (DrawSheetStruct*) aItem; + GRRect( &aPanel->m_ClipBox, aDC, Struct->m_Pos.x + aOffset.x, + Struct->m_Pos.y + aOffset.y, Struct->m_Pos.x + Struct->m_Size.x + aOffset.x, + Struct->m_Pos.y + Struct->m_Size.y + aOffset.y, width, g_GhostColor ); break; } diff --git a/eeschema/geometric_transforms.cpp b/eeschema/geometric_transforms.cpp new file mode 100644 index 0000000000..aa275a5635 --- /dev/null +++ b/eeschema/geometric_transforms.cpp @@ -0,0 +1,328 @@ +/****************************************************/ +/* BLOCK.CPP */ +/* Gestion des Operations sur Blocks et Effacements */ +/****************************************************/ + +#include "fctsys.h" +#include "appl_wxstruct.h" +#include "common.h" +#include "class_drawpanel.h" +#include "program.h" +#include "libcmp.h" +#include "general.h" +#include "class_marker_sch.h" + +#include "protos.h" + +/* Variables Locales */ + +/* Fonctions exportees */ +void MoveItemsInList( SCH_SCREEN* aScreen, PICKED_ITEMS_LIST& aItemsList, const wxPoint aMoveVector ); +void MirrorListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& aMirrorPoint ); +void MirrorOneStruct( SCH_ITEM* DrawStruct, wxPoint& aMirrorPoint ); + + +/* +* Small function to mirror (relative to a vertiacl axis at aMirrorPoint.x position) +* a given point +*/ +static void MirrorYPoint( wxPoint& point, wxPoint& aMirrorPoint ) +{ + point.x -= aMirrorPoint.x; + NEGATE( point.x ); + point.x += aMirrorPoint.x; +} + + +/**************************************************************/ +void MirrorOneStruct( SCH_ITEM* DrawStruct, wxPoint& aMirrorPoint ) +/**************************************************************/ + +/* Given a structure rotate it to 90 degrees refer to the aMirrorPoint point. + */ +{ + int dx; + DrawPolylineStruct* DrawPoly; + DrawJunctionStruct* DrawConnect; + EDA_DrawLineStruct* DrawSegment; + DrawBusEntryStruct* DrawRaccord; + SCH_COMPONENT* DrawLibItem; + DrawSheetStruct* DrawSheet; + Hierarchical_PIN_Sheet_Struct* DrawSheetLabel; + MARKER_SCH* DrawMarker; + DrawNoConnectStruct* DrawNoConnect; + SCH_TEXT* DrawText; + wxPoint px; + + if( !DrawStruct ) + return; + + switch( DrawStruct->Type() ) + { + case TYPE_NOT_INIT: + break; + + case DRAW_POLYLINE_STRUCT_TYPE: + DrawPoly = (DrawPolylineStruct*) DrawStruct; + for( unsigned ii = 0; ii < DrawPoly->GetCornerCount(); ii++ ) + { + wxPoint point; + point = DrawPoly->m_PolyPoints[ii]; + MirrorYPoint( point, aMirrorPoint ); + DrawPoly->m_PolyPoints[ii] = point; + } + + break; + + case DRAW_SEGMENT_STRUCT_TYPE: + DrawSegment = (EDA_DrawLineStruct*) DrawStruct; + if( (DrawSegment->m_Flags & STARTPOINT) == 0 ) + { + MirrorYPoint( DrawSegment->m_Start, aMirrorPoint ); + } + if( (DrawSegment->m_Flags & ENDPOINT) == 0 ) + { + MirrorYPoint( DrawSegment->m_End, aMirrorPoint ); + } + break; + + case DRAW_BUSENTRY_STRUCT_TYPE: + DrawRaccord = (DrawBusEntryStruct*) DrawStruct; + MirrorYPoint( DrawRaccord->m_Pos, aMirrorPoint ); + NEGATE( DrawRaccord->m_Size.x ); + break; + + case DRAW_JUNCTION_STRUCT_TYPE: + DrawConnect = (DrawJunctionStruct*) DrawStruct; + MirrorYPoint( DrawConnect->m_Pos, aMirrorPoint ); + break; + + case DRAW_MARKER_STRUCT_TYPE: + DrawMarker = (MARKER_SCH*) DrawStruct; + MirrorYPoint( DrawMarker->m_Pos, aMirrorPoint ); + break; + + case DRAW_NOCONNECT_STRUCT_TYPE: + DrawNoConnect = (DrawNoConnectStruct*) DrawStruct; + MirrorYPoint( DrawNoConnect->m_Pos, aMirrorPoint ); + break; + + case TYPE_SCH_TEXT: + case TYPE_SCH_LABEL: + + // Text is NOT really mirrored; it is moved to a suitable position + // which is the closest position for a true mirrored text + // The center position is mirrored and the text is moved for half horizontal len + DrawText = (SCH_TEXT*) DrawStruct; + px = DrawText->m_Pos; + if( DrawText->m_Orient == 0 ) /* horizontal text */ + dx = DrawText->LenSize( DrawText->m_Text ) / 2; + else if( DrawText->m_Orient == 2 ) /* invert horizontal text*/ + dx = -DrawText->LenSize( DrawText->m_Text ) / 2; + else + dx = 0; + px.x += dx; + MirrorYPoint( px, aMirrorPoint ); + px.x -= dx; + DrawText->m_Pos.x = px.x; + break; + + case TYPE_SCH_HIERLABEL: + case TYPE_SCH_GLOBALLABEL: + + // Text is not really mirrored: Orientation is changed + DrawText = (SCH_LABEL*) DrawStruct; + if( DrawText->m_Orient == 0 ) /* horizontal text */ + DrawText->m_Orient = 2; + else if( DrawText->m_Orient == 2 ) /* invert horizontal text*/ + DrawText->m_Orient = 0; + + px = DrawText->m_Pos; + MirrorYPoint( px, aMirrorPoint ); + DrawText->m_Pos.x = px.x; + break; + + case TYPE_SCH_COMPONENT: + { + DrawLibItem = (SCH_COMPONENT*) DrawStruct; + dx = DrawLibItem->m_Pos.x; + WinEDA_SchematicFrame* frame = (WinEDA_SchematicFrame*) wxGetApp().GetTopWindow(); + frame->CmpRotationMiroir( DrawLibItem, NULL, CMP_MIROIR_Y ); + MirrorYPoint( DrawLibItem->m_Pos, aMirrorPoint ); + dx -= DrawLibItem->m_Pos.x; + + for( int ii = 0; ii < DrawLibItem->GetFieldCount(); ii++ ) + { + /* move the fields to the new position because the component itself has moved */ + DrawLibItem->GetField( ii )->m_Pos.x -= dx; + } + } + break; + + case DRAW_SHEET_STRUCT_TYPE: + DrawSheet = (DrawSheetStruct*) DrawStruct; + MirrorYPoint( DrawSheet->m_Pos, aMirrorPoint ); + DrawSheet->m_Pos.x -= DrawSheet->m_Size.x; + + DrawSheetLabel = DrawSheet->m_Label; + while( DrawSheetLabel != NULL ) + { + MirrorYPoint( DrawSheetLabel->m_Pos, aMirrorPoint ); + DrawSheetLabel->m_Edge = DrawSheetLabel->m_Edge ? 0 : 1; + DrawSheetLabel = + (Hierarchical_PIN_Sheet_Struct*) DrawSheetLabel->Next(); + } + + break; + + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: + DrawSheetLabel = (Hierarchical_PIN_Sheet_Struct*) DrawStruct; + MirrorYPoint( DrawSheetLabel->m_Pos, aMirrorPoint ); + break; + + default: + break; + } +} + + +/***************************************************************************** +* Routine to Mirror objects. * +*****************************************************************************/ +void MirrorListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& aMirrorPoint ) +{ + for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) + { + SCH_ITEM* item = (SCH_ITEM*) aItemsList.GetItemData( ii ); + MirrorOneStruct( item, aMirrorPoint ); // Place it in its new position. + item->m_Flags = 0; + } +} + + + +/***************************************************************************** +* Routine to place a given object. * +*****************************************************************************/ +void MoveItemsInList( SCH_SCREEN* aScreen, PICKED_ITEMS_LIST& aItemsList, const wxPoint aMoveVector ) +{ + for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) + { + SCH_ITEM* item = (SCH_ITEM*) aItemsList.GetItemData( ii ); + MoveOneStruct( item, aMoveVector ); + } +} + + +/**************************************************************************/ +void MoveOneStruct( SCH_ITEM* aItem, const wxPoint& aMoveVector ) +/*************************************************************************/ +/* Given a structure move it by aMoveVector. + */ +{ + DrawPolylineStruct* DrawPoly; + DrawJunctionStruct* DrawConnect; + EDA_DrawLineStruct* DrawSegment; + DrawBusEntryStruct* DrawRaccord; + SCH_COMPONENT* DrawLibItem; + DrawSheetStruct* DrawSheet; + Hierarchical_PIN_Sheet_Struct* DrawSheetLabel; + MARKER_SCH* DrawMarker; + DrawNoConnectStruct* DrawNoConnect; + + if( !aItem ) + return; + + switch( aItem->Type() ) + { + case TYPE_NOT_INIT: + break; + + case DRAW_POLYLINE_STRUCT_TYPE: + DrawPoly = (DrawPolylineStruct*) aItem; + for( unsigned ii = 0; ii < DrawPoly->GetCornerCount(); ii++ ) + { + DrawPoly->m_PolyPoints[ii] += aMoveVector; + } + + break; + + case DRAW_SEGMENT_STRUCT_TYPE: + DrawSegment = (EDA_DrawLineStruct*) aItem; + if( (DrawSegment->m_Flags & STARTPOINT) == 0 ) + { + DrawSegment->m_Start += aMoveVector; + } + if( (DrawSegment->m_Flags & ENDPOINT) == 0 ) + { + DrawSegment->m_End += aMoveVector; + } + break; + + case DRAW_BUSENTRY_STRUCT_TYPE: + DrawRaccord = (DrawBusEntryStruct*) aItem; + DrawRaccord->m_Pos += aMoveVector; + break; + + case DRAW_JUNCTION_STRUCT_TYPE: + DrawConnect = (DrawJunctionStruct*) aItem; + DrawConnect->m_Pos += aMoveVector; + break; + + case DRAW_MARKER_STRUCT_TYPE: + DrawMarker = (MARKER_SCH*) aItem; + DrawMarker->m_Pos += aMoveVector; + break; + + case DRAW_NOCONNECT_STRUCT_TYPE: + DrawNoConnect = (DrawNoConnectStruct*) aItem; + DrawNoConnect->m_Pos += aMoveVector; + break; + + case TYPE_SCH_TEXT: + #define DrawText ( (SCH_TEXT*) aItem ) + DrawText->m_Pos += aMoveVector; + break; + + case TYPE_SCH_LABEL: + #define DrawLabel ( (SCH_LABEL*) aItem ) + DrawLabel->m_Pos += aMoveVector; + break; + + case TYPE_SCH_HIERLABEL: + case TYPE_SCH_GLOBALLABEL: + #define DrawGHLabel ( (SCH_LABEL*) aItem ) + DrawGHLabel->m_Pos += aMoveVector; + break; + + case TYPE_SCH_COMPONENT: + DrawLibItem = (SCH_COMPONENT*) aItem; + DrawLibItem->m_Pos += aMoveVector; + for( int ii = 0; ii < DrawLibItem->GetFieldCount(); ii++ ) + { + DrawLibItem->GetField( ii )->m_Pos += aMoveVector; + } + + break; + + case DRAW_SHEET_STRUCT_TYPE: + DrawSheet = (DrawSheetStruct*) aItem; + DrawSheet->m_Pos += aMoveVector; + DrawSheetLabel = DrawSheet->m_Label; + while( DrawSheetLabel != NULL ) + { + DrawSheetLabel->m_Pos += aMoveVector; + DrawSheetLabel = DrawSheetLabel->Next(); + } + + break; + + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: + DrawSheetLabel = (Hierarchical_PIN_Sheet_Struct*) aItem; + DrawSheetLabel->m_Pos += aMoveVector; + break; + + default: + break; + } +} diff --git a/eeschema/getpart.cpp b/eeschema/getpart.cpp index 05e045b614..51cbdc0548 100644 --- a/eeschema/getpart.cpp +++ b/eeschema/getpart.cpp @@ -231,7 +231,7 @@ SCH_COMPONENT* WinEDA_SchematicFrame::Load_Component( wxDC* DC, curr_field->m_Name = ( ii < FIELD1 ) ? ReturnDefaultFieldName( ii ) : EntryField->m_Name; } - DrawStructsInGhost( DrawPanel, DC, Component, 0, 0 ); + DrawStructsInGhost( DrawPanel, DC, Component, wxPoint(0,0) ); MsgPanel->EraseMsgBox(); Component->DisplayInfo( this ); @@ -255,14 +255,14 @@ static void ShowWhileMoving( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) /* Effacement du composant */ if( erase ) { - DrawStructsInGhost( panel, DC, Component, 0, 0 ); + DrawStructsInGhost( panel, DC, Component, wxPoint(0,0) ); } move_vector.x = screen->m_Curseur.x - Component->m_Pos.x; move_vector.y = screen->m_Curseur.y - Component->m_Pos.y; MoveOneStruct( Component, move_vector ); - DrawStructsInGhost( panel, DC, Component, 0, 0 ); + DrawStructsInGhost( panel, DC, Component, wxPoint(0,0) ); } @@ -283,7 +283,7 @@ void WinEDA_SchematicFrame::CmpRotationMiroir( { DrawPanel->CursorOff( DC ); if( DrawComponent->m_Flags ) - DrawStructsInGhost( DrawPanel, DC, DrawComponent, 0, 0 ); + DrawStructsInGhost( DrawPanel, DC, DrawComponent, wxPoint(0,0) ); else { DrawPanel->PostDirtyRect( DrawComponent->GetBoundingBox() ); @@ -296,7 +296,7 @@ void WinEDA_SchematicFrame::CmpRotationMiroir( if( DC ) { if( DrawComponent->m_Flags ) - DrawStructsInGhost( DrawPanel, DC, DrawComponent, 0, 0 ); + DrawStructsInGhost( DrawPanel, DC, DrawComponent, wxPoint(0,0) ); else DrawComponent->Draw( DrawPanel, DC, wxPoint( 0, 0 ), @@ -378,7 +378,7 @@ void WinEDA_SchematicFrame::SelPartUnit( SCH_COMPONENT* DrawComponent, /* Efface le trace precedent */ if( DrawComponent->m_Flags ) - DrawStructsInGhost( DrawPanel, DC, DrawComponent, 0, 0 ); + DrawStructsInGhost( DrawPanel, DC, DrawComponent, wxPoint(0,0) ); else DrawComponent->Draw( DrawPanel, DC, wxPoint( 0, 0 ), g_XorMode ); @@ -388,10 +388,9 @@ void WinEDA_SchematicFrame::SelPartUnit( SCH_COMPONENT* DrawComponent, /* Redessine le composant dans la nouvelle position */ if( DrawComponent->m_Flags ) - DrawStructsInGhost( DrawPanel, DC, DrawComponent, 0, 0 ); + DrawStructsInGhost( DrawPanel, DC, DrawComponent, wxPoint(0,0) ); else - DrawComponent->Draw( DrawPanel, DC, wxPoint( 0, - 0 ), GR_DEFAULT_DRAWMODE ); + DrawComponent->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); TestDanglingEnds( GetScreen()->EEDrawList, DC ); GetScreen()->SetModify(); @@ -421,7 +420,7 @@ void WinEDA_SchematicFrame::ConvertPart( SCH_COMPONENT* DrawComponent, /* Efface le trace precedent */ if( DrawComponent->m_Flags ) - DrawStructsInGhost( DrawPanel, DC, DrawComponent, 0, 0 ); + DrawStructsInGhost( DrawPanel, DC, DrawComponent, wxPoint(0,0) ); else DrawComponent->Draw( DrawPanel, DC, wxPoint( 0, 0 ), g_XorMode ); @@ -431,10 +430,9 @@ void WinEDA_SchematicFrame::ConvertPart( SCH_COMPONENT* DrawComponent, /* Redessine le composant dans la nouvelle position */ if( DrawComponent->m_Flags & IS_MOVED ) - DrawStructsInGhost( DrawPanel, DC, DrawComponent, 0, 0 ); + DrawStructsInGhost( DrawPanel, DC, DrawComponent, wxPoint(0,0) ); else - DrawComponent->Draw( DrawPanel, DC, wxPoint( 0, - 0 ), GR_DEFAULT_DRAWMODE ); + DrawComponent->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); TestDanglingEnds( GetScreen()->EEDrawList, DC ); GetScreen()->SetModify(); @@ -508,7 +506,7 @@ void WinEDA_SchematicFrame::StartMovePart( SCH_COMPONENT* Component, Component->m_Flags |= IS_MOVED; // omit redrawing the component, erase only DrawPanel->PostDirtyRect( Component->GetBoundingBox() ); - DrawStructsInGhost( DrawPanel, DC, Component, 0, 0 ); + DrawStructsInGhost( DrawPanel, DC, Component, wxPoint(0,0) ); #else diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index 5dee7cffdc..65d4281d1f 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -331,7 +331,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, case TYPE_SCH_COMPONENT: if( DrawStruct->m_Flags == 0 ) { - SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, IS_CHANGED ); + SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, UR_CHANGED ); RefreshToolBar = TRUE; } @@ -345,7 +345,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, case TYPE_SCH_HIERLABEL: if( DrawStruct->m_Flags == 0 ) { - SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, IS_CHANGED ); + SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, UR_CHANGED ); RefreshToolBar = TRUE; } ChangeTextOrient( (SCH_TEXT*) DrawStruct, DC ); @@ -364,7 +364,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, { if( DrawStruct->m_Flags == 0 ) { - SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, IS_CHANGED ); + SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, UR_CHANGED ); RefreshToolBar = TRUE; } CmpRotationMiroir( (SCH_COMPONENT*) DrawStruct, DC, CMP_MIROIR_Y ); @@ -378,7 +378,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, { if( DrawStruct->m_Flags == 0 ) { - SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, IS_CHANGED ); + SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, UR_CHANGED ); RefreshToolBar = TRUE; } CmpRotationMiroir( (SCH_COMPONENT*) DrawStruct, DC, CMP_MIROIR_X ); @@ -392,7 +392,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, { if( DrawStruct->m_Flags == 0 ) { - SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, IS_CHANGED ); + SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, UR_CHANGED ); RefreshToolBar = TRUE; } CmpRotationMiroir( (SCH_COMPONENT*) DrawStruct, DC, CMP_NORMAL ); diff --git a/eeschema/protos.h b/eeschema/protos.h index 3e3ae14e1e..76daea39b1 100644 --- a/eeschema/protos.h +++ b/eeschema/protos.h @@ -166,8 +166,7 @@ Hierarchical_PIN_Sheet_Struct * LocateAnyPinSheet(const wxPoint & RefPos, void DrawDanglingSymbol(WinEDA_DrawPanel * panel,wxDC * DC, const wxPoint & pos, int Color); -void DrawStructsInGhost(WinEDA_DrawPanel * panel, wxDC * DC, - SCH_ITEM * DrawStruct, int dx, int dy ); +void DrawStructsInGhost(WinEDA_DrawPanel * aPanel, wxDC * aDC, SCH_ITEM * aItem, const wxPoint & aOffset ); void SetHighLightStruct(SCH_ITEM *HighLight); void RedrawActiveWindow(WinEDA_DrawPanel * panel, wxDC * DC); void RedrawStructList(WinEDA_DrawPanel * panel, wxDC * DC, SCH_ITEM *Structs, int DrawMode, diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index a3426aca34..69631e4194 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -341,7 +341,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) PICKED_ITEMS_LIST picklistForUndo; BreakSegment( screen, screen->m_Curseur, &picklistForUndo ); if( picklistForUndo.GetCount() ) - SaveCopyInUndoList( picklistForUndo, IS_NEW | IS_CHANGED ); + SaveCopyInUndoList( picklistForUndo, UR_UNSPECIFIED ); TestDanglingEnds( screen->EEDrawList, &dc ); } break; @@ -485,7 +485,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) DrawPanel->MouseToCursorSchema(); if( screen->GetCurItem()->m_Flags == 0 ) - SaveCopyInUndoList( (SCH_ITEM*) screen->GetCurItem(), IS_CHANGED ); + SaveCopyInUndoList( (SCH_ITEM*) screen->GetCurItem(), UR_CHANGED ); CmpRotationMiroir( (SCH_COMPONENT*) screen->GetCurItem(), diff --git a/eeschema/schematic_undo_redo.cpp b/eeschema/schematic_undo_redo.cpp index 792a9e9e5e..aebd78ad03 100644 --- a/eeschema/schematic_undo_redo.cpp +++ b/eeschema/schematic_undo_redo.cpp @@ -12,6 +12,10 @@ #include "protos.h" #include "class_marker_sch.h" + +// Imported functions +void MirrorOneStruct( SCH_ITEM* DrawStruct, wxPoint& aMirrorPoint ); + /* Functions to undo and redo edit commands. * commmands to undo are stored in CurrentScreen->m_UndoList * commmands to redo are stored in CurrentScreen->m_RedoList @@ -172,20 +176,21 @@ void SwapData( EDA_BaseStruct* aItem, EDA_BaseStruct* aImage ) /***********************************************************************/ -void WinEDA_SchematicFrame::SaveCopyInUndoList( SCH_ITEM* aItemToCopy, - int aCommandType ) +void WinEDA_SchematicFrame::SaveCopyInUndoList( SCH_ITEM* aItemToCopy, + UndoRedoOpType aCommandType, + const wxPoint& aTransformPoint ) /***********************************************************************/ /** function SaveCopyInUndoList * Create a copy of the current schematic item, and put it in the undo list. * * flag_type_command = - * IS_CHANGED - * IS_NEW - * IS_DELETED - * IS_WIRE_IMAGE + * UR_CHANGED + * UR_NEW + * UR_DELETED + * UR_WIRE_IMAGE * - * If it is a delete command, items are put on list with the .Flags member set to IS_DELETED. + * If it is a delete command, items are put on list with the .Flags member set to UR_DELETED. * When it will be really deleted, the EEDrawList and the subhierarchy will be deleted. * If it is only a copy, the EEDrawList and the subhierarchy must NOT be deleted. * @@ -193,28 +198,29 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( SCH_ITEM* aItemToCopy, * Edit wires and busses is a bit complex. * because when a new wire is added, modifications in wire list * (wire concatenation) there are modified items, deleted items and new items - * so flag_type_command is IS_WIRE_IMAGE: the struct ItemToCopy is a list of wires + * so flag_type_command is UR_WIRE_IMAGE: the struct ItemToCopy is a list of wires * saved in Undo List (for Undo or Redo commands, saved wires will be exchanged with current wire list */ { SCH_ITEM* CopyOfItem; PICKED_ITEMS_LIST* commandToUndo = new PICKED_ITEMS_LIST(); + commandToUndo->m_TransformPoint = aTransformPoint; - commandToUndo->m_UndoRedoType = aCommandType; ITEM_PICKER itemWrapper( aItemToCopy, aCommandType ); switch( aCommandType ) { - case IS_CHANGED: /* Create a copy of schematic */ + case UR_CHANGED: /* Create a copy of schematic */ CopyOfItem = DuplicateStruct( aItemToCopy ); itemWrapper.m_Item = CopyOfItem; itemWrapper.m_Link = aItemToCopy; commandToUndo->PushItem( itemWrapper ); break; - case IS_NEW: - case IS_WIRE_IMAGE: - case IS_DELETED: + case UR_NEW: + case UR_WIRE_IMAGE: + case UR_DELETED: + case UR_MOVED: commandToUndo->PushItem( itemWrapper ); break; @@ -237,21 +243,23 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( SCH_ITEM* aItemToCopy, /** function SaveCopyInUndoList * @param aItemsList = a PICKED_ITEMS_LIST of items to save - * @param aTypeCommand = type of comand ( IS_CHANGED, IS_NEW, IS_DELETED ... + * @param aTypeCommand = type of comand ( UR_CHANGED, UR_NEW, UR_DELETED ... */ -void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, int aTypeCommand ) +void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, + UndoRedoOpType aTypeCommand, + const wxPoint& aTransformPoint ) { SCH_ITEM* CopyOfItem; PICKED_ITEMS_LIST* commandToUndo = new PICKED_ITEMS_LIST(); + commandToUndo->m_TransformPoint = aTransformPoint; - commandToUndo->m_UndoRedoType = aTypeCommand; ITEM_PICKER itemWrapper; for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) { - SCH_ITEM* ItemToCopy = (SCH_ITEM*) aItemsList.GetItemData( ii ); - int command = aItemsList.GetItemStatus( ii ); - if( command == 0 ) + SCH_ITEM* ItemToCopy = (SCH_ITEM*) aItemsList.GetItemData( ii ); + UndoRedoOpType command = aItemsList.GetItemStatus( ii ); + if( command == UR_UNSPECIFIED ) { command = aTypeCommand; } @@ -259,20 +267,21 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, i itemWrapper.m_UndoRedoStatus = command; switch( command ) { - case IS_CHANGED: /* Create a copy of schematic */ + case UR_CHANGED: /* Create a copy of schematic */ CopyOfItem = DuplicateStruct( ItemToCopy ); itemWrapper.m_Item = CopyOfItem; itemWrapper.m_Link = ItemToCopy; commandToUndo->PushItem( itemWrapper ); break; - case IS_NEW: - case IS_NEW | IS_CHANGED: // when more than one item, some are new, some are changed + case UR_MOVED: + case UR_MIRRORED_Y: + case UR_NEW: commandToUndo->PushItem( itemWrapper ); break; - case IS_DELETED: - ItemToCopy->m_Flags = IS_DELETED; + case UR_DELETED: + ItemToCopy->m_Flags = UR_DELETED; commandToUndo->PushItem( itemWrapper ); break; @@ -344,26 +353,38 @@ void WinEDA_SchematicFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList ) SCH_ITEM* image = (SCH_ITEM*) itemWrapper.m_Link; switch( itemWrapper.m_UndoRedoStatus ) { - case IS_CHANGED: /* Exchange old and new data for each item */ + case UR_CHANGED: /* Exchange old and new data for each item */ SwapData( item, image ); break; - case IS_NEW: /* new items are deleted */ - aList->m_UndoRedoType = IS_DELETED; - aList->SetItemStatus( IS_DELETED, ii ); + case UR_NEW: /* new items are deleted */ + aList->SetItemStatus( UR_DELETED, ii ); GetScreen()->RemoveFromDrawList( item ); - item->m_Flags = IS_DELETED; + item->m_Flags = UR_DELETED; break; - case IS_DELETED: /* deleted items are put in EEdrawList, as new items */ - aList->m_UndoRedoType = IS_NEW; - aList->SetItemStatus( IS_NEW, ii ); + case UR_DELETED: /* deleted items are put in EEdrawList, as new items */ + aList->SetItemStatus( UR_NEW, ii ); item->SetNext( GetScreen()->EEDrawList ); GetScreen()->EEDrawList = item; item->m_Flags = 0; break; - case IS_WIRE_IMAGE: + case UR_MOVED: + { + wxPoint moveVector = - aList->m_TransformPoint; + MoveOneStruct( item, moveVector ); + } + break; + + case UR_MIRRORED_Y: + { + wxPoint mirrorPoint = aList->m_TransformPoint; + MirrorOneStruct( item, mirrorPoint ); + } + break; + + case UR_WIRE_IMAGE: /* Exchange the current wires and the old wires */ alt_item = GetScreen()->ExtractWires( false ); aList->SetItem( alt_item, ii ); @@ -422,14 +443,14 @@ bool WinEDA_SchematicFrame::GetSchematicFromUndoList() } -/*********************************************************/ +/***********************************************************************************/ void SCH_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount ) -/*********************************************************/ +/**********************************************************************************/ /** Function ClearUndoORRedoList * free the undo or redo list from List element * Wrappers are deleted. - * datas pointed by wrappers are deleted if not flagged IS_NEW + * datas pointed by wrappers are deleted if not flagged UR_NEW * because they are copy of used data or they are not in use (DELETED) * @param aList = the UNDO_REDO_CONTAINER to clear * @param aItemCount = the count of items to remove. < 0 for all items @@ -437,8 +458,6 @@ void SCH_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount * So this function can be called to remove old commands */ { - int CmdType; - if( aItemCount == 0 ) return; @@ -451,30 +470,36 @@ void SCH_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount break; PICKED_ITEMS_LIST* curr_cmd = aList.m_CommandsList[0]; aList.m_CommandsList.erase( aList.m_CommandsList.begin() ); - CmdType = curr_cmd->m_UndoRedoType; - // Delete items is they are not flagged IS_NEW + // Delete items is they are not flagged UR_NEW, or if this is a block operation while( 1 ) { ITEM_PICKER wrapper = curr_cmd->PopItem(); EDA_BaseStruct* item = wrapper.m_Item; if( item == NULL ) // No more item in list. break; - if( wrapper.m_UndoRedoStatus == IS_WIRE_IMAGE ) + switch( wrapper.m_UndoRedoStatus ) { + case UR_WIRE_IMAGE: while( item ) { EDA_BaseStruct* nextitem = item->Next(); delete item; item = nextitem; } - } - else - { - if( (wrapper.m_UndoRedoStatus & IS_NEW) == 0 ) - { - delete item; - } + + break; + + case UR_MOVED: + case UR_MIRRORED_X: + case UR_MIRRORED_Y: + case UR_ROTATED: + case UR_NEW: // Do nothing, items are in use + break; + + default: + delete item; + break; } } diff --git a/include/class_undoredo_container.h b/include/class_undoredo_container.h index e465f6263a..2c46e933ee 100644 --- a/include/class_undoredo_container.h +++ b/include/class_undoredo_container.h @@ -45,10 +45,26 @@ * and they are undo/redo by the same command */ +/* Type of undo/redo operations + * each type must be redo/undoed by a specfic operation + */ +enum UndoRedoOpType { + UR_UNSPECIFIED = 0, // illegal + UR_CHANGED, // params of items have a value changed: undo is made by exchange values with a copy of these values + UR_NEW, // new item, undo by changing in deleted + UR_DELETED, // deleted item, undo by changing in deleted + UR_MOVED, // moved item, undo by move it + UR_MIRRORED_X, // mirrored item, undo by mirror X + UR_MIRRORED_Y, // mirrored item, undo by mirror Y + UR_ROTATED, // Rotated item, undo by rotating it + UR_FLIPPED, // flipped (board items only), undo by flipping it + UR_WIRE_IMAGE // Specific to eeschema: handle wires changes +}; + class ITEM_PICKER { public: - int m_UndoRedoStatus; // type of operation to undo/redo for this item + UndoRedoOpType m_UndoRedoStatus; /* type of operation to undo/redo for this item */ EDA_BaseStruct* m_Item; /* Pointer on the schematic or board item that is concerned, * or in undo redo commands, the copy of an edited item. */ @@ -60,10 +76,10 @@ public: */ public: - ITEM_PICKER( EDA_BaseStruct* aItem = NULL, int aUndoRedoStatus = 0 ) + ITEM_PICKER( EDA_BaseStruct* aItem = NULL, UndoRedoOpType aUndoRedoStatus = UR_UNSPECIFIED ) { m_UndoRedoStatus = aUndoRedoStatus; - m_Item = aItem; + m_Item = aItem; m_Link = NULL; } }; @@ -76,28 +92,28 @@ public: class PICKED_ITEMS_LIST { public: - int m_UndoRedoType; // type of operation to undo/redo - // UNSPECIFIED (0), IS_NEW, IS_DELETED, IS_CHANGED - wxPoint m_TransformPoint; // used to undo redo command by the same command: - // we usually need to know the rotate point or the move vector + UndoRedoOpType m_Status; /* info about operation to undo/redo for this item. can be UR_UNSPECIFIED */ + wxPoint m_TransformPoint; /* used to undo redo command by the same command: + * we usually need to know the rotate point or the move vector + */ private: std::vector m_ItemsList; public: PICKED_ITEMS_LIST(); ~PICKED_ITEMS_LIST(); - void PushItem( ITEM_PICKER& aItem ); + void PushItem( ITEM_PICKER& aItem ); ITEM_PICKER PopItem(); /** Function ClearItemsList * delete only the list of EDA_BaseStruct * pointers, NOT the pointed data itself */ - void ClearItemsList(); + void ClearItemsList(); /** Function ClearListAndDeleteItems * delete only the list of EDA_BaseStruct * pointers, AND the data pinted by m_Item */ - void ClearListAndDeleteItems(); + void ClearListAndDeleteItems(); unsigned GetCount() const { @@ -105,21 +121,21 @@ public: } - ITEM_PICKER GetItemWrapper( unsigned int aIdx ); + ITEM_PICKER GetItemWrapper( unsigned int aIdx ); EDA_BaseStruct* GetItemData( unsigned int aIdx ); EDA_BaseStruct* GetImage( unsigned int aIdx ); - int GetItemStatus( unsigned int aIdx ); + UndoRedoOpType GetItemStatus( unsigned int aIdx ); bool SetItem( EDA_BaseStruct* aItem, unsigned aIdx ); - bool SetItem( EDA_BaseStruct* aItem, int aStatus, unsigned aIdx ); + bool SetItem( EDA_BaseStruct* aItem, UndoRedoOpType aStatus, unsigned aIdx ); bool SetLink( EDA_BaseStruct* aItem, unsigned aIdx ); - bool SetItemStatus( int aStatus, unsigned aIdx ); + bool SetItemStatus( UndoRedoOpType aStatus, unsigned aIdx ); bool RemoveItem( unsigned aIdx ); /** Function CopyList * copy all data from aSource * Items picked are not copied. just pointer on them are copied */ - void CopyList(const PICKED_ITEMS_LIST & aSource); + void CopyList( const PICKED_ITEMS_LIST& aSource ); }; /** diff --git a/include/common.h b/include/common.h index e4f0cb24fb..624f39cf28 100644 --- a/include/common.h +++ b/include/common.h @@ -339,8 +339,6 @@ int ReturnValueFromTextCtrl( const wxTextCtrl& TextCtr, int Internal_Unit ); /* return a String List from a string, whith a specific splitter*/ -//WX_DECLARE_LIST( wxString, StringList ); -//WX_DEFINE_LIST( StringList ); wxArrayString* wxStringSplit(wxString txt, wxChar splitter); /** diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index bc24c83900..fc1dc9efa5 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -8,6 +8,7 @@ #include "wxstruct.h" #include "param_config.h" +#include "class_undoredo_container.h" class WinEDA_LibeditFrame; @@ -33,7 +34,7 @@ class LibDrawField; class SCH_CMP_FIELD; class LibDrawPin; class DrawJunctionStruct; -class PICKED_ITEMS_LIST; + /*******************************/ /* class WinEDA_SchematicFrame */ @@ -368,8 +369,26 @@ private: /* Undo - redo */ public: - void SaveCopyInUndoList( SCH_ITEM* ItemToCopy, int aTypeCommand ); - void SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, int aTypeCommand ); + + /** Function SaveCopyInUndoList. + * Creates a new entry in undo list of commands. + * add a picker to handle aItemToCopy + * @param aItemToCopy = the schematic item modified by the command to undo + * @param aTypeCommand = command type (see enum UndoRedoOpType) + * @param aTransformPoint = the reference point of the transformation, for commands like move + */ + void SaveCopyInUndoList( SCH_ITEM* aItemToCopy, UndoRedoOpType aTypeCommand, + const wxPoint& aTransformPoint = wxPoint(0,0) ); + + /** Function SaveCopyInUndoList (overloaded). + * Creates a new entry in undo list of commands. + * add a list of pickers to handle a list of items + * @param aItemsList = the list of items modified by the command to undo + * @param aTypeCommand = command type (see enum UndoRedoOpType) + * @param aTransformPoint = the reference point of the transformation, for commands like move + */ + void SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, UndoRedoOpType aTypeCommand, + const wxPoint& aTransformPoint = wxPoint(0,0) ); private: void PutDataInPreviousState( PICKED_ITEMS_LIST* aList );