QElectroTech  0.70
addelementtextcommand.cpp
Go to the documentation of this file.
1 /*
2  Copyright 2006-2019 The QElectroTech Team
3  This file is part of QElectroTech.
4 
5  QElectroTech is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 2 of the License, or
8  (at your option) any later version.
9 
10  QElectroTech is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
17 */
18 #include "addelementtextcommand.h"
19 #include "element.h"
20 #include "dynamicelementtextitem.h"
21 #include "elementtextitemgroup.h"
22 
23 #include <QGraphicsScene>
24 #include <utility>
25 
26 
27 /************************
28  * AddElementTextCommand*
29  * **********************/
30 
32  QUndoCommand(parent),
33  m_element(element),
34  m_text(deti)
35 {
36  setText(QObject::tr("Ajouter un texte d'élément"));
37 }
38 
40 {
41  if(m_text->parentGroup())
42  return;
43 
44  if(!m_element->dynamicTextItems().contains(m_text))
45  delete m_text;
46 }
47 
49 {
51  if(m_text->scene())
52  m_text->scene()->removeItem(m_text);
53 }
54 
56 {
57  m_text->setParentItem(m_element);
59 }
60 
61 
62 /***********************
63  * AddTextsGroupCommand*
64  * *********************/
71 AddTextsGroupCommand::AddTextsGroupCommand(Element *element, QString groupe_name, QUndoCommand *parent) :
72  QUndoCommand(parent),
73  m_element(element),
74  m_name(std::move(groupe_name))
75 {
76  setText(QObject::tr("Ajouter un groupe de textes d'élément"));
77 }
78 
85 AddTextsGroupCommand::AddTextsGroupCommand(Element *element, const QDomElement& dom_element, QUndoCommand *parent) :
86  QUndoCommand(parent),
87  m_element(element),
88  m_dom_element(dom_element)
89 {
90  setText(QObject::tr("Ajouter un groupe de textes d'élément"));
91 }
92 
99 AddTextsGroupCommand::AddTextsGroupCommand(Element *element, QString groupe_name, QList<DynamicElementTextItem *> texts_list, QUndoCommand *parent) :
100  QUndoCommand(parent),
101  m_element(element),
102  m_name(std::move(groupe_name))
103 {
104  for(DynamicElementTextItem *deti : texts_list)
105  {
106  deti->setSelected(false);
107  if(deti->parentElement() == element)
108  {
109  m_deti_list << deti;
110  deti->setSelected(false);
111  }
112  }
113 
114  setText(QObject::tr("Grouper des textes d'élément"));
115 }
116 
122 {}
123 
125 {
126  if(m_element && m_group)
127  m_element.data()->removeTextGroup(m_group);
128 }
129 
131 {
132  if(m_element)
133  {
134  if(m_first_undo)
135  {
136  m_group = m_element.data()->addTextGroup(m_name);
137  if(!m_dom_element.isNull())
138  {
139  m_group.data()->fromXml(m_dom_element);
140  //We get the list of texts (if any) because when undo is called, all child text will be removed
141  //from the group, and reparented to m_elemeny.
142  //Then the next time redo is called, the texts will be added to the group
143  m_deti_list = m_group.data()->texts();
144  m_group.data()->updateAlignment();
145  }
146  else
147  {
149  m_element.data()->addTextToGroup(deti, m_group.data());
150  }
151  m_first_undo = false;
152  }
153  else if(m_group)
154  {
155  m_element.data()->addTextGroup(m_group.data());
157  m_element.data()->addTextToGroup(deti, m_group.data());
158  }
159  }
160 }
161 
162 
163 /**************************
164  * RemoveTextsGroupCommand*
165  * ************************/
173  QUndoCommand(parent),
174  m_element(element),
175  m_group(group)
176 {
177  setText(QObject::tr("Supprimer un groupe de textes d'élément"));
178 
179  for(DynamicElementTextItem *deti : group->texts())
180  m_text_list.append(deti);
181 }
182 
184 {}
185 
187 {
188  if(m_element && m_group)
189  {
190  m_element.data()->addTextGroup(m_group.data());
191 
192  for(const QPointer<DynamicElementTextItem>& p : m_text_list)
193  if(p)
194  m_element.data()->addTextToGroup(p.data(), m_group.data());
195  }
196 }
197 
199 {
200  if(m_element && m_group)
201  {
202  for(const QPointer<DynamicElementTextItem>& p : m_text_list)
203  if(p)
204  m_element.data()->removeTextFromGroup(p.data(), m_group.data());
205 
206  m_element.data()->removeTextGroup(m_group.data());
207  }
208 }
209 
210 
211 /************************
212  * AddTextToGroupCommand*
213  * **********************/
221  QUndoCommand(parent),
222  m_text(text),
223  m_group(group),
224  m_element(group->parentElement())
225 {
226  setText(QObject::tr("Insérer un texte d'élément dans un groupe de textes"));
227 }
228 
234 {
235  if(m_group && m_text && m_element)
236  {
237  if(!m_group.data()->texts().contains(m_text.data()) &&
238  !m_element.data()->dynamicTextItems().contains(m_text.data()))
239  delete m_text.data();
240  }
241 }
242 
244 {
245  if(m_element && m_group && m_text)
246  m_element.data()->removeTextFromGroup(m_text, m_group);
247 }
248 
250 {
251  if(m_element && m_group && m_text)
252  {
253  if(m_text.data()->isSelected())
254  {
255  m_text.data()->setSelected(false);
256  m_group.data()->setSelected(true);
257  }
258  m_element.data()->addTextToGroup(m_text, m_group);
259  }
260 }
261 
262 /*****************************
263  * RemoveTextFromGroupCommand*
264  * ***************************/
272  QUndoCommand(parent),
273  m_text(text),
274  m_group(group),
275  m_element(group->parentElement())
276 {
277  setText(QObject::tr("Enlever un texte d'élément d'un groupe de textes"));
278 }
279 
285 {
286  if(m_group && m_text && m_element)
287  {
288  if(!m_group.data()->texts().contains(m_text.data()) &&
289  !m_element.data()->dynamicTextItems().contains(m_text.data()))
290  delete m_text.data();
291  }
292 }
293 
295 {
296  if(m_element && m_group && m_text)
297  m_element.data()->addTextToGroup(m_text, m_group);
298 }
299 
301 {
302  if(m_element && m_group && m_text)
303  m_element.data()->removeTextFromGroup(m_text, m_group);
304 }
305 
306 
307 /*****************************
308  * AlignmentTextsGroupCommand*
309  * ***************************/
316 AlignmentTextsGroupCommand::AlignmentTextsGroupCommand(ElementTextItemGroup *group, Qt::Alignment new_alignment, QUndoCommand *parent) :
317  QUndoCommand(parent),
318  m_group(group),
319  m_previous_alignment(group->alignment()),
320  m_new_alignment(new_alignment)
321 {
322  setText(QObject::tr("Modifier l'alignement d'un groupe de textes"));
323 
324  //Text haven't got alignment
325  if(m_previous_alignment != Qt::AlignLeft ||
326  m_previous_alignment != Qt::AlignVCenter ||
327  m_previous_alignment != Qt::AlignRight)
328  {
329  for(DynamicElementTextItem *deti : group->texts())
330  m_texts_pos.insert(deti, deti->pos());
331  }
332 }
333 
339 {}
340 
347 bool AlignmentTextsGroupCommand::mergeWith(const QUndoCommand *other)
348 {
349  if (id() != other->id() || other->childCount())
350  return false;
351 
352  AlignmentTextsGroupCommand const *undo = static_cast<const AlignmentTextsGroupCommand *>(other);
353  if (m_group != undo->m_group)
354  return false;
355 
356  m_new_alignment= undo->m_new_alignment;
357  return true;
358 }
359 
364 {
365  if(m_group)
366  {
367  m_group.data()->setAlignment(m_previous_alignment);
368  //The alignment befor this command was free, then we must
369  //to restor the pos of each texts
370  if(!m_texts_pos.isEmpty())
371  {
372  for(DynamicElementTextItem *deti : m_group.data()->texts())
373  {
374  if(m_texts_pos.keys().contains(deti))
375  deti->setPos(m_texts_pos.value(deti));
376  }
377  }
378  }
379 }
380 
385 {
386  if(m_group)
387  m_group.data()->setAlignment(m_new_alignment);
388 }
ElementTextItemGroup * parentGroup() const
DynamicElementTextItem::parentGroup.
QPointer< ElementTextItemGroup > m_group
The DynamicElementTextItem class This class provide a simple text field of element who can be added o...
QPointer< Element > m_element
QPointer< ElementTextItemGroup > m_group
AddElementTextCommand(Element *element, DynamicElementTextItem *deti, QUndoCommand *parent=nullptr)
QPointer< DynamicElementTextItem > m_text
~AddTextToGroupCommand() override
AddTextToGroupCommand::~AddTextToGroupCommand Destructor.
~AddTextsGroupCommand() override
AddTextsGroupCommand::~AddTextsGroupCommand Destructor.
QList< DynamicElementTextItem * > m_deti_list
QPointer< Element > m_element
QList< QPointer< DynamicElementTextItem > > m_text_list
QHash< DynamicElementTextItem *, QPointF > m_texts_pos
QPointer< Element > m_element
AlignmentTextsGroupCommand(ElementTextItemGroup *group, Qt::Alignment new_alignment, QUndoCommand *parent=nullptr)
AlignmentTextsGroupCommand::AlignmentTextsGroupCommand.
QPointer< ElementTextItemGroup > m_group
void addDynamicTextItem(DynamicElementTextItem *deti=nullptr)
Element::addDynamiqueTextItem Add as a dynamic text item of this element, is reparented to this If ...
Definition: element.cpp:1146
void removeDynamicTextItem(DynamicElementTextItem *deti)
Element::removeDynamicTextItem Remove , no matter if is a child of this element or a child of a group...
Definition: element.cpp:1168
AddTextToGroupCommand(DynamicElementTextItem *text, ElementTextItemGroup *group, QUndoCommand *parent=nullptr)
AddTextToGroupCommand::AddTextToGroupCommand.
QList< DynamicElementTextItem * > texts() const
ElementTextItemGroup::texts.
QIcon tr
Definition: qeticons.cpp:204
The ElementTextItemGroup class This class represent a group of element text Texts in the group can be...
QPointer< ElementTextItemGroup > m_group
AddTextsGroupCommand(Element *element, QString groupe_name, QUndoCommand *parent=nullptr)
AddTextsGroupCommand::AddTextsGroupCommand.
bool mergeWith(const QUndoCommand *other) override
AlignmentTextsGroupCommand::mergeWith Try to merge this command with other command.
RemoveTextFromGroupCommand(DynamicElementTextItem *text, ElementTextItemGroup *group, QUndoCommand *parent=nullptr)
RemoveTextFromGroupCommand::RemoveTextFromGroupCommand.
RemoveTextsGroupCommand(Element *element, ElementTextItemGroup *group, QUndoCommand *parent=nullptr)
RemoveTextsGroupCommand::RemoveTextsGroupCommand.
QPointer< ElementTextItemGroup > m_group
void redo() override
AlignmentTextsGroupCommand::redo.
DynamicElementTextItem * m_text
QList< DynamicElementTextItem * > dynamicTextItems() const
Element::dynamicTextItems.
Definition: element.cpp:1197
~AlignmentTextsGroupCommand() override
AlignmentTextsGroupCommand::~AlignmentTextsGroupCommand Destructor.
QPointer< DynamicElementTextItem > m_text
~RemoveTextFromGroupCommand() override
RemoveTextFromGroupCommand::~RemoveTextFromGroupCommand Destructor.
void undo() override
AlignmentTextsGroupCommand::undo.