1 /*
2  * LibrePCB - Professional EDA for everyone!
3  * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4  * https://librepcb.org/
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 /*******************************************************************************
21  *  Includes
22  ******************************************************************************/
23 #include "cmdprojectlibraryremoveelement.h"
24 
25 #include "../projectlibrary.h"
26 
27 #include <librepcb/library/elements.h>
28 
29 #include <QtCore>
30 
31 /*******************************************************************************
32  *  Namespace
33  ******************************************************************************/
34 namespace librepcb {
35 namespace project {
36 
37 /*******************************************************************************
38  *  Constructors / Destructor
39  ******************************************************************************/
40 
41 template <typename ElementType>
CmdProjectLibraryRemoveElement(ProjectLibrary & library,ElementType & element)42 CmdProjectLibraryRemoveElement<ElementType>::CmdProjectLibraryRemoveElement(
43     ProjectLibrary& library, ElementType& element) noexcept
44   : UndoCommand(tr("Remove element from library")),
45     mLibrary(library),
46     mElement(element) {
47 }
48 
49 template <typename ElementType>
50 CmdProjectLibraryRemoveElement<
~CmdProjectLibraryRemoveElement()51     ElementType>::~CmdProjectLibraryRemoveElement() noexcept {
52 }
53 
54 /*******************************************************************************
55  *  Inherited from UndoCommand
56  ******************************************************************************/
57 
58 template <typename ElementType>
performExecute()59 bool CmdProjectLibraryRemoveElement<ElementType>::performExecute() {
60   performRedo();  // can throw
61 
62   return true;
63 }
64 
65 template <typename ElementType>
performUndo()66 void CmdProjectLibraryRemoveElement<ElementType>::performUndo() {
67   addElement();  // can throw
68 }
69 
70 template <typename ElementType>
performRedo()71 void CmdProjectLibraryRemoveElement<ElementType>::performRedo() {
72   removeElement();  // can throw
73 }
74 
75 /*******************************************************************************
76  *  Private Methods
77  ******************************************************************************/
78 
79 template <>
addElement()80 void CmdProjectLibraryRemoveElement<library::Symbol>::addElement() {
81   mLibrary.addSymbol(mElement);
82 }
83 
84 template <>
addElement()85 void CmdProjectLibraryRemoveElement<library::Package>::addElement() {
86   mLibrary.addPackage(mElement);
87 }
88 
89 template <>
addElement()90 void CmdProjectLibraryRemoveElement<library::Component>::addElement() {
91   mLibrary.addComponent(mElement);
92 }
93 
94 template <>
addElement()95 void CmdProjectLibraryRemoveElement<library::Device>::addElement() {
96   mLibrary.addDevice(mElement);
97 }
98 
99 template <>
removeElement()100 void CmdProjectLibraryRemoveElement<library::Symbol>::removeElement() {
101   mLibrary.removeSymbol(mElement);
102 }
103 
104 template <>
removeElement()105 void CmdProjectLibraryRemoveElement<library::Package>::removeElement() {
106   mLibrary.removePackage(mElement);
107 }
108 
109 template <>
removeElement()110 void CmdProjectLibraryRemoveElement<library::Component>::removeElement() {
111   mLibrary.removeComponent(mElement);
112 }
113 
114 template <>
removeElement()115 void CmdProjectLibraryRemoveElement<library::Device>::removeElement() {
116   mLibrary.removeDevice(mElement);
117 }
118 
119 /*******************************************************************************
120  *  Explicit Template Instantiation
121  ******************************************************************************/
122 
123 template class CmdProjectLibraryRemoveElement<library::Symbol>;
124 template class CmdProjectLibraryRemoveElement<library::Package>;
125 template class CmdProjectLibraryRemoveElement<library::Component>;
126 template class CmdProjectLibraryRemoveElement<library::Device>;
127 
128 /*******************************************************************************
129  *  End of File
130  ******************************************************************************/
131 
132 }  // namespace project
133 }  // namespace librepcb
134