From 881a1d5011ed57b1564018add6fc92823456e321 Mon Sep 17 00:00:00 2001 From: Craig Watson Date: Sun, 30 Apr 2017 15:55:05 -0400 Subject: [PATCH] Add ability to undo/redo setting image as background --- src/domain/UBGraphicsItemDelegate.cpp | 14 ++++++++++++++ .../UBGraphicsItemTransformUndoCommand.cpp | 19 ++++++++++++++++++- .../UBGraphicsItemTransformUndoCommand.h | 5 ++++- src/domain/UBGraphicsScene.cpp | 15 +++++++++++++++ src/domain/UBGraphicsScene.h | 1 + 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp index c21b9bd1..99dec7cb 100644 --- a/src/domain/UBGraphicsItemDelegate.cpp +++ b/src/domain/UBGraphicsItemDelegate.cpp @@ -596,16 +596,30 @@ void UBGraphicsItemDelegate::showHide(bool show) emit showOnDisplayChanged(show); } +/** + * @brief Set delegate as background for the scene, replacing any existing background. + */ void UBGraphicsItemDelegate::setAsBackground() { UBGraphicsScene* scene = castUBGraphicsScene(); QGraphicsItem* item = delegated(); if (scene && item) { + startUndoStep(); + item->resetTransform(); item->setPos(item->sceneBoundingRect().width()/-2., item->sceneBoundingRect().height()/-2.); scene->setAsBackgroundObject(item); + + UBGraphicsItemTransformUndoCommand *uc = + new UBGraphicsItemTransformUndoCommand(mDelegated, + mPreviousPosition, + mPreviousTransform, + mPreviousZValue, + mPreviousSize, + true); + UBApplication::undoStack->push(uc); } } diff --git a/src/domain/UBGraphicsItemTransformUndoCommand.cpp b/src/domain/UBGraphicsItemTransformUndoCommand.cpp index fad0a3af..f280fd5b 100644 --- a/src/domain/UBGraphicsItemTransformUndoCommand.cpp +++ b/src/domain/UBGraphicsItemTransformUndoCommand.cpp @@ -30,12 +30,14 @@ #include "UBGraphicsItemTransformUndoCommand.h" #include "UBResizableGraphicsItem.h" #include "domain/UBItem.h" +#include "domain/UBGraphicsScene.h" #include "core/memcheck.h" UBGraphicsItemTransformUndoCommand::UBGraphicsItemTransformUndoCommand(QGraphicsItem* pItem, const QPointF& prevPos, const QTransform& prevTransform, const qreal& prevZValue, - const QSizeF& prevSize):UBUndoCommand() + const QSizeF& prevSize, bool setToBackground) + : UBUndoCommand() { mItem = pItem; mPreviousTransform = prevTransform; @@ -52,6 +54,8 @@ UBGraphicsItemTransformUndoCommand::UBGraphicsItemTransformUndoCommand(QGraphics if (resizableItem) mCurrentSize = resizableItem->size(); + + mSetToBackground = setToBackground; } UBGraphicsItemTransformUndoCommand::~UBGraphicsItemTransformUndoCommand() @@ -61,6 +65,13 @@ UBGraphicsItemTransformUndoCommand::~UBGraphicsItemTransformUndoCommand() void UBGraphicsItemTransformUndoCommand::undo() { + if (mSetToBackground) { + UBGraphicsScene* scene = dynamic_cast(mItem->scene()); + if (scene && scene->isBackgroundObject(mItem)) { + scene->unsetBackgroundObject(); + } + } + mItem->setPos(mPreviousPosition); mItem->setTransform(mPreviousTransform); mItem->setZValue(mPreviousZValue); @@ -73,6 +84,12 @@ void UBGraphicsItemTransformUndoCommand::undo() void UBGraphicsItemTransformUndoCommand::redo() { + if (mSetToBackground) { + UBGraphicsScene* scene = dynamic_cast(mItem->scene()); + if (scene) + scene->setAsBackgroundObject(mItem); + } + mItem->setPos(mCurrentPosition); mItem->setTransform(mCurrentTransform); mItem->setZValue(mCurrentZValue); diff --git a/src/domain/UBGraphicsItemTransformUndoCommand.h b/src/domain/UBGraphicsItemTransformUndoCommand.h index da67efad..9cd6b93a 100644 --- a/src/domain/UBGraphicsItemTransformUndoCommand.h +++ b/src/domain/UBGraphicsItemTransformUndoCommand.h @@ -42,7 +42,8 @@ class UBGraphicsItemTransformUndoCommand : public UBUndoCommand const QPointF& prevPos, const QTransform& prevTransform, const qreal& prevZValue, - const QSizeF& prevSize = QSizeF()); + const QSizeF& prevSize = QSizeF(), + bool setToBackground = false); virtual ~UBGraphicsItemTransformUndoCommand(); virtual int getType() const { return UBUndoType::undotype_GRAPHICITEMTRANSFORM; } @@ -63,6 +64,8 @@ class UBGraphicsItemTransformUndoCommand : public UBUndoCommand qreal mPreviousZValue; qreal mCurrentZValue; + bool mSetToBackground; + }; #endif /* UBGRAPHICSITEMTRANSFORMUNDOCOMMAND_H_ */ diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 162eba9d..efd58c41 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -1983,6 +1983,21 @@ QGraphicsItem* UBGraphicsScene::setAsBackgroundObject(QGraphicsItem* item, bool return item; } +void UBGraphicsScene::unsetBackgroundObject() +{ + if (!mBackgroundObject) + return; + + mBackgroundObject->setFlag(QGraphicsItem::ItemIsSelectable, true); + mBackgroundObject->setFlag(QGraphicsItem::ItemIsMovable, true); + mBackgroundObject->setAcceptedMouseButtons(Qt::LeftButton); + + // Item zLayer and Layer Type should be set by the caller of this function, as + // it may depend on the object type, where it was before, etc. + + mBackgroundObject = 0; +} + QRectF UBGraphicsScene::normalizedSceneRect(qreal ratio) { diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h index 74577250..544aa34c 100644 --- a/src/domain/UBGraphicsScene.h +++ b/src/domain/UBGraphicsScene.h @@ -174,6 +174,7 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem void addGroup(UBGraphicsGroupContainerItem *groupItem); QGraphicsItem* setAsBackgroundObject(QGraphicsItem* item, bool pAdaptTransformation = false, bool expand = false); + void unsetBackgroundObject(); QGraphicsItem* backgroundObject() const {