29using namespace std::placeholders;
105 int preExisting = commandToUndo->
GetCount();
107 for(
unsigned ii = 0; ii < aItemsList.
GetCount(); ii++ )
110 for(
unsigned ii = preExisting; ii < commandToUndo->
GetCount(); ii++ )
115 if( command == UNDO_REDO::UNSPECIFIED )
117 command = aCommandType;
125 case UNDO_REDO::CHANGED:
126 case UNDO_REDO::DRILLORIGIN:
127 case UNDO_REDO::GRIDORIGIN:
134 case UNDO_REDO::NEWITEM:
135 case UNDO_REDO::DELETED:
136 case UNDO_REDO::PAGESETTINGS:
137 case UNDO_REDO::REGROUP:
138 case UNDO_REDO::UNGROUP:
142 wxFAIL_MSG( wxString::Format( wxT(
"Unrecognized undo command: %X" ), command ) );
159 delete commandToUndo;
261 bool not_found =
false;
262 bool reBuild_ratsnest =
false;
263 bool deep_reBuild_ratsnest =
false;
264 bool solder_mask_dirty =
false;
273 enum ITEM_CHANGE_TYPE
280 std::unordered_map<EDA_ITEM*, ITEM_CHANGE_TYPE> item_changes;
282 auto update_item_change_state =
283 [&](
EDA_ITEM* item, ITEM_CHANGE_TYPE change_type )
285 auto item_itr = item_changes.find( item );
287 if( item_itr == item_changes.end() )
290 item_changes.insert( { item, change_type } );
295 switch( item_itr->second )
297 case ITEM_CHANGE_TYPE::ADDED:
299 if( change_type == ITEM_CHANGE_TYPE::DELETED )
303 item_changes.erase( item_itr );
305 else if( change_type == ITEM_CHANGE_TYPE::ADDED )
308 wxASSERT_MSG(
false, wxT(
"UndoRedo: should not add already added item" ) );
314 case ITEM_CHANGE_TYPE::DELETED:
318 wxASSERT_MSG(
false, wxT(
"UndoRedo: should not alter already deleted item" ) );
321 case ITEM_CHANGE_TYPE::CHANGED:
323 if( change_type == ITEM_CHANGE_TYPE::DELETED )
325 item_itr->second = ITEM_CHANGE_TYPE::DELETED;
327 else if( change_type == ITEM_CHANGE_TYPE::ADDED )
332 wxT(
"UndoRedo: should not add already changed item" ) );
345 for(
int ii = (
int) aList->
GetCount() - 1; ii >= 0 ; ii-- )
358 if( status != UNDO_REDO::DELETED
359 && status != UNDO_REDO::REGROUP
360 && status != UNDO_REDO::UNGROUP
361 && status != UNDO_REDO::DRILLORIGIN
362 && status != UNDO_REDO::GRIDORIGIN
363 && status != UNDO_REDO::PAGESETTINGS )
379 switch( eda_item->
Type() )
382 deep_reBuild_ratsnest =
true;
390 reBuild_ratsnest =
true;
394 reBuild_ratsnest =
true;
395 deep_reBuild_ratsnest =
true;
402 switch( eda_item->
Type() )
405 solder_mask_dirty =
true;
409 solder_mask_dirty =
true;
418 LSET layers =
static_cast<BOARD_ITEM*
>( eda_item )->GetLayerSet();
421 solder_mask_dirty =
true;
432 case UNDO_REDO::CHANGED:
448 view->Remove( item );
466 RECURSE_MODE::NO_RECURSE );
470 view->Hide( item,
false );
476 update_item_change_state( item, ITEM_CHANGE_TYPE::CHANGED );
480 case UNDO_REDO::NEWITEM:
483 update_item_change_state( eda_item, ITEM_CHANGE_TYPE::DELETED );
486 view->Remove( eda_item );
492 case UNDO_REDO::DELETED:
498 update_item_change_state( eda_item, ITEM_CHANGE_TYPE::ADDED );
501 view->Add( eda_item );
505 case UNDO_REDO::REGROUP:
516 group->RemoveItem( boardItem );
522 case UNDO_REDO::UNGROUP:
533 group->AddItem( boardItem );
538 case UNDO_REDO::DRILLORIGIN:
539 case UNDO_REDO::GRIDORIGIN:
555 case UNDO_REDO::PAGESETTINGS:
561 *item = std::move( alt_item );
566 wxFAIL_MSG( wxString::Format( wxT(
"PutDataInPreviousState() error (unknown code %X)" ),
580 wxMessageBox(
_(
"Incomplete undo/redo operation: some items not found" ) );
584 if( reBuild_ratsnest || deep_reBuild_ratsnest )
591 if( solder_mask_dirty )
603 std::vector<BOARD_ITEM*> added_items, deleted_items, changed_items;
605 for(
auto& [item, changeType] : item_changes )
609 case ITEM_CHANGE_TYPE::ADDED:
610 added_items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
613 case ITEM_CHANGE_TYPE::DELETED:
614 deleted_items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
617 case ITEM_CHANGE_TYPE::CHANGED:
618 changed_items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
633 view->Update( shape );
639 checkHatching( item );
643 footprint->RunOnChildren(
646 checkHatching( item );
648 RECURSE_MODE::RECURSE );
651 if( added_items.size() > 0 || deleted_items.size() > 0 || changed_items.size() > 0 )
658 if( aItemCount == 0 )
669 for(
int ii = 0; ii < aItemCount; ii++ )
689 "Item on undo/redo list not owned by undo/redo!" );
692 static_cast<BOARD_ITEM*
>( item )->SetParentGroup(
nullptr );
static EDA_ITEM * MakeImage(EDA_ITEM *aItem)
static void DoSetDrillOrigin(KIGFX::VIEW *aView, PCB_BASE_FRAME *aFrame, EDA_ITEM *aItem, const VECTOR2D &aPoint)
Abstract interface for BOARD_ITEMs capable of storing other items inside.
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.
PCB_GROUP * GetParentGroup() const
FOOTPRINT * GetParentFootprint() const
BOARD_ITEM * GetItem(const KIID &aID) const
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
void OnItemsCompositeUpdate(std::vector< BOARD_ITEM * > &aAddedItems, std::vector< BOARD_ITEM * > &aRemovedItems, std::vector< BOARD_ITEM * > &aChangedItems)
Notify the board and its listeners that items on the board have been modified in a composite operatio...
void IncrementTimeStamp()
const FOOTPRINTS & Footprints() const
COMPONENT_CLASS_MANAGER & GetComponentClassManager()
Gets the component class manager.
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
const DRAWINGS & Drawings() const
void InvalidateComponentClasses()
Invalidates any caches component classes and recomputes caches if required.
void RebuildRequiredCaches(FOOTPRINT *aFootprint=nullptr) const
Rebuilds any caches that may be required by custom assignment rules.
static DELETED_BOARD_ITEM * GetInstance()
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
Specify 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
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
bool IsHatchedFill() const
static const TOOL_EVENT UndoRedoPreEvent
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT UndoRedoPostEvent
bool IsBOARD_ITEM() const
LSET is a set of PCB_LAYER_IDs.
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:
EDA_ITEM * GetItem(const KIID &aId) const override
Fetch an item by KIID.
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).
virtual bool RemoveItem(BOARD_ITEM *aItem)
Remove item from group.
virtual bool AddItem(BOARD_ITEM *aItem)
Add item to group.
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.
void SetDescription(const wxString &aDescription)
UNDO_REDO GetPickedItemStatus(unsigned int aIdx) const
ITEM_PICKER GetItemWrapper(unsigned int aIdx) const
EDA_ITEM * GetPickedItemLink(unsigned int aIdx) const
wxString GetDescription() const
bool RemovePicker(unsigned aIdx)
Remove one entry (one picker) from the list of picked items.
KIID GetPickedItemGroupId(unsigned int aIdx) const
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...
bool SetPickedItemGroupId(KIID aId, unsigned aIdx)
Set the group id associated to a given picked item.
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
#define UR_TRANSIENT
indicates the item is owned by the undo/redo stack
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_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)
UNDO_REDO
Undo Redo considerations: Basically we have 3 cases New item Deleted item Modified item there is also...