KiCad PCB EDA Suite
symbol_editor_undo_redo.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2007 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2014-2021 KiCad Developers, see AUTHORS.TXT for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <symbol_edit_frame.h>
27#include <widgets/lib_tree.h>
28#include <symbol_tree_pane.h>
29#include <tool/tool_manager.h>
30#include <tools/ee_actions.h>
32
33void SYMBOL_EDIT_FRAME::SaveCopyInUndoList( EDA_ITEM* aItem, UNDO_REDO aUndoType, bool aAppend )
34{
35 wxASSERT_MSG( !aAppend, "Append not needed/supported for symbol editor" );
36
37 if( !aItem )
38 return;
39
40 LIB_SYMBOL* copyItem;
41 PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST();
42
43 copyItem = new LIB_SYMBOL( * (LIB_SYMBOL*) aItem );
44
45 // Clear current flags (which can be temporary set by a current edit command).
46 copyItem->ClearTempFlags();
47 copyItem->ClearEditFlags();
48 copyItem->SetFlags( UR_TRANSIENT );
49
50 ITEM_PICKER wrapper( GetScreen(), copyItem, aUndoType );
51 lastcmd->PushItem( wrapper );
52 PushCommandToUndoList( lastcmd );
53
54 // Clear redo list, because after new save there is no redo to do.
56}
57
58
60{
61 if( GetRedoCommandCount() <= 0 )
62 return;
63
65
66 // Load the last redo entry
68 ITEM_PICKER redoWrapper = redoCommand->PopItem();
69 delete redoCommand;
70 LIB_SYMBOL* symbol = (LIB_SYMBOL*) redoWrapper.GetItem();
71 wxCHECK( symbol, /* void */ );
72 symbol->ClearFlags( UR_TRANSIENT );
73 UNDO_REDO undoRedoType = redoWrapper.GetStatus();
74
75 // Store the current symbol in the undo buffer
76 PICKED_ITEMS_LIST* undoCommand = new PICKED_ITEMS_LIST();
77 LIB_SYMBOL* oldSymbol = m_symbol;
78 oldSymbol->SetFlags( UR_TRANSIENT );
79 ITEM_PICKER undoWrapper( GetScreen(), oldSymbol, undoRedoType );
80 undoCommand->PushItem( undoWrapper );
81 PushCommandToUndoList( undoCommand );
82
83 // Do not delete the previous symbol by calling SetCurSymbol( symbol )
84 // which calls delete <previous symbol>.
85 // <previous symbol> is now put in undo list and is owned by this list
86 // Just set the current symbol to the symbol which come from the redo list
87 m_symbol = symbol;
88
89 if( undoRedoType == UNDO_REDO::LIB_RENAME )
90 {
91 wxString lib = GetCurLib();
92 m_libMgr->UpdateSymbolAfterRename( symbol, oldSymbol->GetName(), lib );
93
94 // Reselect the renamed symbol
95 m_treePane->GetLibTree()->SelectLibId( LIB_ID( lib, symbol->GetName() ) );
96 }
97
99 SetShowDeMorgan( symbol->HasConversion() );
100 updateTitle();
101
102 RebuildView();
103 OnModify();
104}
105
106
108{
109 if( GetUndoCommandCount() <= 0 )
110 return;
111
113
114 // Load the last undo entry
116 ITEM_PICKER undoWrapper = undoCommand->PopItem();
117 delete undoCommand;
118 LIB_SYMBOL* symbol = (LIB_SYMBOL*) undoWrapper.GetItem();
119 wxCHECK( symbol, /* void */ );
120 symbol->ClearFlags( UR_TRANSIENT );
121 UNDO_REDO undoRedoType = undoWrapper.GetStatus();
122
123 // Store the current symbol in the redo buffer
124 PICKED_ITEMS_LIST* redoCommand = new PICKED_ITEMS_LIST();
125 LIB_SYMBOL* oldSymbol = m_symbol;
126 oldSymbol->SetFlags( UR_TRANSIENT );
127 ITEM_PICKER redoWrapper( GetScreen(), oldSymbol, undoRedoType );
128 redoCommand->PushItem( redoWrapper );
129 PushCommandToRedoList( redoCommand );
130
131 // Do not delete the previous symbol by calling SetCurSymbol( symbol ),
132 // which calls delete <previous symbol>.
133 // <previous symbol> is now put in redo list and is owned by this list.
134 // Just set the current symbol to the symbol which come from the undo list
135 m_symbol = symbol;
136
137 if( undoRedoType == UNDO_REDO::LIB_RENAME )
138 {
139 wxString lib = GetCurLib();
140 m_libMgr->UpdateSymbolAfterRename( symbol, oldSymbol->GetName(), lib );
141
142 // Reselect the renamed symbol
143 m_treePane->GetLibTree()->SelectLibId( LIB_ID( lib, symbol->GetName() ) );
144 }
145
147 SetShowDeMorgan( symbol->HasConversion() );
148 updateTitle();
149
150 RebuildView();
151 OnModify();
152}
153
154
156{
158
159 // Load the last undo entry
161
162 // Check if we were already at the top of the stack
163 if( !undoCommand )
164 return;
165
166 ITEM_PICKER undoWrapper = undoCommand->PopItem();
167 delete undoCommand;
168 LIB_SYMBOL* symbol = (LIB_SYMBOL*) undoWrapper.GetItem();
169 symbol->ClearFlags( UR_TRANSIENT );
170 SetCurSymbol( symbol, false );
171
173 selTool->RebuildSelection();
174
176 SetShowDeMorgan( symbol->HasConversion() );
177
178 RebuildView();
179}
virtual void PushCommandToUndoList(PICKED_ITEMS_LIST *aItem)
Add a command to undo in the undo list.
virtual int GetRedoCommandCount() const
virtual PICKED_ITEMS_LIST * PopCommandFromRedoList()
Return the last command to undo and remove it from list, nothing is deleted.
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.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition: eda_item.h:142
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: eda_item.h:143
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:56
void RebuildSelection()
Rebuild the selection from the EDA_ITEMs' selection flags.
EDA_ITEM * GetItem() const
UNDO_REDO GetStatus() const
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
Define a library symbol object.
Definition: lib_symbol.h:98
void ClearTempFlags()
Clears the status flag all draw objects in this symbol.
wxString GetName() const override
Definition: lib_symbol.h:136
void ClearEditFlags()
bool HasConversion() const
Test if symbol has more than one body conversion type (DeMorgan).
void SelectLibId(const LIB_ID &aLibId)
Select an item in the tree widget.
Definition: lib_tree.cpp:230
A holder to handle information on schematic or board items.
void PushItem(const ITEM_PICKER &aItem)
Push aItem to the top of the list.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
void updateTitle()
Update the main window title bar with the current library name and read only status of the library.
LIB_SYMBOL_LIBRARY_MANAGER * m_libMgr
wxString GetCurLib() const
The nickname of the current library being edited and empty string if none.
void SetCurSymbol(LIB_SYMBOL *aSymbol, bool aUpdateZoom)
Take ownership of aSymbol and notes that it is the one currently being edited.
void ClearUndoORRedoList(UNDO_REDO_LIST whichList, int aItemCount=-1) override
Free the undo or redo list from aList element.
SYMBOL_TREE_PANE * m_treePane
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current symbol.
void SetShowDeMorgan(bool show)
void SaveCopyInUndoList(EDA_ITEM *aItem, UNDO_REDO aUndoType=UNDO_REDO::LIBEDIT, bool aAppend=false)
Create a copy of the current symbol, and save it in the undo list.
bool UpdateSymbolAfterRename(LIB_SYMBOL *aSymbol, const wxString &oldAlias, const wxString &aLibrary)
Update the symbol buffer with a new version of the symbol when the name has changed.
LIB_TREE * GetLibTree() const
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:170
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:142
#define UR_TRANSIENT
indicates the item is owned by the undo/redo stack
UNDO_REDO
Undo Redo considerations: Basically we have 3 cases New item Deleted item Modified item there is also...