From da8c496f3e51b5e2945aba9174ac9f94267763de Mon Sep 17 00:00:00 2001
From: Ilia Ryabokon <ilin@scand.com>
Date: Wed, 15 Aug 2012 20:37:19 +0300
Subject: [PATCH] Flipping and rotating possibilities for
 UBGraphicsGroupContainerItem

---
 src/core/UB.h                                 |  3 ++
 src/domain/UBGraphicsGroupContainerItem.cpp   | 37 ++++++++++++++++++-
 .../UBGraphicsGroupContainerItemDelegate.cpp  |  4 +-
 src/domain/UBGraphicsItemDelegate.cpp         | 22 ++++++++++-
 src/domain/UBGraphicsItemDelegate.h           |  5 ++-
 src/domain/UBGraphicsMediaItem.cpp            |  1 -
 src/domain/UBGraphicsMediaItemDelegate.cpp    |  6 ++-
 src/domain/UBGraphicsPixmapItem.cpp           |  4 +-
 src/domain/UBGraphicsScene.cpp                |  9 ++---
 src/domain/UBGraphicsStrokesGroup.cpp         |  2 +
 src/domain/UBGraphicsSvgItem.cpp              |  1 +
 src/domain/UBGraphicsTextItem.cpp             |  2 +
 src/domain/UBGraphicsTextItemDelegate.cpp     |  2 +-
 src/domain/UBGraphicsWebView.cpp              |  2 +-
 src/domain/UBItem.cpp                         | 10 +++++
 src/domain/UBItem.h                           |  3 ++
 src/gui/UBFeaturesWidget.h                    |  1 -
 src/tools/UBGraphicsCurtainItem.cpp           |  1 +
 18 files changed, 98 insertions(+), 17 deletions(-)

diff --git a/src/core/UB.h b/src/core/UB.h
index e486d86c..afc0f91e 100644
--- a/src/core/UB.h
+++ b/src/core/UB.h
@@ -117,6 +117,9 @@ struct UBGraphicsItemData
         , ItemOwnZValue
         , itemLayerType //use instead of deprecated ItemLayerType
         , ItemUuid //storing uuid in QGraphicsItem for fast finding operations
+        //Duplicating delegate's functions to make possible working with pure QGraphicsItem
+        , ItemFlippable // (bool)
+        , ItemRotatable // (bool)
     };
 };
 
diff --git a/src/domain/UBGraphicsGroupContainerItem.cpp b/src/domain/UBGraphicsGroupContainerItem.cpp
index b35cbdbf..75e57711 100644
--- a/src/domain/UBGraphicsGroupContainerItem.cpp
+++ b/src/domain/UBGraphicsGroupContainerItem.cpp
@@ -29,6 +29,7 @@ UBGraphicsGroupContainerItem::UBGraphicsGroupContainerItem(QGraphicsItem *parent
 
     setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); //Necessary to set if we want z value to be assigned correctly
 
+
 }
 
 void UBGraphicsGroupContainerItem::addToGroup(QGraphicsItem *item)
@@ -42,6 +43,19 @@ void UBGraphicsGroupContainerItem::addToGroup(QGraphicsItem *item)
         return;
     }
 
+    //Check if group is allready rotatable or flippable
+    if (childItems().count()) {
+        if (UBGraphicsItem::isFlippable(this) && !UBGraphicsItem::isFlippable(item)) {
+            mDelegate->setFlippable(false);
+        }
+        if (UBGraphicsItem::isRotatable(this) && !UBGraphicsItem::isRotatable(item)) {
+            mDelegate->setRotatable(false);
+        }
+    } else {
+        mDelegate->setFlippable(UBGraphicsItem::isFlippable(item));
+        mDelegate->setRotatable(UBGraphicsItem::isRotatable(item));
+    }
+
     // COMBINE
     bool ok;
     QTransform itemTransform = item->itemTransform(this, &ok);
@@ -80,7 +94,7 @@ void UBGraphicsGroupContainerItem::addToGroup(QGraphicsItem *item)
     // ### Expensive, we could maybe use dirtySceneTransform bit for optimization
 
     item->setTransform(newItemTransform);
-//    item->d_func()->setIsMemberOfGroup(true);
+    //    item->d_func()->setIsMemberOfGroup(true);
     prepareGeometryChange();
     itemsBoundingRect |= itemTransform.mapRect(item->boundingRect() | item->childrenBoundingRect());
     update();
@@ -270,6 +284,27 @@ void UBGraphicsGroupContainerItem::pRemoveFromGroup(QGraphicsItem *item)
 
     QGraphicsItem *newParent = parentItem();
 
+    if (childItems().count()) {
+        if (!UBGraphicsItem::isFlippable(item) || !UBGraphicsItem::isRotatable(item)) {
+            bool flippableNow = true;
+            bool rotatableNow = true;
+
+            foreach (QGraphicsItem *item, childItems()) {
+                if (!UBGraphicsItem::isFlippable(item)) {
+                    flippableNow = false;
+                }
+                if (!UBGraphicsItem::isRotatable(item)) {
+                    rotatableNow = false;
+                }
+                if (!rotatableNow && !flippableNow) {
+                    break;
+                }
+            }
+            mDelegate->setFlippable(flippableNow);
+            mDelegate->setRotatable(rotatableNow);
+        }
+    }
+
     // COMBINE
     bool ok;
     QTransform itemTransform;
diff --git a/src/domain/UBGraphicsGroupContainerItemDelegate.cpp b/src/domain/UBGraphicsGroupContainerItemDelegate.cpp
index d514c0e5..6d753cd8 100644
--- a/src/domain/UBGraphicsGroupContainerItemDelegate.cpp
+++ b/src/domain/UBGraphicsGroupContainerItemDelegate.cpp
@@ -16,7 +16,9 @@ UBGraphicsGroupContainerItemDelegate::UBGraphicsGroupContainerItemDelegate(QGrap
     UBGraphicsItemDelegate(pDelegated, parent, true, false, false), mDestroyGroupButton(0)
 
 {
-
+    //Wrapper function. Use it to set correct data() to QGraphicsItem as well
+    setFlippable(false);
+    setRotatable(false);
 }
 
 UBGraphicsGroupContainerItem *UBGraphicsGroupContainerItemDelegate::delegated()
diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp
index e3986e2a..f26d5ed1 100644
--- a/src/domain/UBGraphicsItemDelegate.cpp
+++ b/src/domain/UBGraphicsItemDelegate.cpp
@@ -158,6 +158,10 @@ void UBGraphicsItemDelegate::init()
             button->setFlag(QGraphicsItem::ItemIsSelectable, true);
         }
     }
+
+    //Wrapper function. Use it to set correct data() to QGraphicsItem as well
+    setFlippable(false);
+    setRotatable(false);
 }
 
 
@@ -410,7 +414,7 @@ void UBGraphicsItemDelegate::remove(bool canUndo)
 }
 
 
-bool UBGraphicsItemDelegate::isLocked()
+bool UBGraphicsItemDelegate::isLocked() const
 {
     return mDelegated->data(UBGraphicsItemData::ItemLocked).toBool();
 }
@@ -598,6 +602,22 @@ void UBGraphicsItemDelegate::showMenu()
 void UBGraphicsItemDelegate::setFlippable(bool flippable)
 {
     mFlippable = flippable;
+
+    Q_ASSERT (mDelegated);
+    if (mDelegated) {
+        mDelegated->setData(UBGraphicsItemData::ItemFlippable, QVariant(flippable));
+    }
+}
+
+void UBGraphicsItemDelegate::setRotatable(bool pCanRotate)
+{
+    mCanRotate = pCanRotate;
+
+    Q_ASSERT(mDelegated);
+
+    if (mDelegated) {
+        mDelegated->setData(UBGraphicsItemData::ItemRotatable, QVariant(pCanRotate));
+    }
 }
 
 bool UBGraphicsItemDelegate::isFlippable()
diff --git a/src/domain/UBGraphicsItemDelegate.h b/src/domain/UBGraphicsItemDelegate.h
index 88c598c7..c45fd8be 100644
--- a/src/domain/UBGraphicsItemDelegate.h
+++ b/src/domain/UBGraphicsItemDelegate.h
@@ -224,8 +224,8 @@ class UBGraphicsItemDelegate : public QObject
 
         UBGraphicsDelegateFrame* frame() { return mFrame; }
 
-        bool canRotate() { return mCanRotate; }
-        bool isLocked();
+        bool canRotate() const { return mCanRotate; }
+        bool isLocked() const;
         bool canDuplicate() { return mCanDuplicate; }
 
         QMimeData* mimeData(){ return mMimeData; }
@@ -233,6 +233,7 @@ class UBGraphicsItemDelegate : public QObject
         void setDragPixmap(const QPixmap &pix) {mDragPixmap = pix;}
 
         void setFlippable(bool flippable);
+        void setRotatable(bool pCanRotate);
         bool isFlippable();
 
         void setButtonsVisible(bool visible);
diff --git a/src/domain/UBGraphicsMediaItem.cpp b/src/domain/UBGraphicsMediaItem.cpp
index f077bdf6..8e2778e5 100644
--- a/src/domain/UBGraphicsMediaItem.cpp
+++ b/src/domain/UBGraphicsMediaItem.cpp
@@ -131,7 +131,6 @@ UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsIte
 
     connect(mDelegate, SIGNAL(showOnDisplayChanged(bool)), this, SLOT(showOnDisplayChanged(bool)));
     connect(mMediaObject, SIGNAL(hasVideoChanged(bool)), this, SLOT(hasMediaChanged(bool)));
-
 }
 
 
diff --git a/src/domain/UBGraphicsMediaItemDelegate.cpp b/src/domain/UBGraphicsMediaItemDelegate.cpp
index d34632ca..6a99a174 100644
--- a/src/domain/UBGraphicsMediaItemDelegate.cpp
+++ b/src/domain/UBGraphicsMediaItemDelegate.cpp
@@ -56,6 +56,10 @@ UBGraphicsMediaItemDelegate::UBGraphicsMediaItemDelegate(UBGraphicsMediaItem* pD
     {
         delegated()->setMute(true);
     }
+
+    //Wrapper function. Use it to set correct data() to QGraphicsItem as well
+    setFlippable(false);
+    setRotatable(false);
 }
 
 bool UBGraphicsMediaItemDelegate::mousePressEvent(QGraphicsSceneMouseEvent *event)
@@ -269,4 +273,4 @@ void UBGraphicsMediaItemDelegate::updateTicker(qint64 time)
 void UBGraphicsMediaItemDelegate::totalTimeChanged(qint64 newTotalTime)
 {
     mMediaControl->totalTimeChanged(newTotalTime);
-}
\ No newline at end of file
+}
diff --git a/src/domain/UBGraphicsPixmapItem.cpp b/src/domain/UBGraphicsPixmapItem.cpp
index 936b9195..4e346256 100644
--- a/src/domain/UBGraphicsPixmapItem.cpp
+++ b/src/domain/UBGraphicsPixmapItem.cpp
@@ -28,10 +28,10 @@
 UBGraphicsPixmapItem::UBGraphicsPixmapItem(QGraphicsItem* parent)
     : QGraphicsPixmapItem(parent)
 {
-    mDelegate = new UBGraphicsItemDelegate(this, 0, true, true, false);
+    mDelegate = new UBGraphicsItemDelegate(this, 0, true);
     mDelegate->init();
-
     mDelegate->setFlippable(true);
+    mDelegate->setRotatable(true);
 
     setData(UBGraphicsItemData::ItemLayerType, UBItemLayerType::Object);
     setTransformationMode(Qt::SmoothTransformation);
diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp
index 08ecb49e..97659ec1 100644
--- a/src/domain/UBGraphicsScene.cpp
+++ b/src/domain/UBGraphicsScene.cpp
@@ -308,9 +308,10 @@ UBGraphicsScene::~UBGraphicsScene()
 void UBGraphicsScene::selectionChangedProcessing()
 {
     if (selectedItems().count()){
-        qDebug() << "Selected item bounding rect: " << selectedItems().first()->boundingRect();
-        UBApplication::showMessage("ZValue is " + QString::number(selectedItems().first()->zValue(), 'f') + "own z value is "
-                                                + QString::number(selectedItems().first()->data(UBGraphicsItemData::ItemOwnZValue).toReal(), 'f'));
+        //        UBApplication::showMessage("ZValue is " + QString::number(selectedItems().first()->zValue(), 'f') + "own z value is "
+//                                                + QString::number(selectedItems().first()->data(UBGraphicsItemData::ItemOwnZValue).toReal(), 'f'));
+        qDebug() << "flippable" << selectedItems().first()->data(UBGraphicsItemData::ItemFlippable).toBool() << endl
+                 << "rotatable" << selectedItems().first()->data(UBGraphicsItemData::ItemRotatable).toBool();
     }
 }
 
@@ -1998,8 +1999,6 @@ void UBGraphicsScene::moveMagnifier(QPoint newPos, bool forceGrab)
 
     QPoint dvZeroPoint = dView->mapToGlobal(QPoint(0,0));
 
-    QRect qcr = cView->geometry();
-    QRect qdr = dView->geometry();
     int cvW = cView->width();
     int dvW = dView->width();
     qreal wCoeff = (qreal)dvW / (qreal)cvW;
diff --git a/src/domain/UBGraphicsStrokesGroup.cpp b/src/domain/UBGraphicsStrokesGroup.cpp
index 92cd1bf4..4f1be91f 100644
--- a/src/domain/UBGraphicsStrokesGroup.cpp
+++ b/src/domain/UBGraphicsStrokesGroup.cpp
@@ -9,6 +9,8 @@ UBGraphicsStrokesGroup::UBGraphicsStrokesGroup(QGraphicsItem *parent):QGraphicsI
     mDelegate = new UBGraphicsItemDelegate(this, 0, true, true, false);
     mDelegate->init();
     mDelegate->setFlippable(true);
+    mDelegate->setRotatable(true);
+
     setData(UBGraphicsItemData::ItemLayerType, UBItemLayerType::Object);
 
     setUuid(QUuid::createUuid());
diff --git a/src/domain/UBGraphicsSvgItem.cpp b/src/domain/UBGraphicsSvgItem.cpp
index b9976ae9..e393ef23 100644
--- a/src/domain/UBGraphicsSvgItem.cpp
+++ b/src/domain/UBGraphicsSvgItem.cpp
@@ -56,6 +56,7 @@ void UBGraphicsSvgItem::init()
     mDelegate = new UBGraphicsItemDelegate(this, 0, true, true, false);
     mDelegate->init();
     mDelegate->setFlippable(true);
+    mDelegate->setRotatable(true);
 
     setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
 
diff --git a/src/domain/UBGraphicsTextItem.cpp b/src/domain/UBGraphicsTextItem.cpp
index eb93f975..393a3640 100644
--- a/src/domain/UBGraphicsTextItem.cpp
+++ b/src/domain/UBGraphicsTextItem.cpp
@@ -38,6 +38,8 @@ UBGraphicsTextItem::UBGraphicsTextItem(QGraphicsItem * parent)
     mDelegate->init();
 
     mDelegate->frame()->setOperationMode(UBGraphicsDelegateFrame::Resizing);
+    mDelegate->setFlippable(false);
+    mDelegate->setRotatable(true);
 
     mTypeTextHereLabel = tr("<Type Text Here>");
 
diff --git a/src/domain/UBGraphicsTextItemDelegate.cpp b/src/domain/UBGraphicsTextItemDelegate.cpp
index f9220302..3ab8f973 100644
--- a/src/domain/UBGraphicsTextItemDelegate.cpp
+++ b/src/domain/UBGraphicsTextItemDelegate.cpp
@@ -402,4 +402,4 @@ void UBGraphicsTextItemDelegate::ChangeTextSize(qreal factor, textChangeMode cha
 void UBGraphicsTextItemDelegate::scaleTextSize(qreal multiplyer)
 {
     ChangeTextSize(multiplyer, scaleSize);
-}
\ No newline at end of file
+}
diff --git a/src/domain/UBGraphicsWebView.cpp b/src/domain/UBGraphicsWebView.cpp
index 39c4f931..ea6a66ad 100644
--- a/src/domain/UBGraphicsWebView.cpp
+++ b/src/domain/UBGraphicsWebView.cpp
@@ -28,7 +28,7 @@ UBGraphicsWebView::UBGraphicsWebView(QGraphicsItem* parent)
 {
     setData(UBGraphicsItemData::ItemLayerType, UBItemLayerType::Object);
 
-    mDelegate = new UBGraphicsItemDelegate(this, 0, true, false, false);
+    mDelegate = new UBGraphicsItemDelegate(this, 0, true);
     mDelegate->init();
 
     setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
diff --git a/src/domain/UBItem.cpp b/src/domain/UBItem.cpp
index f5098d23..9d999a94 100644
--- a/src/domain/UBItem.cpp
+++ b/src/domain/UBItem.cpp
@@ -34,3 +34,13 @@ void UBGraphicsItem::assignZValue(QGraphicsItem *item, qreal value)
     item->setZValue(value);
     item->setData(UBGraphicsItemData::ItemOwnZValue, value);
 }
+
+bool UBGraphicsItem::isFlippable(QGraphicsItem *item)
+{
+    return item->data(UBGraphicsItemData::ItemFlippable).toBool();
+}
+
+bool UBGraphicsItem::isRotatable(QGraphicsItem *item)
+{
+    return item->data(UBGraphicsItemData::ItemRotatable).toBool();
+}
diff --git a/src/domain/UBItem.h b/src/domain/UBItem.h
index 21519a1b..99c3e6a6 100644
--- a/src/domain/UBItem.h
+++ b/src/domain/UBItem.h
@@ -105,6 +105,9 @@ protected:
 public:
 
     static void assignZValue(QGraphicsItem*, qreal value);
+    static bool isRotatable(QGraphicsItem *item);
+    static bool isFlippable(QGraphicsItem *item);
+
     virtual UBGraphicsItemDelegate *Delegate() const  = 0;
 
     virtual void remove() = 0;
diff --git a/src/gui/UBFeaturesWidget.h b/src/gui/UBFeaturesWidget.h
index 583d7268..5a1b987e 100644
--- a/src/gui/UBFeaturesWidget.h
+++ b/src/gui/UBFeaturesWidget.h
@@ -248,7 +248,6 @@ private slots:
     void setFileNameList(const QStringList &pLst);
     void reactOnTextChanged(const QString &pStr);
 
-
 private:
     QLineEdit *mLineEdit;
     QRegExpValidator *mValidator;
diff --git a/src/tools/UBGraphicsCurtainItem.cpp b/src/tools/UBGraphicsCurtainItem.cpp
index 746ed5c6..a84d0234 100644
--- a/src/tools/UBGraphicsCurtainItem.cpp
+++ b/src/tools/UBGraphicsCurtainItem.cpp
@@ -39,6 +39,7 @@ UBGraphicsCurtainItem::UBGraphicsCurtainItem(QGraphicsItem* parent)
 {
     mDelegate = new UBGraphicsCurtainItemDelegate(this, 0);
     mDelegate->init();
+
     setFlag(QGraphicsItem::ItemIsMovable, true);
     setFlag(QGraphicsItem::ItemIsSelectable, true);