diff --git a/plugins/cffadaptor/src/UBCFFAdaptor.cpp b/plugins/cffadaptor/src/UBCFFAdaptor.cpp index 66840940..106d2457 100644 --- a/plugins/cffadaptor/src/UBCFFAdaptor.cpp +++ b/plugins/cffadaptor/src/UBCFFAdaptor.cpp @@ -1273,6 +1273,13 @@ bool UBCFFAdaptor::UBToCFFConverter::setCFFAttribute(const QString &attributeNam { setGeometryFromUBZ(ubzElement, svgElement); } + else + if (attributeName.contains(aUBZUuid)) + { + + QString id = "{" +ubzElement.attribute(aUBZParent)+"}" + "{"+ubzElement.attribute(aUBZUuid)+"}"; + svgElement.setAttribute(aID, id); + } else if (attributeName.contains(aUBZHref)||attributeName.contains(aSrc)) { @@ -1822,7 +1829,10 @@ bool UBCFFAdaptor::UBToCFFConverter::parseUBZPolygon(const QDomElement &element, if (0 < iwbElementPart.attributes().count()) { - QString id = QUuid::createUuid().toString(); + QString id = svgElementPart.attribute(aUBZUuid); + if (id.isEmpty()) + id = QUuid::createUuid().toString(); + svgElementPart.setAttribute(aID, id); iwbElementPart.setAttribute(aRef, id); diff --git a/plugins/cffadaptor/src/UBCFFConstants.h b/plugins/cffadaptor/src/UBCFFConstants.h index 92e85c42..69de92dd 100644 --- a/plugins/cffadaptor/src/UBCFFConstants.h +++ b/plugins/cffadaptor/src/UBCFFConstants.h @@ -68,6 +68,7 @@ const QString aBackground = "background"; const QString aCrossedBackground = "crossed-background"; const QString aUBZType = "type"; const QString aUBZUuid = "uuid"; +const QString aUBZParent = "parent"; const QString aFill = "fill"; // IWB attribute contans color to fill const QString aID = "id"; // ID of any svg element can be placed in to iwb section @@ -335,8 +336,10 @@ stroke-lineshape-end \ const QString ubzElementAttributesToConvert(" \ xlink:href, \ src, \ -transform \ -"); +transform, \ +uuid \ +" +); // additional attributes. Have references in SVG section. const QString svgElementAttributes(" \ diff --git a/src/adaptors/UBCFFSubsetAdaptor.cpp b/src/adaptors/UBCFFSubsetAdaptor.cpp index 6fa04c34..7b17f0b0 100644 --- a/src/adaptors/UBCFFSubsetAdaptor.cpp +++ b/src/adaptors/UBCFFSubsetAdaptor.cpp @@ -379,9 +379,10 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgPolygon(const QDomElement &e QUuid itemGroupUuid(element.attribute(aId).left(QUuid().toString().length()-1)); if (!itemUuid.isNull() && (itemGroupUuid!=itemUuid)) // reimported from UBZ { - UBGraphicsPolygonItem *graphicsPolygon = new UBGraphicsPolygonItem(polygon); + UBGraphicsPolygonItem *graphicsPolygon = mCurrentScene->polygonToPolygonItem(polygon); graphicsPolygon->setBrush(brush); + //graphicsPolygon->setPen(pen); QTransform transform; QString textTransform = element.attribute(aTransform); @@ -1131,7 +1132,7 @@ UBGraphicsGroupContainerItem *UBCFFSubsetAdaptor::UBCFFSubsetReader::parseIwbGro { if (uuid.size() > QUuid().toString().length()) // create stroke group { - currentStrokeIdentifier = uuid.left(QUuid().toString().length()-1); + currentStrokeIdentifier = uuid.left(QUuid().toString().length()); UBGraphicsPolygonItem *strokeByUuid = qgraphicsitem_cast(mCurrentScene->itemForUuid(QUuid(uuid.right(QUuid().toString().length())))); if (strokeByUuid) diff --git a/src/adaptors/UBSvgSubsetAdaptor.cpp b/src/adaptors/UBSvgSubsetAdaptor.cpp index 04bff654..3eaf2335 100644 --- a/src/adaptors/UBSvgSubsetAdaptor.cpp +++ b/src/adaptors/UBSvgSubsetAdaptor.cpp @@ -555,6 +555,10 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene() if (polygonItem) { + mScene->addItem(polygonItem); + + polygonItem->setUuid(uuidFromSvg); + if (annotationGroup) { polygonItem->setStroke(annotationGroup); @@ -991,31 +995,42 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene() UBGraphicsGroupContainerItem* UBSvgSubsetAdaptor::UBSvgSubsetReader::readGroup() { - UBGraphicsGroupContainerItem *result = new UBGraphicsGroupContainerItem(); - + UBGraphicsGroupContainerItem *group = new UBGraphicsGroupContainerItem(); + QMultiMap strokesGroupsContainer; + QList groupContainer; + QString currentStrokeIdentifier; + QUuid groupUuid = QUuid(mXmlReader.attributes().value(aId).toString()); mXmlReader.readNext(); - while (!mXmlReader.atEnd()) { - if (mXmlReader.isEndElement()) { - mXmlReader.readNext(); - result->setUuid(groupUuid); - if (!result->childItems().count()) { - delete result; - result = 0; - } - break; - } else if (mXmlReader.isStartElement()) { - if (mXmlReader.name() == tGroup) { + while (!mXmlReader.atEnd()) + { + if (mXmlReader.isStartElement()) + { + if (mXmlReader.name() == tGroup) + { qDebug() << "came across the group id is" << mXmlReader.attributes().value(aId); UBGraphicsGroupContainerItem *curGroup = readGroup(); - if (curGroup) { - result->addToGroup(curGroup); - } - } else if (mXmlReader.name() == tElement) { + if (curGroup) + group->addToGroup(curGroup); + } + else if (mXmlReader.name() == tElement) + { + QString id = mXmlReader.attributes().value(aId).toString(); + QString itemId = id.right(QUuid().toString().size()); + QString groupId = id.left(QUuid().toString().size()); + QGraphicsItem *curItem = readElementFromGroup(); - if (curItem) { - result->addToGroup(curItem); + + UBGraphicsPolygonItem *curPolygon = qgraphicsitem_cast(curItem); + + if (curPolygon && !groupId.isEmpty() && !itemId.isEmpty() && itemId != groupId) + { + strokesGroupsContainer.insert(groupId, curPolygon); + } + else // item + { + group->addToGroup(curItem); } }else { mXmlReader.skipCurrentElement(); @@ -1025,7 +1040,47 @@ UBGraphicsGroupContainerItem* UBSvgSubsetAdaptor::UBSvgSubsetReader::readGroup() } } - return result; + + foreach (QString key, strokesGroupsContainer.keys()) + { + UBGraphicsStrokesGroup* pStrokesGroup = new UBGraphicsStrokesGroup(); + UBGraphicsStroke *currentStroke = new UBGraphicsStroke(); + foreach(UBGraphicsPolygonItem* poly, strokesGroupsContainer.values(key)) + { + if (poly) + { + mScene->removeItem(poly); + mScene->removeItemFromDeletion(poly); + poly->setStrokesGroup(pStrokesGroup); + poly->setStroke(currentStroke); + pStrokesGroup->addToGroup(poly); + } + } + if (currentStroke->polygons().empty()) + delete currentStroke; + if (pStrokesGroup->childItems().count()) + mScene->addItem(pStrokesGroup); + else + delete pStrokesGroup; + + if (pStrokesGroup) + group->addToGroup(pStrokesGroup); + } + + foreach(QGraphicsItem* item, groupContainer) + group->addToGroup(item); + + if (group->childItems().count()) + { + mScene->addItem(group); + + if (!groupContainer.count()) + { + group->destroy(false); + } + } + + return group; } void UBSvgSubsetAdaptor::UBSvgSubsetReader::readGroupRoot() @@ -1053,8 +1108,9 @@ void UBSvgSubsetAdaptor::UBSvgSubsetReader::readGroupRoot() QGraphicsItem *UBSvgSubsetAdaptor::UBSvgSubsetReader::readElementFromGroup() { QGraphicsItem *result = 0; - - result = mScene->itemForUuid(QUuid(mXmlReader.attributes().value(aId).toString())); + QString id = mXmlReader.attributes().value(aId).toString(); + QString uuid = id.right(QUuid().toString().size()); + result = mScene->itemForUuid(QUuid(uuid)); mXmlReader.skipCurrentElement(); mXmlReader.readNext(); diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 621dc9a4..99bfe301 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -1713,6 +1713,7 @@ QRectF UBGraphicsScene::normalizedSceneRect(qreal ratio) QGraphicsItem *UBGraphicsScene::itemForUuid(QUuid uuid) { QGraphicsItem *result = 0; + QString ui = uuid.toString(); //simple search before implementing container for fast access foreach (QGraphicsItem *item, items()) { diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h index 6d496369..1b0a54db 100644 --- a/src/domain/UBGraphicsScene.h +++ b/src/domain/UBGraphicsScene.h @@ -302,6 +302,8 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem static QUuid getPersonalUuid(QGraphicsItem *item); + UBGraphicsPolygonItem* polygonToPolygonItem(const QPolygonF pPolygon); + public slots: void initStroke(); void hideEraser(); @@ -338,7 +340,6 @@ public slots: UBGraphicsPolygonItem* lineToPolygonItem(const QLineF& pLine, const qreal& pWidth); UBGraphicsPolygonItem* arcToPolygonItem(const QLineF& pStartRadius, qreal pSpanAngle, qreal pWidth); - UBGraphicsPolygonItem* polygonToPolygonItem(const QPolygonF pPolygon); void initPolygonItem(UBGraphicsPolygonItem*);