KiCad PCB EDA Suite
undo_redo_container.h
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) 2009 jean-pierre.charras@gipsa-lab.inpg.fr
5  * Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
6  * Copyright (C) 2009-2020 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
26 #ifndef _CLASS_UNDOREDO_CONTAINER_H
27 #define _CLASS_UNDOREDO_CONTAINER_H
28 
29 #include <core/typeinfo.h>
30 #include <eda_item_flags.h>
31 #include <vector>
32 
33 class EDA_ITEM;
34 class PICKED_ITEMS_LIST;
35 class BASE_SCREEN;
36 
37 
56 enum class UNDO_REDO {
57  UNSPECIFIED = 0, // illegal
58  NOP, // Undo/redo will ignore this entry. Only forces the start of a new stack
59  CHANGED, // params of items have a value changed: undo is made by exchange
60  // values with a copy of these values
61  NEWITEM, // new item, undo by changing in deleted
62  DELETED, // deleted item, undo by changing in deleted
63  LIBEDIT, // Specific to the component editor (symbol_editor creates a full copy
64  // of the current component when changed)
65  LIB_RENAME, // As LIBEDIT, but old copy should be removed from library
66  EXCHANGE_T, // Use for changing the schematic text type where swapping
67  // data structure is insufficient to restore the change.
68  DRILLORIGIN, // origin changed (like CHANGED, contains the origin and a copy)
69  GRIDORIGIN, // origin changed (like CHANGED, contains the origin and a copy)
70  PAGESETTINGS, // page settings or title block changes
71  GROUP,
72  UNGROUP
73 };
74 
75 
77 {
78 public:
79 // ITEM_PICKER( EDA_ITEM* aItem = NULL, UNDO_REDO aStatus = UNSPECIFIED );
80  ITEM_PICKER();
81  ITEM_PICKER( BASE_SCREEN* aScreen, EDA_ITEM* aItem,
83 
84  EDA_ITEM* GetItem() const { return m_pickedItem; }
85 
86  void SetItem( EDA_ITEM* aItem );
87 
88  KICAD_T GetItemType() const { return m_pickedItemType; }
89 
90  void SetStatus( UNDO_REDO aStatus ) { m_undoRedoStatus = aStatus; }
91 
92  UNDO_REDO GetStatus() const { return m_undoRedoStatus; }
93 
94  void SetFlags( EDA_ITEM_FLAGS aFlags ) { m_pickerFlags = aFlags; }
95 
97 
98  void SetLink( EDA_ITEM* aItem ) { m_link = aItem; }
99 
100  EDA_ITEM* GetLink() const { return m_link; }
101 
102  BASE_SCREEN* GetScreen() const { return m_screen; }
103 
104 private:
105  EDA_ITEM_FLAGS m_pickerFlags; /* a copy of m_flags member. useful in mode/drag
106  * undo/redo commands */
107  UNDO_REDO m_undoRedoStatus; /* type of operation to undo/redo for this item */
108  EDA_ITEM* m_pickedItem; /* Pointer on the schematic or board item that is concerned
109  * (picked), or in undo redo commands, the copy of an
110  * edited item. */
111  KICAD_T m_pickedItemType; /* type of schematic or board item that is concerned */
112 
113  EDA_ITEM* m_link; /* Pointer on another item. Used in undo redo command
114  * used when a duplicate exists i.e. when an item is
115  * modified, and the copy of initial item exists (the
116  * duplicate) m_Item points the duplicate (i.e the old
117  * copy of an active item) and m_Link points the active
118  * item in schematic */
119 
120  BASE_SCREEN* m_screen; /* For new and deleted items the screen the item should
121  * be added to/removed from. */
122 
123 };
124 
125 
132 {
133 private:
134  std::vector <ITEM_PICKER> m_ItemsList;
135 
136 public:
139 
145  void PushItem( const ITEM_PICKER& aItem );
146 
151 
155  bool ContainsItem( const EDA_ITEM* aItem ) const;
156 
161  int FindItem( const EDA_ITEM* aItem ) const;
162 
166  void ClearItemsList();
167 
173 
177  unsigned GetCount() const
178  {
179  return m_ItemsList.size();
180  }
181 
190 
196  ITEM_PICKER GetItemWrapper( unsigned int aIdx ) const;
197 
202  EDA_ITEM* GetPickedItem( unsigned int aIdx ) const;
203 
208  BASE_SCREEN* GetScreenForItem( unsigned int aIdx ) const;
209 
214  EDA_ITEM* GetPickedItemLink( unsigned int aIdx ) const;
215 
221  UNDO_REDO GetPickedItemStatus( unsigned int aIdx ) const;
222 
229  EDA_ITEM_FLAGS GetPickerFlags( unsigned aIdx ) const;
230 
236  bool SetPickedItem( EDA_ITEM* aItem, unsigned aIdx );
237 
244  bool SetPickedItem( EDA_ITEM* aItem, UNDO_REDO aStatus, unsigned aIdx );
245 
253  bool SetPickedItemLink( EDA_ITEM* aLink, unsigned aIdx );
254 
262  bool SetPickedItemStatus( UNDO_REDO aStatus, unsigned aIdx );
263 
271  bool SetPickerFlags( EDA_ITEM_FLAGS aFlags, unsigned aIdx );
272 
279  bool RemovePicker( unsigned aIdx );
280 
288  void CopyList( const PICKED_ITEMS_LIST& aSource );
289 };
290 
291 
296 {
297 public:
300 
301  void PushCommand( PICKED_ITEMS_LIST* aCommand );
302 
304 
305  void ClearCommandList();
306 
307  std::vector <PICKED_ITEMS_LIST*> m_CommandsList; // the list of possible undo/redo commands
308 };
309 
310 
311 #endif // _CLASS_UNDOREDO_CONTAINER_H
EDA_ITEM * GetPickedItemLink(unsigned int aIdx) const
std::vector< ITEM_PICKER > m_ItemsList
int FindItem(const EDA_ITEM *aItem) const
void SetFlags(EDA_ITEM_FLAGS aFlags)
void ReversePickersListOrder()
Reverse the order of pickers stored in this list.
EDA_ITEM * GetItem() const
BASE_SCREEN * GetScreenForItem(unsigned int aIdx) const
bool SetPickerFlags(EDA_ITEM_FLAGS aFlags, unsigned aIdx)
Set the flags of the picker (usually to the picked item m_flags value).
void PushItem(const ITEM_PICKER &aItem)
Push aItem to the top of the list.
std::uint32_t EDA_ITEM_FLAGS
void SetLink(EDA_ITEM *aItem)
UNDO_REDO
Undo Redo considerations: Basically we have 3 cases New item Deleted item Modified item there is also...
KICAD_T GetItemType() const
PICKED_ITEMS_LIST * PopCommand()
unsigned GetCount() const
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:77
EDA_ITEM * GetLink() const
void PushCommand(PICKED_ITEMS_LIST *aCommand)
KICAD_T m_pickedItemType
A holder to handle a list of undo (or redo) commands.
void CopyList(const PICKED_ITEMS_LIST &aSource)
Copy all data from aSource to the list.
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
bool SetPickedItem(EDA_ITEM *aItem, unsigned aIdx)
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:40
void SetStatus(UNDO_REDO aStatus)
UNDO_REDO m_undoRedoStatus
EDA_ITEM_FLAGS GetPickerFlags(unsigned aIdx) const
Return the value of the picker flag.
EDA_ITEM * GetPickedItem(unsigned int aIdx) const
bool RemovePicker(unsigned aIdx)
Remove one entry (one picker) from the list of picked items.
A holder to handle information on schematic or board items.
void SetItem(EDA_ITEM *aItem)
EDA_ITEM_FLAGS GetFlags() const
ITEM_PICKER GetItemWrapper(unsigned int aIdx) const
bool SetPickedItemStatus(UNDO_REDO aStatus, unsigned aIdx)
Set the type of undo/redo operation for a given picked item.
EDA_ITEM * m_pickedItem
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:100
void ClearItemsList()
Delete only the list of pickers NOT the picked data itself.
bool SetPickedItemLink(EDA_ITEM *aLink, unsigned aIdx)
Set the link associated to a given picked item.
BASE_SCREEN * GetScreen() const
UNDO_REDO GetPickedItemStatus(unsigned int aIdx) const
BASE_SCREEN * m_screen
bool ContainsItem(const EDA_ITEM *aItem) const
void ClearListAndDeleteItems()
Delete the list of pickers AND the data pointed by #m_PickedItem or #m_PickedItemLink according to th...
UNDO_REDO GetStatus() const
EDA_ITEM_FLAGS m_pickerFlags