From 88921fbb7736b65ffddd8f292656f4c69e3ec1c6 Mon Sep 17 00:00:00 2001
From: -f <claudio@open-sankore.org>
Date: Wed, 11 Dec 2013 11:03:50 +0100
Subject: [PATCH] fixed issue 111

---
 src/adaptors/UBSvgSubsetAdaptor.cpp         | 17 +++++++++++++++++
 src/domain/UBGraphicsGroupContainerItem.cpp | 15 +++++++++++++--
 src/domain/UBGraphicsItemDelegate.cpp       |  9 +++++++++
 src/domain/UBGraphicsItemDelegate.h         |  1 +
 src/domain/UBItem.cpp                       |  5 +++++
 src/domain/UBItem.h                         |  1 +
 6 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/src/adaptors/UBSvgSubsetAdaptor.cpp b/src/adaptors/UBSvgSubsetAdaptor.cpp
index a80ef091..8c465bc3 100644
--- a/src/adaptors/UBSvgSubsetAdaptor.cpp
+++ b/src/adaptors/UBSvgSubsetAdaptor.cpp
@@ -42,6 +42,7 @@
 #include "domain/UBGraphicsStroke.h"
 #include "domain/UBGraphicsStrokesGroup.h"
 #include "domain/UBGraphicsGroupContainerItem.h"
+#include "domain/UBGraphicsGroupContainerItemDelegate.h"
 #include "domain/UBItem.h"
 
 #include "tools/UBGraphicsRuler.h"
@@ -924,7 +925,13 @@ void UBSvgSubsetAdaptor::UBSvgSubsetReader::readGroupRoot()
         }
         else if (mXmlReader.isStartElement()) {
             if (mXmlReader.name() == tGroup) {
+                QString ubLocked = mXmlReader.attributes().value(UBSettings::uniboardDocumentNamespaceUri, "locked").toString();
                 UBGraphicsGroupContainerItem *curGroup = readGroup();
+                if (!ubLocked.isEmpty())
+                {
+                    bool isLocked = ubLocked.contains(xmlTrue);
+                    curGroup->Delegate()->setLocked(isLocked);
+                }
                 if (curGroup) {
                     mScene->addGroup(curGroup);
                 }
@@ -1276,6 +1283,9 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex)
                 if (curElement.hasAttribute(aId)) {
                     mXmlWriter.writeStartElement(curElement.tagName());
                     mXmlWriter.writeAttribute(aId, curElement.attribute(aId));
+                    if(curElement.hasAttribute("locked")){
+                        mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri,"locked",curElement.attribute("locked"));
+                    }
                     QDomElement curSubElement = curElement.firstChildElement();
                     while (!curSubElement.isNull()) {
                         if (curSubElement.hasAttribute(aId)) {
@@ -1320,6 +1330,13 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistGroupToDom(QGraphicsItem *gro
     if (!uuid.isNull()) {
         QDomElement curGroupElement = groupDomDocument->createElement(tGroup);
         curGroupElement.setAttribute(aId, uuid);
+        UBGraphicsGroupContainerItem* group = dynamic_cast<UBGraphicsGroupContainerItem*>(groupItem);
+        if(group && group->Delegate()){
+            if(group->Delegate()->isLocked())
+                curGroupElement.setAttribute("locked", xmlTrue);
+            else
+                curGroupElement.setAttribute("locked", xmlFalse);
+        }
         curParent->appendChild(curGroupElement);
         foreach (QGraphicsItem *item, groupItem->childItems()) {
             QUuid tmpUuid = UBGraphicsScene::getPersonalUuid(item);
diff --git a/src/domain/UBGraphicsGroupContainerItem.cpp b/src/domain/UBGraphicsGroupContainerItem.cpp
index dcc94b97..a3df73ed 100644
--- a/src/domain/UBGraphicsGroupContainerItem.cpp
+++ b/src/domain/UBGraphicsGroupContainerItem.cpp
@@ -79,9 +79,14 @@ void UBGraphicsGroupContainerItem::addToGroup(QGraphicsItem *item)
         if (UBGraphicsItem::isRotatable(this) && !UBGraphicsItem::isRotatable(item)) {
             Delegate()->setUBFlag(GF_REVOLVABLE, false);
         }
-    } else {
+        if (!UBGraphicsItem::isLocked(this) && UBGraphicsItem::isLocked(item)) {
+            Delegate()->setLocked(true);
+        }
+    } 
+    else {
         Delegate()->setUBFlag(GF_FLIPPABLE_ALL_AXIS, UBGraphicsItem::isFlippable(item));
         Delegate()->setUBFlag(GF_REVOLVABLE, UBGraphicsItem::isRotatable(item));
+        Delegate()->setLocked(UBGraphicsItem::isLocked(item));
     }
 
     // COMBINE
@@ -322,6 +327,7 @@ void UBGraphicsGroupContainerItem::pRemoveFromGroup(QGraphicsItem *item)
         if (!UBGraphicsItem::isFlippable(item) || !UBGraphicsItem::isRotatable(item)) {
             bool flippableNow = true;
             bool rotatableNow = true;
+            bool lockedNow = false;
 
             foreach (QGraphicsItem *item, childItems()) {
                 if (!UBGraphicsItem::isFlippable(item)) {
@@ -330,12 +336,17 @@ void UBGraphicsGroupContainerItem::pRemoveFromGroup(QGraphicsItem *item)
                 if (!UBGraphicsItem::isRotatable(item)) {
                     rotatableNow = false;
                 }
-                if (!rotatableNow && !flippableNow) {
+                if(UBGraphicsItem::isLocked(item))
+                    lockedNow = true;
+
+                if (!rotatableNow && !flippableNow && lockedNow) {
                     break;
                 }
+
             }
             Delegate()->setUBFlag(GF_FLIPPABLE_ALL_AXIS, flippableNow);
             Delegate()->setUBFlag(GF_REVOLVABLE, rotatableNow);
+            Delegate()->setLocked(lockedNow);
         }
     }
 
diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp
index 6b9d1946..f60e2b2f 100644
--- a/src/domain/UBGraphicsItemDelegate.cpp
+++ b/src/domain/UBGraphicsItemDelegate.cpp
@@ -715,6 +715,15 @@ void UBGraphicsItemDelegate::showMenu()
     mMenu->exec(cv->mapToGlobal(pinPos.bottomRight()));
 }
 
+void UBGraphicsItemDelegate::setLocked(bool pLocked)
+{
+    Q_ASSERT(mDelegated);
+
+    if (mDelegated) {
+        mDelegated->setData(UBGraphicsItemData::ItemLocked, QVariant(pLocked));
+    }
+}
+
 void UBGraphicsItemDelegate::updateFrame()
 {
     if (mFrame && !mFrame->scene() && mDelegated->scene())
diff --git a/src/domain/UBGraphicsItemDelegate.h b/src/domain/UBGraphicsItemDelegate.h
index 20b34230..79ba27cb 100644
--- a/src/domain/UBGraphicsItemDelegate.h
+++ b/src/domain/UBGraphicsItemDelegate.h
@@ -279,6 +279,7 @@ class UBGraphicsItemDelegate : public QObject
         void setMimeData(QMimeData* mimeData);
         void setDragPixmap(const QPixmap &pix) {mDragPixmap = pix;}
 
+        void setLocked(bool pLocked);
         void setButtonsVisible(bool visible);
 
         UBGraphicsToolBarItem* getToolBarItem() const { return mToolBarItem; }
diff --git a/src/domain/UBItem.cpp b/src/domain/UBItem.cpp
index f75028b3..34a2ccb8 100644
--- a/src/domain/UBItem.cpp
+++ b/src/domain/UBItem.cpp
@@ -85,6 +85,11 @@ bool UBGraphicsItem::isRotatable(QGraphicsItem *item)
     return item->data(UBGraphicsItemData::ItemRotatable).toBool();
 }
 
+bool UBGraphicsItem::isLocked(QGraphicsItem *item)
+{
+    return item->data(UBGraphicsItemData::ItemLocked).toBool();
+}
+
 QUuid UBGraphicsItem::getOwnUuid(QGraphicsItem *item)
 {
     QString idCandidate = item->data(UBGraphicsItemData::ItemUuid).toString();
diff --git a/src/domain/UBItem.h b/src/domain/UBItem.h
index dcf2287d..71966a6b 100644
--- a/src/domain/UBItem.h
+++ b/src/domain/UBItem.h
@@ -116,6 +116,7 @@ public:
     static void assignZValue(QGraphicsItem*, qreal value);
     static bool isRotatable(QGraphicsItem *item);
     static bool isFlippable(QGraphicsItem *item);
+    static bool isLocked(QGraphicsItem *item);
     static QUuid getOwnUuid(QGraphicsItem *item);
 
     static UBGraphicsItemDelegate *Delegate(QGraphicsItem *pItem);
-- 
2.18.1