29using namespace std::placeholders;
115 if( aItem ==
static_cast<BOARD_ITEM*
>( item ) )
121 if( aItem ==
static_cast<BOARD_ITEM*
>( item ) )
127 if( aItem ==
static_cast<BOARD_ITEM*
>( item ) )
133 if( aItem ==
static_cast<BOARD_ITEM*
>( item ) )
147 if( aItem ==
static_cast<BOARD_ITEM*
>( item ) )
159 int preExisting = commandToUndo->
GetCount();
164 for(
unsigned ii = 0; ii < aItemsList.
GetCount(); ii++ )
177 for(
unsigned j = 0; j < commandToUndo->
GetCount(); j++ )
197 child->ClearEditFlags();
200 pad->ClearEditFlags();
205 ITEM_PICKER picker(
nullptr, item, UNDO_REDO::CHANGED );
217 commandToUndo->
PushItem( curr_picker );
221 for(
unsigned ii = preExisting; ii < commandToUndo->
GetCount(); ii++ )
226 if( command == UNDO_REDO::UNSPECIFIED )
228 command = aCommandType;
236 case UNDO_REDO::CHANGED:
237 case UNDO_REDO::DRILLORIGIN:
238 case UNDO_REDO::GRIDORIGIN:
251 case UNDO_REDO::NEWITEM:
252 case UNDO_REDO::DELETED:
253 case UNDO_REDO::PAGESETTINGS:
254 case UNDO_REDO::REGROUP:
255 case UNDO_REDO::UNGROUP:
259 wxFAIL_MSG( wxString::Format( wxT(
"SaveCopyInUndoList() error (unknown code %X)" ),
277 delete commandToUndo;
375 bool not_found =
false;
376 bool reBuild_ratsnest =
false;
377 bool deep_reBuild_ratsnest =
false;
378 bool solder_mask_dirty =
false;
391 for(
int ii = aList->
GetCount() - 1; ii >= 0 ; ii-- )
404 if( status != UNDO_REDO::DELETED
405 && status != UNDO_REDO::DRILLORIGIN
406 && status != UNDO_REDO::GRIDORIGIN
407 && status != UNDO_REDO::PAGESETTINGS )
412 wxASSERT_MSG(
false, wxT(
"Item in the undo buffer does not exist" ) );
426 switch( eda_item->
Type() )
429 deep_reBuild_ratsnest =
true;
437 reBuild_ratsnest =
true;
441 reBuild_ratsnest =
true;
442 deep_reBuild_ratsnest =
true;
449 switch( eda_item->
Type() )
452 solder_mask_dirty =
true;
456 solder_mask_dirty =
true;
465 LSET layers =
static_cast<BOARD_ITEM*
>( eda_item )->GetLayerSet();
468 solder_mask_dirty =
true;
479 case UNDO_REDO::CHANGED:
486 view->Remove( item );
487 connectivity->Remove( item );
502 view->Hide( item,
false );
503 connectivity->Add( item );
508 case UNDO_REDO::NEWITEM:
513 view->Remove( eda_item );
517 case UNDO_REDO::DELETED:
522 view->Add( eda_item );
529 case UNDO_REDO::REGROUP:
531 static_cast<BOARD_ITEM*
>( eda_item )->SetParentGroup(
nullptr );
534 case UNDO_REDO::UNGROUP:
542 case UNDO_REDO::DRILLORIGIN:
543 case UNDO_REDO::GRIDORIGIN:
558 case UNDO_REDO::PAGESETTINGS:
569 wxFAIL_MSG( wxString::Format( wxT(
"PutDataInPreviousState() error (unknown code %X)" ),
576 wxMessageBox(
_(
"Incomplete undo/redo operation: some items not found" ) );
580 if( reBuild_ratsnest || deep_reBuild_ratsnest )
583 if( solder_mask_dirty )
596 if( aItemCount == 0 )
605 for(
unsigned ii = 0; ii < icnt; ii++ )
622 static_cast<BOARD_ITEM*
>( item )->SetParentGroup(
nullptr );
static void DoSetDrillOrigin(KIGFX::VIEW *aView, PCB_BASE_FRAME *aFrame, EDA_ITEM *aItem, const VECTOR2D &aPoint)
virtual void Remove(BOARD_ITEM *aItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL)=0
Removes an item from the container.
virtual void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false)=0
Adds an item to the container.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
void SetParentGroup(PCB_GROUP *aGroup)
void SwapItemData(BOARD_ITEM *aImage)
Swap data between aItem and aImage.
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
BOARD_ITEM_CONTAINER * GetParent() const
Information pertinent to a Pcbnew printed circuit board.
void OnItemChanged(BOARD_ITEM *aItem)
Notify the board and its listeners that an item on the board has been modified in some way.
const NETINFO_LIST & GetNetInfo() const
FOOTPRINTS & Footprints()
void IncrementTimeStamp()
GROUPS & Groups()
The groups must maintain the following invariants.
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
void Restore(EDA_DRAW_FRAME *aFrame, KIGFX::VIEW *aView=nullptr)
virtual void PushCommandToUndoList(PICKED_ITEMS_LIST *aItem)
Add a command to undo in the undo list.
virtual int GetRedoCommandCount() const
UNDO_REDO_CONTAINER m_undoList
UNDO_REDO_LIST
Specifies whether we are interacting with the undo or redo stacks.
virtual PICKED_ITEMS_LIST * PopCommandFromRedoList()
Return the last command to undo and remove it from list, nothing is deleted.
UNDO_REDO_CONTAINER m_redoList
virtual PICKED_ITEMS_LIST * PopCommandFromUndoList()
Return the last command to undo and remove it from list, nothing is deleted.
virtual int GetUndoCommandCount() const
virtual void PushCommandToRedoList(PICKED_ITEMS_LIST *aItem)
Add a command to redo in the redo list.
bool IsType(FRAME_T aType) const
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
void SetLink(EDA_ITEM *aItem)
LSET is a set of PCB_LAYER_IDs.
Wrapper class, so you can iterate through NETINFO_ITEM*s, not std::pair<int/wxString,...
Container for NETINFO_ITEM elements, which are the nets.
void ClearUndoORRedoList(UNDO_REDO_LIST whichList, int aItemCount=-1) override
Free the undo or redo list from List element.
void RestoreCopyFromUndoList(wxCommandEvent &aEvent)
Undo the last edit:
void saveCopyInUndoList(PICKED_ITEMS_LIST *commandToUndo, const PICKED_ITEMS_LIST &aItemsList, UNDO_REDO aCommandType)
void AppendCopyToUndoList(const PICKED_ITEMS_LIST &aItemsList, UNDO_REDO aCommandType) override
As SaveCopyInUndoList, but appends the changes to the last undo item on the stack.
void SaveCopyInUndoList(EDA_ITEM *aItemToCopy, UNDO_REDO aTypeCommand) override
Create a new entry in undo list of commands.
void ClearListAndDeleteItems(PICKED_ITEMS_LIST *aList)
void RollbackFromUndo()
Perform an undo of the last edit without logging a corresponding redo.
bool UndoRedoBlocked() const
Check if the undo and redo operations are currently blocked.
void PutDataInPreviousState(PICKED_ITEMS_LIST *aList)
Used in undo or redo command.
void RestoreCopyFromRedoList(wxCommandEvent &aEvent)
Redo the last edit:
void OnModify() override
Must be called after a change in order to set the "modify" flag and update other data structures and ...
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
void Compile_Ratsnest(bool aDisplayStatus)
Create the entire board ratsnest.
static void DoSetGridOrigin(KIGFX::VIEW *aView, PCB_BASE_FRAME *aFrame, EDA_ITEM *originViewItem, const VECTOR2D &aPoint)
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
A set of BOARD_ITEMs (i.e., without duplicates).
A holder to handle information on schematic or board items.
bool SetPickedItemStatus(UNDO_REDO aStatus, unsigned aIdx)
Set the type of undo/redo operation for a given picked item.
void PushItem(const ITEM_PICKER &aItem)
Push aItem to the top of the list.
UNDO_REDO GetPickedItemStatus(unsigned int aIdx) const
ITEM_PICKER GetItemWrapper(unsigned int aIdx) const
EDA_ITEM * GetPickedItemLink(unsigned int aIdx) const
bool RemovePicker(unsigned aIdx)
Remove one entry (one picker) from the list of picked items.
unsigned GetCount() const
void ReversePickersListOrder()
Reverse the order of pickers stored in this list.
bool SetPickedItemLink(EDA_ITEM *aLink, unsigned aIdx)
Set the link associated to a given picked item.
void ClearListAndDeleteItems(std::function< void(EDA_ITEM *)> aItemDeleter)
Delete the list of pickers AND the data pointed by #m_PickedItem or #m_PickedItemLink according to th...
EDA_ITEM * GetPickedItem(unsigned int aIdx) const
A holder to handle a list of undo (or redo) commands.
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
Handle a list of polygons defining a copper zone.
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Class to handle a set of BOARD_ITEMs.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_NETINFO_T
class NETINFO_ITEM, a description of a net
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
static bool TestForExistingItem(BOARD *aPcb, BOARD_ITEM *aItem)
Test if aItem exists somewhere in undo/redo lists of items.
UNDO_REDO
Undo Redo considerations: Basically we have 3 cases New item Deleted item Modified item there is also...