From 37b0eafa61e67a6bb30fae0ca8e2fc094995e452 Mon Sep 17 00:00:00 2001 From: Ilia Ryabokon Date: Tue, 21 Aug 2012 15:23:49 +0300 Subject: [PATCH] Sankore-834 --- src/domain/UBAbstractUndoCommand.h | 3 +- src/domain/UBGraphicsItemGroupUndoCommand.cpp | 58 +++++++++++++++++++ src/domain/UBGraphicsItemGroupUndoCommand.h | 30 ++++++++++ .../UBGraphicsItemTransformUndoCommand.h | 2 +- src/domain/UBGraphicsItemUndoCommand.cpp | 9 +++ src/domain/UBGraphicsItemUndoCommand.h | 6 +- src/domain/UBGraphicsScene.cpp | 3 +- src/domain/domain.pri | 6 +- 8 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 src/domain/UBGraphicsItemGroupUndoCommand.cpp create mode 100644 src/domain/UBGraphicsItemGroupUndoCommand.h diff --git a/src/domain/UBAbstractUndoCommand.h b/src/domain/UBAbstractUndoCommand.h index da451769..a0c3d187 100644 --- a/src/domain/UBAbstractUndoCommand.h +++ b/src/domain/UBAbstractUndoCommand.h @@ -32,7 +32,8 @@ class UBAbstractUndoCommand : public QUndoCommand undotype_GRAPHICITEMTRANSFORM = 2, undotype_GRAPHICITEM = 3, undotype_GRAPHICTEXTITEM = 4, - undotype_PAGESIZE = 5 + undotype_PAGESIZE = 5, + undotype_GRAPHICSGROUPITEM = 6 }; virtual UndoType getType() { return undotype_UNKNOWN; } diff --git a/src/domain/UBGraphicsItemGroupUndoCommand.cpp b/src/domain/UBGraphicsItemGroupUndoCommand.cpp new file mode 100644 index 00000000..9b58dc1d --- /dev/null +++ b/src/domain/UBGraphicsItemGroupUndoCommand.cpp @@ -0,0 +1,58 @@ +#include "UBGraphicsItemGroupUndoCommand.h" + +#include "UBGraphicsGroupContainerItem.h" +#include "UBGraphicsScene.h" +#include "core/memcheck.h" + + +UBGraphicsItemGroupUndoCommand::UBGraphicsItemGroupUndoCommand(UBGraphicsScene *pScene, UBGraphicsGroupContainerItem *pGroupCreated) : + mScene (pScene), mGroup(pGroupCreated), mFirstRedo(true) + +{ + if (pGroupCreated->childItems().count()) { + foreach (QGraphicsItem *item, pGroupCreated->childItems()) { + mItems << item; + } + } +} + +UBGraphicsItemGroupUndoCommand::~UBGraphicsItemGroupUndoCommand() +{ +} + +void UBGraphicsItemGroupUndoCommand::undo() +{ + mGroup->destroy(); + foreach(QGraphicsItem *item, mItems) { + item->setSelected(true); + } +} + +void UBGraphicsItemGroupUndoCommand::redo() +{ + if (mFirstRedo) { + //Work around. TODO determine why does Qt call the redo function on pushing to undo + mFirstRedo = false; + return; + } + + foreach (QGraphicsItem *item, mItems) { + if (item->type() == UBGraphicsGroupContainerItem::Type) { + QList childItems = item->childItems(); + UBGraphicsGroupContainerItem *currentGroup = dynamic_cast(item); + if (currentGroup) { + currentGroup->destroy(); + } + foreach (QGraphicsItem *chItem, childItems) { + mGroup->addToGroup(chItem); + } + } else { + mGroup->addToGroup(item); + } + } + + mScene->addItem(mGroup); + mGroup->setVisible(true); + mGroup->setFocus(); + mGroup->setSelected(true); +} diff --git a/src/domain/UBGraphicsItemGroupUndoCommand.h b/src/domain/UBGraphicsItemGroupUndoCommand.h new file mode 100644 index 00000000..bbc0a022 --- /dev/null +++ b/src/domain/UBGraphicsItemGroupUndoCommand.h @@ -0,0 +1,30 @@ +#ifndef UBGRAPHICSITEMGROUPUNDOCOMMAND_H +#define UBGRAPHICSITEMGROUPUNDOCOMMAND_H + +#include +#include "UBAbstractUndoCommand.h" + +class UBGraphicsScene; +class UBGraphicsGroupContainerItem; + +class UBGraphicsItemGroupUndoCommand : public UBAbstractUndoCommand +{ +public: + UBGraphicsItemGroupUndoCommand(UBGraphicsScene *pScene, UBGraphicsGroupContainerItem *pGroupCreated); + virtual ~UBGraphicsItemGroupUndoCommand(); + + virtual UndoType getType() { return undotype_GRAPHICSGROUPITEM; } + +protected: + virtual void undo(); + virtual void redo(); + +private: + UBGraphicsScene *mScene; + UBGraphicsGroupContainerItem *mGroup; + QList mItems; + + bool mFirstRedo; +}; + +#endif // UBGRAPHICSITEMGROUPUNDOCOMMAND_H diff --git a/src/domain/UBGraphicsItemTransformUndoCommand.h b/src/domain/UBGraphicsItemTransformUndoCommand.h index 0f6b405d..07d8e0c3 100644 --- a/src/domain/UBGraphicsItemTransformUndoCommand.h +++ b/src/domain/UBGraphicsItemTransformUndoCommand.h @@ -32,7 +32,7 @@ class UBGraphicsItemTransformUndoCommand : public UBAbstractUndoCommand const QSizeF& prevSize = QSizeF()); virtual ~UBGraphicsItemTransformUndoCommand(); - virtual UndoType getType() { return undotype_GRAPHICITEMTRANSFORM; }; + virtual UndoType getType() { return undotype_GRAPHICITEMTRANSFORM; } protected: virtual void undo(); diff --git a/src/domain/UBGraphicsItemUndoCommand.cpp b/src/domain/UBGraphicsItemUndoCommand.cpp index 8d4ebf52..d9961fa0 100644 --- a/src/domain/UBGraphicsItemUndoCommand.cpp +++ b/src/domain/UBGraphicsItemUndoCommand.cpp @@ -24,6 +24,7 @@ #include "board/UBBoardController.h" #include "core/memcheck.h" +#include "domain/UBGraphicsGroupContainerItem.h" UBGraphicsItemUndoCommand::UBGraphicsItemUndoCommand(UBGraphicsScene* pScene, const QSet& pRemovedItems, const QSet& pAddedItems) @@ -81,6 +82,14 @@ void UBGraphicsItemUndoCommand::undo() { QGraphicsItem* item = itAdded.next(); + //if removing group + if (item->type() == UBGraphicsGroupContainerItem::Type) { + UBGraphicsGroupContainerItem *curGroup = qgraphicsitem_cast(item); + if (curGroup) { + curGroup->destroy(); + } + } + UBApplication::boardController->freezeW3CWidget(item, true); item->setSelected(false); mScene->removeItem(item); diff --git a/src/domain/UBGraphicsItemUndoCommand.h b/src/domain/UBGraphicsItemUndoCommand.h index 113c421e..78e7ec9a 100644 --- a/src/domain/UBGraphicsItemUndoCommand.h +++ b/src/domain/UBGraphicsItemUndoCommand.h @@ -34,10 +34,10 @@ class UBGraphicsItemUndoCommand : public UBAbstractUndoCommand virtual ~UBGraphicsItemUndoCommand(); - QSet GetAddedList() { return mAddedItems; }; - QSet GetRemovedList() { return mRemovedItems; }; + QSet GetAddedList() { return mAddedItems; } + QSet GetRemovedList() { return mRemovedItems; } - virtual UndoType getType() { return undotype_GRAPHICITEM; }; + virtual UndoType getType() { return undotype_GRAPHICITEM; } protected: virtual void undo(); diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 19a7e851..6b573710 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -47,6 +47,7 @@ #include "board/UBBoardView.h" #include "UBGraphicsItemUndoCommand.h" +#include "UBGraphicsItemGroupUndoCommand.h" #include "UBGraphicsTextItemUndoCommand.h" #include "UBGraphicsProxyWidget.h" #include "UBGraphicsPixmapItem.h" @@ -1521,7 +1522,7 @@ UBGraphicsGroupContainerItem *UBGraphicsScene::createGroup(QListsetFocus(); if (enableUndoRedoStack) { //should be deleted after scene own undo stack implemented - UBGraphicsItemUndoCommand* uc = new UBGraphicsItemUndoCommand(this, 0, groupItem); + UBGraphicsItemGroupUndoCommand* uc = new UBGraphicsItemGroupUndoCommand(this, groupItem); UBApplication::undoStack->push(uc); } diff --git a/src/domain/domain.pri b/src/domain/domain.pri index d66c72ec..e8b46b4d 100644 --- a/src/domain/domain.pri +++ b/src/domain/domain.pri @@ -20,7 +20,8 @@ HEADERS += src/domain/UBGraphicsScene.h \ src/domain/UBAbstractUndoCommand.h\ src/domain/UBGraphicsGroupContainerItem.h \ src/domain/UBGraphicsGroupContainerItemDelegate.h \ - src/domain/UBGraphicsStrokesGroup.h + src/domain/UBGraphicsStrokesGroup.h \ + src/domain/UBGraphicsItemGroupUndoCommand.h HEADERS += src/domain/UBGraphicsItemDelegate.h \ src/domain/UBGraphicsTextItemDelegate.h \ @@ -51,7 +52,8 @@ SOURCES += src/domain/UBGraphicsScene.cpp \ src/domain/UBAbstractUndoCommand.cpp \ src/domain/ubgraphicsgroupcontaineritem.cpp \ src/domain/ubgraphicsgroupcontaineritemdelegate.cpp \ - src/domain/UBGraphicsStrokesGroup.cpp + src/domain/UBGraphicsStrokesGroup.cpp \ + src/domain/UBGraphicsItemGroupUndoCommand.cpp SOURCES += src/domain/UBGraphicsItemDelegate.cpp \ src/domain/UBGraphicsTextItemDelegate.cpp \