diff --git a/src/app/tape/tmainwindow.cpp b/src/app/tape/tmainwindow.cpp index ab49b7ef7..4925b42e7 100644 --- a/src/app/tape/tmainwindow.cpp +++ b/src/app/tape/tmainwindow.cpp @@ -348,6 +348,13 @@ void TMainWindow::ShowToolTip(const QString &toolTip) // do nothing } +//--------------------------------------------------------------------------------------------------------------------- +void TMainWindow::UpdateGroups() +{ + // do nothing +} + + //--------------------------------------------------------------------------------------------------------------------- void TMainWindow::FileNew() { diff --git a/src/app/tape/tmainwindow.h b/src/app/tape/tmainwindow.h index a6139a259..865127658 100644 --- a/src/app/tape/tmainwindow.h +++ b/src/app/tape/tmainwindow.h @@ -65,6 +65,7 @@ public: public slots: virtual void ShowToolTip(const QString &toolTip) Q_DECL_OVERRIDE; + virtual void UpdateGroups() Q_DECL_OVERRIDE; protected: virtual void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE; diff --git a/src/app/valentina/mainwindow.cpp b/src/app/valentina/mainwindow.cpp index 5c06fb535..0bfcb1b78 100644 --- a/src/app/valentina/mainwindow.cpp +++ b/src/app/valentina/mainwindow.cpp @@ -1455,6 +1455,16 @@ void MainWindow::ShowToolTip(const QString &toolTip) m_statusLabel->setText(toolTip); } + +//--------------------------------------------------------------------------------------------------------------------- +/** + * @brief triggers the update of the groups + */ +void MainWindow::UpdateGroups() +{ + groupsWidget->UpdateGroups(); +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief showEvent handle after show window. @@ -3485,12 +3495,6 @@ void MainWindow::ShowProgress() } } -//--------------------------------------------------------------------------------------------------------------------- -void MainWindow::UpdateGroups() -{ - groupsWidget->UpdateGroups(); -} - //--------------------------------------------------------------------------------------------------------------------- void MainWindow::SetDefaultHeight() { diff --git a/src/app/valentina/mainwindow.h b/src/app/valentina/mainwindow.h index def642090..841653c2a 100644 --- a/src/app/valentina/mainwindow.h +++ b/src/app/valentina/mainwindow.h @@ -68,8 +68,8 @@ public: public slots: void ProcessCMD(); - void UpdateGroups(); virtual void ShowToolTip(const QString &toolTip) Q_DECL_OVERRIDE; + virtual void UpdateGroups() Q_DECL_OVERRIDE; signals: void RefreshHistory(); diff --git a/src/libs/vtools/tools/drawTools/vdrawtool.h b/src/libs/vtools/tools/drawTools/vdrawtool.h index 3a120eede..e705023f4 100644 --- a/src/libs/vtools/tools/drawTools/vdrawtool.h +++ b/src/libs/vtools/tools/drawTools/vdrawtool.h @@ -48,11 +48,12 @@ #include "../vmisc/def.h" #include "../vwidgets/vmaingraphicsscene.h" #include "../vwidgets/vmaingraphicsview.h" +#include "../vwidgets/vabstractmainwindow.h" #include "../vdatatool.h" #include "../vgeometry/vpointf.h" #include "../vtools/undocommands/addgroup.h" #include "../vtools/undocommands/additemtogroup.h" -#include "../../../../app/valentina/mainwindow.h" +#include "../vtools/undocommands/removeitemfromgroup.h" template class QSharedPointer; @@ -284,20 +285,28 @@ void VDrawTool::ContextMenu(QGraphicsSceneContextMenuEvent *event, quint32 itemI quint32 groupId = selectedAction->data().toUInt(); QDomElement item = doc->AddItemToGroup(this->getId(), itemId, groupId); - MainWindow *window = qobject_cast(qApp->getMainWindow()); + VAbstractMainWindow *window = qobject_cast(qApp->getMainWindow()); SCASSERT(window != nullptr) { - AddItemToGroup *addItemToGroup = new AddItemToGroup(item, doc); - connect(addItemToGroup, &AddItemToGroup::UpdateGroups, window, &MainWindow::UpdateGroups); + AddItemToGroup *addItemToGroup = new AddItemToGroup(item, doc, groupId); + connect(addItemToGroup, &AddItemToGroup::UpdateGroups, window, &VAbstractMainWindow::UpdateGroups); qApp->getUndoStack()->push(addItemToGroup); } - } else if (selectedAction->actionGroup() == actionsRemoveFromGroup) { quint32 groupId = selectedAction->data().toUInt(); - doc->RemoveItemFromGroup(this->getId(), itemId, groupId); + QDomElement item = doc->RemoveItemFromGroup(this->getId(), itemId, groupId); + + VAbstractMainWindow *window = qobject_cast(qApp->getMainWindow()); + + SCASSERT(window != nullptr) + { + RemoveItemFromGroup *removeItemFromGroup = new RemoveItemFromGroup(item, doc, groupId); + connect(removeItemFromGroup, &RemoveItemFromGroup::UpdateGroups, window, &VAbstractMainWindow::UpdateGroups); + qApp->getUndoStack()->push(removeItemFromGroup); + } } } diff --git a/src/libs/vtools/undocommands/additemtogroup.cpp b/src/libs/vtools/undocommands/additemtogroup.cpp index 054412184..b4d3f93be 100644 --- a/src/libs/vtools/undocommands/additemtogroup.cpp +++ b/src/libs/vtools/undocommands/additemtogroup.cpp @@ -36,22 +36,15 @@ #include "../vmisc/def.h" #include "../vwidgets/vmaingraphicsview.h" #include "../ifc/xml/vabstractpattern.h" +#include "../vtools/tools/vdatatool.h" #include "vundocommand.h" //--------------------------------------------------------------------------------------------------------------------- -AddItemToGroup::AddItemToGroup(const QDomElement &xml, VAbstractPattern *doc, QUndoCommand *parent) - : VUndoCommand(xml, doc, parent), nameActivDraw(doc->GetNameActivPP()), toolId(0), objectId(0) +AddItemToGroup::AddItemToGroup(const QDomElement &xml, VAbstractPattern *doc, quint32 groupId, QUndoCommand *parent) + : VUndoCommand(xml, doc, parent), nameActivDraw(doc->GetNameActivPP()) { - setText(tr("add item to group")); - - objectId = doc->GetParametrUInt(xml,QString("object"),NULL_ID_STR); - toolId = doc->GetParametrUInt(xml,QString("tool"),NULL_ID_STR); - QDomNode parentNode = xml.parentNode(); - - if (parentNode.isElement()) - { - nodeId = doc->GetParametrId(parentNode.toElement()); // nodeId is the groupId - } + setText(tr("Add item to group")); + nodeId = groupId; } //--------------------------------------------------------------------------------------------------------------------- @@ -62,38 +55,44 @@ AddItemToGroup::~AddItemToGroup() //--------------------------------------------------------------------------------------------------------------------- void AddItemToGroup::undo() { - qCDebug(vUndo, "Undo."); + qCDebug(vUndo, "Undo the add item to group"); doc->ChangeActivPP(nameActivDraw);//Without this user will not see this change - QDomElement groups = doc->CreateGroups(); - if (not groups.isNull()) + QDomElement group = doc->elementById(nodeId, VAbstractPattern::TagGroup); + if (group.isElement()) { - QDomElement group = doc->elementById(nodeId, VAbstractPattern::TagGroup); - if (group.isElement()) + if (group.removeChild(xml).isNull()) { - if (group.removeChild(xml).isNull()) - { - qCDebug(vUndo, "Can't delete item."); - return; - } - - doc->SetModified(true); - emit qApp->getCurrentDocument()->patternChanged(false); - - doc->ParseGroups(groups); - - emit UpdateGroups(); - } - else - { - qCDebug(vUndo, "Can't get group by id = %u.", nodeId); + qCDebug(vUndo, "Can't delete item."); return; } + + doc->SetModified(true); + emit qApp->getCurrentDocument()->patternChanged(false); + + // set the item visible. Because if the undo is done when unvisibile and it's not in any group after the + // undo, it stays unvisible until the entire drawing is completly rerendered. + quint32 objectId = doc->GetParametrUInt(xml,QString("object"),NULL_ID_STR); + quint32 toolId = doc->GetParametrUInt(xml,QString("tool"),NULL_ID_STR); + VDataTool* tool = doc->getTool(toolId); + tool->GroupVisibility(objectId,true); + + QDomElement groups = doc->CreateGroups(); + if (not groups.isNull()) + { + doc->ParseGroups(groups); + } else + { + qCDebug(vUndo, "Can't get tag Groups."); + return; + } + + emit UpdateGroups(); } else { - qCDebug(vUndo, "Can't get tag Groups."); + qCDebug(vUndo, "Can't get group by id = %u.", nodeId); return; } @@ -101,7 +100,42 @@ void AddItemToGroup::undo() emit doc->SetCurrentPP(nameActivDraw);//Return current pattern piece after undo } +//--------------------------------------------------------------------------------------------------------------------- void AddItemToGroup::redo() { + qCDebug(vUndo, "Redo the add item to group"); + doc->ChangeActivPP(nameActivDraw);//Without this user will not see this change + QDomElement group = doc->elementById(nodeId, VAbstractPattern::TagGroup); + if (group.isElement()) + { + if (group.appendChild(xml).isNull()) + { + qCDebug(vUndo, "Can't add item."); + return; + } + + doc->SetModified(true); + emit qApp->getCurrentDocument()->patternChanged(false); + + QDomElement groups = doc->CreateGroups(); + if (not groups.isNull()) + { + doc->ParseGroups(groups); + } else + { + qCDebug(vUndo, "Can't get tag Groups."); + return; + } + + emit UpdateGroups(); + } + else + { + qCDebug(vUndo, "Can't get group by id = %u.", nodeId); + return; + } + + VMainGraphicsView::NewSceneRect(qApp->getCurrentScene(), qApp->getSceneView()); + emit doc->SetCurrentPP(nameActivDraw);//Return current pattern piece after undo } diff --git a/src/libs/vtools/undocommands/additemtogroup.h b/src/libs/vtools/undocommands/additemtogroup.h index 2d005ada6..63bb4436f 100644 --- a/src/libs/vtools/undocommands/additemtogroup.h +++ b/src/libs/vtools/undocommands/additemtogroup.h @@ -42,13 +42,10 @@ class AddItemToGroup : public VUndoCommand { Q_OBJECT public: - AddItemToGroup(const QDomElement &xml, VAbstractPattern *doc, QUndoCommand *parent = nullptr); + AddItemToGroup(const QDomElement &xml, VAbstractPattern *doc, quint32 nodeId, QUndoCommand *parent = nullptr); virtual ~AddItemToGroup(); virtual void undo() Q_DECL_OVERRIDE; virtual void redo() Q_DECL_OVERRIDE; -protected: - quint32 toolId; - quint32 objectId; signals: void UpdateGroups(); private: diff --git a/src/libs/vtools/undocommands/removeitemfromgroup.cpp b/src/libs/vtools/undocommands/removeitemfromgroup.cpp index 97875f6c1..ffe2b93ad 100644 --- a/src/libs/vtools/undocommands/removeitemfromgroup.cpp +++ b/src/libs/vtools/undocommands/removeitemfromgroup.cpp @@ -1,6 +1,141 @@ +/************************************************************************ + ** + ** @file removeitemfromgroup.cpp + ** @author Roman Telezhynskyi + ** @date 1 4, 2018 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentina project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2016 Valentina project + ** All Rights Reserved. + ** + ** Valentina 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 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina 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 Valentina. If not, see . + ** + *************************************************************************/ + #include "removeitemfromgroup.h" -//RemoveItemFromGroup::RemoveItemFromGroup() -//{ +#include +#include -//} +#include "../vmisc/logging.h" +#include "../vmisc/vabstractapplication.h" +#include "../vmisc/def.h" +#include "../vwidgets/vmaingraphicsview.h" +#include "../ifc/xml/vabstractpattern.h" +#include "../vtools/tools/vdatatool.h" +#include "vundocommand.h" + +//--------------------------------------------------------------------------------------------------------------------- + +RemoveItemFromGroup::RemoveItemFromGroup(const QDomElement &xml, VAbstractPattern *doc, quint32 groupId, QUndoCommand *parent) + : VUndoCommand(xml, doc, parent), nameActivDraw(doc->GetNameActivPP()) +{ + setText(tr("Remove item from group")); + nodeId = groupId; +} + +//--------------------------------------------------------------------------------------------------------------------- +RemoveItemFromGroup::~RemoveItemFromGroup() +{ +} + +//--------------------------------------------------------------------------------------------------------------------- +void RemoveItemFromGroup::undo() +{ + qCDebug(vUndo, "Undo the remove item from group"); + doc->ChangeActivPP(nameActivDraw);//Without this user will not see this change + + QDomElement group = doc->elementById(nodeId, VAbstractPattern::TagGroup); + if (group.isElement()) + { + if (group.appendChild(xml).isNull()) + { + qCDebug(vUndo, "Can't add the item."); + return; + } + + doc->SetModified(true); + emit qApp->getCurrentDocument()->patternChanged(false); + + QDomElement groups = doc->CreateGroups(); + if (not groups.isNull()) + { + doc->ParseGroups(groups); + } else + { + qCDebug(vUndo, "Can't get tag Groups."); + return; + } + + emit UpdateGroups(); + } + else + { + qCDebug(vUndo, "Can't get group by id = %u.", nodeId); + return; + } + + VMainGraphicsView::NewSceneRect(qApp->getCurrentScene(), qApp->getSceneView()); + emit doc->SetCurrentPP(nameActivDraw);//Return current pattern piece after undo +} + +//--------------------------------------------------------------------------------------------------------------------- +void RemoveItemFromGroup::redo() +{ + qCDebug(vUndo, "Redo the add item to group"); + doc->ChangeActivPP(nameActivDraw);//Without this user will not see this change + + QDomElement group = doc->elementById(nodeId, VAbstractPattern::TagGroup); + if (group.isElement()) + { + if (group.removeChild(xml).isNull()) + { + qCDebug(vUndo, "Can't delete item."); + return; + } + + doc->SetModified(true); + emit qApp->getCurrentDocument()->patternChanged(false); + + // set the item visible. Because if the undo is done when unvisibile and it's not in any group after the + // undo, it stays unvisible until the entire drawing is completly rerendered. + quint32 objectId = doc->GetParametrUInt(xml,QString("object"),NULL_ID_STR); + quint32 toolId = doc->GetParametrUInt(xml,QString("tool"),NULL_ID_STR); + VDataTool* tool = doc->getTool(toolId); + tool->GroupVisibility(objectId,true); + + QDomElement groups = doc->CreateGroups(); + if (not groups.isNull()) + { + doc->ParseGroups(groups); + } else + { + qCDebug(vUndo, "Can't get tag Groups."); + return; + } + + emit UpdateGroups(); + } + else + { + qCDebug(vUndo, "Can't get group by id = %u.", nodeId); + return; + } + + VMainGraphicsView::NewSceneRect(qApp->getCurrentScene(), qApp->getSceneView()); + emit doc->SetCurrentPP(nameActivDraw);//Return current pattern piece after undo +} diff --git a/src/libs/vtools/undocommands/removeitemfromgroup.h b/src/libs/vtools/undocommands/removeitemfromgroup.h index fc76a92e5..63bd0e464 100644 --- a/src/libs/vtools/undocommands/removeitemfromgroup.h +++ b/src/libs/vtools/undocommands/removeitemfromgroup.h @@ -1,11 +1,28 @@ #ifndef REMOVEITEMFROMGROUP_H #define REMOVEITEMFROMGROUP_H +#include +#include +#include +#include +#include +#include -//class RemoveItemFromGroup : public VUndoCommand -//{ -//public: -// RemoveItemFromGroup(); -//}; +#include "vundocommand.h" + +class RemoveItemFromGroup : public VUndoCommand +{ + Q_OBJECT +public: + RemoveItemFromGroup(const QDomElement &xml, VAbstractPattern *doc, quint32 groupId, QUndoCommand *parent = nullptr); + virtual ~RemoveItemFromGroup(); + virtual void undo() Q_DECL_OVERRIDE; + virtual void redo() Q_DECL_OVERRIDE; +signals: + void UpdateGroups(); +private: + Q_DISABLE_COPY(RemoveItemFromGroup) + const QString nameActivDraw; +}; #endif // REMOVEITEMFROMGROUP_H diff --git a/src/libs/vwidgets/vabstractmainwindow.h b/src/libs/vwidgets/vabstractmainwindow.h index 59a52e516..6a4d0fa67 100644 --- a/src/libs/vwidgets/vabstractmainwindow.h +++ b/src/libs/vwidgets/vabstractmainwindow.h @@ -46,6 +46,7 @@ public: public slots: virtual void ShowToolTip(const QString &toolTip)=0; + virtual void UpdateGroups()=0; protected slots: void WindowsLocale();