/* Copyright 2006-2024 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. QElectroTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QElectroTech. If not, see . */ #include "addelementtextcommand.h" #include "../qetgraphicsitem/dynamicelementtextitem.h" #include "../qetgraphicsitem/element.h" #include "../qetgraphicsitem/elementtextitemgroup.h" #include #include /************************ * AddElementTextCommand* * **********************/ /** @brief AddElementTextCommand::AddElementTextCommand @param element @param deti @param parent */ AddElementTextCommand::AddElementTextCommand(Element *element, DynamicElementTextItem *deti, QUndoCommand *parent): QUndoCommand(parent), m_element(element), m_text(deti) { setText(QObject::tr("Ajouter un texte d'élément")); } /** @brief AddElementTextCommand::~AddElementTextCommand */ AddElementTextCommand::~AddElementTextCommand() { if(m_text->parentGroup()) return; if(!m_element->dynamicTextItems().contains(m_text)) delete m_text; } /** @brief AddElementTextCommand::undo */ void AddElementTextCommand::undo() { m_element->removeDynamicTextItem(m_text); if(m_text->scene()) m_text->scene()->removeItem(m_text); } /** @brief AddElementTextCommand::redo */ void AddElementTextCommand::redo() { m_text->setParentItem(m_element); m_element->addDynamicTextItem(m_text); } /*********************** * AddTextsGroupCommand* * *********************/ /** @brief AddTextsGroupCommand::AddTextsGroupCommand @param element : the element to add a new group @param groupe_name : the name of the group @param parent : parent undo */ AddTextsGroupCommand::AddTextsGroupCommand(Element *element, QString groupe_name, QUndoCommand *parent) : QUndoCommand(parent), m_element(element), m_name(std::move(groupe_name)) { setText(QObject::tr("Ajouter un groupe de textes d'élément")); } /** @brief AddTextsGroupCommand::AddTextsGroupCommand @param element : The element to add a new group @param dom_element : the first time the group is created, we call the function fromXml of the group, and give dom_element has argument. @param parent : parent undo */ AddTextsGroupCommand::AddTextsGroupCommand(Element *element, const QDomElement& dom_element, QUndoCommand *parent) : QUndoCommand(parent), m_element(element), m_dom_element(dom_element) { setText(QObject::tr("Ajouter un groupe de textes d'élément")); } /** @brief AddTextsGroupCommand::AddTextsGroupCommand @param element : The element to add a new group @param groupe_name @param texts_list : a list of texts to add to the created group (texts must be child of element) @param parent : parent undo */ AddTextsGroupCommand::AddTextsGroupCommand( Element *element, QString groupe_name, QList texts_list, QUndoCommand *parent) : QUndoCommand(parent), m_element(element), m_name(std::move(groupe_name)) { for(DynamicElementTextItem *deti : texts_list) { deti->setSelected(false); if(deti->parentElement() == element) { m_deti_list << deti; deti->setSelected(false); } } setText(QObject::tr("Grouper des textes d'élément")); } /** @brief AddTextsGroupCommand::~AddTextsGroupCommand Destructor */ AddTextsGroupCommand::~AddTextsGroupCommand() {} /** @brief AddTextsGroupCommand::undo */ void AddTextsGroupCommand::undo() { if(m_element && m_group) m_element.data()->removeTextGroup(m_group); } /** @brief AddTextsGroupCommand::redo */ void AddTextsGroupCommand::redo() { if(!m_element) return; if(m_first_undo) { m_group = m_element.data()->addTextGroup(m_name); if(!m_dom_element.isNull()) { m_group.data()->fromXml(m_dom_element); /* We get the list of texts (if any) * because when undo is called, * all child text will be removed * from the group, and reparented to m_elemeny. * Then the next time redo is called, * the texts will be added to the group */ m_deti_list = m_group.data()->texts(); m_group.data()->updateAlignment(); } else { for(DynamicElementTextItem *deti : m_deti_list) m_element.data()->addTextToGroup( deti, m_group.data()); } m_first_undo = false; } else if(m_group) { m_element.data()->addTextGroup(m_group.data()); for(DynamicElementTextItem *deti : m_deti_list) m_element.data()->addTextToGroup(deti, m_group.data()); } } /************************** * RemoveTextsGroupCommand* * ************************/ /** @brief RemoveTextsGroupCommand::RemoveTextsGroupCommand @param element : The element where we remove a group @param group : the group to remove @param parent : the parent undo command */ RemoveTextsGroupCommand::RemoveTextsGroupCommand(Element *element, ElementTextItemGroup *group, QUndoCommand *parent) : QUndoCommand(parent), m_element(element), m_group(group) { setText(QObject::tr("Supprimer un groupe de textes d'élément")); for(DynamicElementTextItem *deti : group->texts()) m_text_list.append(deti); } /** @brief RemoveTextsGroupCommand::~RemoveTextsGroupCommand */ RemoveTextsGroupCommand::~RemoveTextsGroupCommand() {} /** @brief RemoveTextsGroupCommand::undo */ void RemoveTextsGroupCommand::undo() { if(m_element && m_group) { m_element.data()->addTextGroup(m_group.data()); for(const QPointer& p : m_text_list) if(p) m_element.data()->addTextToGroup( p.data(), m_group.data()); } } /** @brief RemoveTextsGroupCommand::redo */ void RemoveTextsGroupCommand::redo() { if(m_element && m_group) { for(const QPointer& p : m_text_list) if(p) m_element.data()->removeTextFromGroup( p.data(), m_group.data()); m_element.data()->removeTextGroup(m_group.data()); } } /************************ * AddTextToGroupCommand* * **********************/ /** @brief AddTextToGroupCommand::AddTextToGroupCommand @param text @param group @param parent */ AddTextToGroupCommand::AddTextToGroupCommand(DynamicElementTextItem *text, ElementTextItemGroup *group, QUndoCommand *parent) : QUndoCommand(parent), m_text(text), m_group(group), m_element(group->parentElement()) { setText(QObject::tr("Insérer un texte d'élément dans un groupe de textes")); } /** @brief AddTextToGroupCommand::~AddTextToGroupCommand Destructor */ AddTextToGroupCommand::~AddTextToGroupCommand() { if(m_group && m_text && m_element) { if(!m_group.data()->texts().contains(m_text.data()) && !m_element.data()->dynamicTextItems().contains(m_text.data())) delete m_text.data(); } } /** @brief AddTextToGroupCommand::undo */ void AddTextToGroupCommand::undo() { if(m_element && m_group && m_text) m_element.data()->removeTextFromGroup(m_text, m_group); } /** @brief AddTextToGroupCommand::redo */ void AddTextToGroupCommand::redo() { if(m_element && m_group && m_text) { if(m_text.data()->isSelected()) { m_text.data()->setSelected(false); m_group.data()->setSelected(true); } m_element.data()->addTextToGroup(m_text, m_group); } } /***************************** * RemoveTextFromGroupCommand* * ***************************/ /** @brief RemoveTextFromGroupCommand::RemoveTextFromGroupCommand @param text : text to add to group @param group @param parent : parent undo command */ RemoveTextFromGroupCommand::RemoveTextFromGroupCommand( DynamicElementTextItem *text, ElementTextItemGroup *group, QUndoCommand *parent): QUndoCommand(parent), m_text(text), m_group(group), m_element(group->parentElement()) { setText(QObject::tr("Enlever un texte d'élément d'un groupe de textes")); } /** @brief RemoveTextFromGroupCommand::~RemoveTextFromGroupCommand Destructor */ RemoveTextFromGroupCommand::~RemoveTextFromGroupCommand() { if(m_group && m_text && m_element) { if(!m_group.data()->texts().contains(m_text.data()) && !m_element.data()->dynamicTextItems().contains(m_text.data())) delete m_text.data(); } } /** @brief RemoveTextFromGroupCommand::undo */ void RemoveTextFromGroupCommand::undo() { if(m_element && m_group && m_text) m_element.data()->addTextToGroup(m_text, m_group); } /** @brief RemoveTextFromGroupCommand::redo */ void RemoveTextFromGroupCommand::redo() { if(m_element && m_group && m_text) m_element.data()->removeTextFromGroup(m_text, m_group); } /***************************** * AlignmentTextsGroupCommand* * ***************************/ /** @brief AlignmentTextsGroupCommand::AlignmentTextsGroupCommand @param group : Group to change the alignment @param new_alignment : the new alignment of the group @param parent : the parent QUndoCommand of this undo */ AlignmentTextsGroupCommand::AlignmentTextsGroupCommand( ElementTextItemGroup *group, Qt::Alignment new_alignment, QUndoCommand *parent) : QUndoCommand(parent), m_group(group), m_previous_alignment(group->alignment()), m_new_alignment(new_alignment) { setText(QObject::tr("Modifier l'alignement d'un groupe de textes")); //Text haven't got alignment if(m_previous_alignment != Qt::AlignLeft || m_previous_alignment != Qt::AlignVCenter || m_previous_alignment != Qt::AlignRight) { for(DynamicElementTextItem *deti : group->texts()) m_texts_pos.insert(deti, deti->pos()); } } /** @brief AlignmentTextsGroupCommand::~AlignmentTextsGroupCommand Destructor */ AlignmentTextsGroupCommand::~AlignmentTextsGroupCommand() {} /** @brief AlignmentTextsGroupCommand::mergeWith Try to merge this command with other command @param other @return true if was merged, else false */ bool AlignmentTextsGroupCommand::mergeWith(const QUndoCommand *other) { if (id() != other->id() || other->childCount()) return false; AlignmentTextsGroupCommand const *undo = static_cast(other); if (m_group != undo->m_group) return false; m_new_alignment= undo->m_new_alignment; return true; } /** @brief AlignmentTextsGroupCommand::undo */ void AlignmentTextsGroupCommand::undo() { if(m_group) { m_group.data()->setAlignment(m_previous_alignment); //The alignment before this command was free, then we must //to restore the pos of each texts if(!m_texts_pos.isEmpty()) { for(DynamicElementTextItem *deti : m_group.data()->texts()) { if(m_texts_pos.keys().contains(deti)) deti->setPos(m_texts_pos.value(deti)); } } } } /** @brief AlignmentTextsGroupCommand::redo */ void AlignmentTextsGroupCommand::redo() { if(m_group) m_group.data()->setAlignment(m_new_alignment); }