From 8dafb4d98fcf2045dfd03909b713f8086b70fe08 Mon Sep 17 00:00:00 2001 From: shibakaneki Date: Wed, 23 May 2012 13:26:07 +0200 Subject: [PATCH] Resolved an issue with the eraser o the strokes as object story --- src/adaptors/UBSvgSubsetAdaptor.cpp | 56 ++++++++++++++++++++--------- src/core/UBPersistenceManager.cpp | 1 - src/domain/UBGraphicsScene.cpp | 19 +++++----- 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/adaptors/UBSvgSubsetAdaptor.cpp b/src/adaptors/UBSvgSubsetAdaptor.cpp index baf2fb87..fb933963 100644 --- a/src/adaptors/UBSvgSubsetAdaptor.cpp +++ b/src/adaptors/UBSvgSubsetAdaptor.cpp @@ -544,6 +544,7 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene() if(strokesGroup){ polygonItem->setTransform(strokesGroup->transform()); strokesGroup->addToGroup(polygonItem); + polygonItem->setStrokesGroup(strokesGroup); } }else{ scene->addItem(polygonItem); @@ -1005,8 +1006,6 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::writeSvgElement() bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex) { - - if (mScene->isModified()) { static int i = 0; @@ -1029,6 +1028,7 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex) writeSvgElement(); + // Get the items from the scene QList items = mScene->items(); qSort(items.begin(), items.end(), itemZIndexComp); @@ -1041,10 +1041,32 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex) { QGraphicsItem *item = items.takeFirst(); - UBGraphicsPolygonItem *polygonItem = qgraphicsitem_cast (item); + // Is the item a strokes group? + UBGraphicsStrokesGroup* strokesGroupItem = qgraphicsitem_cast(item); + if(strokesGroupItem && strokesGroupItem->isVisible()){ + mXmlWriter.writeStartElement("g"); + QMatrix matrix = item->sceneMatrix(); + if (!matrix.isIdentity()){ + mXmlWriter.writeAttribute("transform", toSvgTransform(matrix)); + } + + // Add the polygons + foreach(QGraphicsItem* item, strokesGroupItem->childItems()){ + UBGraphicsPolygonItem* poly = qgraphicsitem_cast(item); + if(NULL != poly){ + polygonItemToSvgPolygon(poly, true); + items.removeOne(poly); + } + } + + mXmlWriter.writeEndElement(); //g + } + // Is the item a polygon? + UBGraphicsPolygonItem *polygonItem = qgraphicsitem_cast (item); if (polygonItem && polygonItem->isVisible()) { + UBGraphicsStroke* currentStroke = polygonItem->stroke(); if (openStroke && (currentStroke != openStroke)) @@ -1116,84 +1138,86 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex) openStroke = 0; } + // Is the item a picture? UBGraphicsPixmapItem *pixmapItem = qgraphicsitem_cast (item); - if (pixmapItem && pixmapItem->isVisible()) { pixmapItemToLinkedImage(pixmapItem); continue; } + // Is the item a shape? UBGraphicsSvgItem *svgItem = qgraphicsitem_cast (item); - if (svgItem && svgItem->isVisible()) { svgItemToLinkedSvg(svgItem); continue; } + // Is the Item a video? UBGraphicsVideoItem *videoItem = qgraphicsitem_cast (item); - if (videoItem && videoItem->isVisible()) { videoItemToLinkedVideo(videoItem); continue; } + // Is the item an audio? UBGraphicsAudioItem* audioItem = qgraphicsitem_cast (item); if (audioItem && audioItem->isVisible()) { audioItemToLinkedAudio(audioItem); continue; } + // Is the item an app? UBGraphicsAppleWidgetItem *appleWidgetItem = qgraphicsitem_cast (item); - if (appleWidgetItem && appleWidgetItem->isVisible()) { graphicsAppleWidgetToSvg(appleWidgetItem); continue; } + // Is the item a W3C? UBGraphicsW3CWidgetItem *w3cWidgetItem = qgraphicsitem_cast (item); - if (w3cWidgetItem && w3cWidgetItem->isVisible()) { graphicsW3CWidgetToSvg(w3cWidgetItem); continue; } + // Is the item a PDF? UBGraphicsPDFItem *pdfItem = qgraphicsitem_cast (item); - if (pdfItem && pdfItem->isVisible()) { pdfItemToLinkedPDF(pdfItem); continue; } + // Is the item a text? UBGraphicsTextItem *textItem = qgraphicsitem_cast (item); - if (textItem && textItem->isVisible()) { textItemToSvg(textItem); continue; } + // Is the item a curtain? UBGraphicsCurtainItem *curtainItem = qgraphicsitem_cast (item); - if (curtainItem && curtainItem->isVisible()) { curtainItemToSvg(curtainItem); continue; } + // Is the item a ruler? UBGraphicsRuler *ruler = qgraphicsitem_cast (item); - if (ruler && ruler->isVisible()) { rulerToSvg(ruler); continue; } + // Is the item a cache? UBGraphicsCache* cache = qgraphicsitem_cast(item); if(cache && cache->isVisible()) { @@ -1201,32 +1225,32 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex) continue; } + // Is the item a compass UBGraphicsCompass *compass = qgraphicsitem_cast (item); - if (compass && compass->isVisible()) { compassToSvg(compass); continue; } + // Is the item a protractor? UBGraphicsProtractor *protractor = qgraphicsitem_cast (item); - if (protractor && protractor->isVisible()) { protractorToSvg(protractor); continue; } + // Is the item a triangle? UBGraphicsTriangle *triangle = qgraphicsitem_cast (item); - if (triangle && triangle->isVisible()) { triangleToSvg(triangle); continue; } + // Is the item a group? UBGraphicsGroupContainerItem *groupItem = qgraphicsitem_cast(item); - if (groupItem && groupItem->isVisible()) { qDebug() << "came across the group during the parsing"; diff --git a/src/core/UBPersistenceManager.cpp b/src/core/UBPersistenceManager.cpp index 29e0ef71..98261e3a 100644 --- a/src/core/UBPersistenceManager.cpp +++ b/src/core/UBPersistenceManager.cpp @@ -582,7 +582,6 @@ UBGraphicsScene* UBPersistenceManager::loadDocumentScene(UBDocumentProxy* proxy, if (mSceneCache.contains(proxy, sceneIndex)) return mSceneCache.value(proxy, sceneIndex); else { - qDebug() << "scene" << sceneIndex << "retrieved from file ..."; UBGraphicsScene* scene = UBSvgSubsetAdaptor::loadScene(proxy, sceneIndex); if (scene) diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index a01aad4e..d85ce6af 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -834,18 +834,17 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) if (mShouldUseOMP) { - #pragma omp parallel for + //#pragma omp parallel for for (int i = 0; i < collidItemsSize; i++) { UBGraphicsPolygonItem *collidingPolygonItem = qgraphicsitem_cast(collidItems.at(i)); - - if (NULL != collidingPolygonItem) + if(NULL != collidingPolygonItem) { UBGraphicsStrokesGroup* pGroup = collidingPolygonItem->strokesGroup(); if(eraserInnerRect.contains(collidingPolygonItem->boundingRect())) { - #pragma omp critical + //#pragma omp critical // Put the entire polygon into the remove list toBeRemovedItems << collidingPolygonItem; } @@ -882,7 +881,7 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) } else */if (croppedPathSimplified.isEmpty()) { - #pragma omp critical + //#pragma omp critical // Put the entire polygon into the remove list if the eraser removes all its visible content toBeRemovedItems << collidingPolygonItem; } @@ -893,14 +892,15 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) foreach(const QPolygonF &pol, croppedPathSimplified.toFillPolygons()) { UBGraphicsPolygonItem* croppedPolygonItem = collidingPolygonItem->deepCopy(pol); - #pragma omp critical + //#pragma omp critical if(NULL != pGroup){ croppedPolygonItem->setStrokesGroup(pGroup); + //pGroup->addToGroup(croppedPolygonItem); } // Add this new polygon to the 'added' list toBeAddedItems << croppedPolygonItem; } - #pragma omp critical + //#pragma omp critical // Remove the original polygonitem because it has been replaced by many smaller polygons toBeRemovedItems << collidingPolygonItem; } @@ -961,8 +961,9 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) foreach(QGraphicsItem* item, toBeRemovedItems){ UBGraphicsPolygonItem* poly = dynamic_cast(item); if(NULL != poly){ - if(NULL != poly->strokesGroup()){ - poly->strokesGroup()->removeFromGroup(poly); + UBGraphicsStrokesGroup* group = poly->strokesGroup(); + if(NULL != group){ + group->removeFromGroup(poly); removeItem(poly); }else{ qDebug() << "No group present";