diff --git a/src/adaptors/UBCFFSubsetAdaptor.cpp b/src/adaptors/UBCFFSubsetAdaptor.cpp index fc6b90c2..d07255ef 100644 --- a/src/adaptors/UBCFFSubsetAdaptor.cpp +++ b/src/adaptors/UBCFFSubsetAdaptor.cpp @@ -43,10 +43,7 @@ #include "core/memcheck.h" -//enum of xmlparse status - -//tag names definition -//use them everiwhere! +//tag names definition. Use them everiwhere! static QString tElement = "element"; static QString tGroup = "group"; static QString tEllipse = "ellipse"; @@ -67,7 +64,6 @@ static QString tFlash = "flash"; static QString tAudio = "audio"; static QString tVideo = "video"; - //attribute names definition static QString aFill = "fill"; static QString aFillopacity = "fill-opacity"; @@ -126,7 +122,6 @@ bool UBCFFSubsetAdaptor::ConvertCFFFileToUbz(QString &cffSourceFile, UBDocumentP return result; } - UBCFFSubsetAdaptor::UBCFFSubsetReader::UBCFFSubsetReader(UBDocumentProxy *proxy, QFile *content): mProxy(proxy) { @@ -141,7 +136,6 @@ UBCFFSubsetAdaptor::UBCFFSubsetReader::UBCFFSubsetReader(UBDocumentProxy *proxy, } qDebug() << "tmp path is" << pwdContent; } - bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parse() { UBMetadataDcSubsetAdaptor::persist(mProxy); @@ -150,7 +144,6 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parse() if (!getTempFileName() || !createTempFlashPath()) return false; - if (mDOMdoc.isNull()) return false; @@ -166,7 +159,6 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parse() return result; } - bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgRect(const QDomElement &element) { qreal x1 = element.attribute(aX).toDouble(); @@ -215,7 +207,10 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgRect(const QDomElement &elem transform = transformFromString(textTransform); hastransform = true; } + repositionSvgItem(svgItem, width, height, x1, y1, hastransform, transform); + hashSceneItem(element, svgItem); + delete generator; return true; @@ -257,7 +252,10 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgEllipse(const QDomElement &e transform = transformFromString(textTransform); hastransform = true; } + repositionSvgItem(svgItem, rx * 2, ry * 2, cx - rx , cy - ry, hastransform, transform); + hashSceneItem(element, svgItem); + delete generator; return true; @@ -329,6 +327,8 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgPolygon(const QDomElement &e hastransform = true; } repositionSvgItem(svgItem, width + 10, height + 10, x1 - 5, y1 - 5, hastransform, transform); + hashSceneItem(element, svgItem); + delete generator; return true; @@ -394,11 +394,12 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgPolyline(const QDomElement & hastransform = true; } repositionSvgItem(svgItem, width + 10, height + 10, x1 - 5, y1 - 5, hastransform, transform); + hashSceneItem(element, svgItem); + delete generator; return true; } - void UBCFFSubsetAdaptor::UBCFFSubsetReader::parseTextAttributes(const QDomElement &element, qreal &fontSize, QColor &fontColor, QString &fontFamily, QString &fontStretch, bool &italic, int &fontWeight, @@ -439,7 +440,6 @@ void UBCFFSubsetAdaptor::UBCFFSubsetReader::parseTextAttributes(const QDomElemen if (!element.attribute(aTransform).isNull()) fontTransform = transformFromString(element.attribute(aTransform)); } - bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgText(const QDomElement &element) { qreal x = element.attribute(aX).toDouble(); @@ -447,6 +447,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgText(const QDomElement &elem qreal width = element.attribute(aWidth).toDouble(); qreal height = element.attribute(aHeight).toDouble(); + qreal fontSize = 12; QColor fontColor(qApp->palette().foreground().color()); QString fontFamily = "Arial"; @@ -457,10 +458,14 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgText(const QDomElement &elem QTransform fontTransform; parseTextAttributes(element, fontSize, fontColor, fontFamily, fontStretch, italic, fontWeight, textAlign, fontTransform); + QFont startFont(fontFamily, fontSize, fontWeight, italic); + height = QFontMetrics(startFont).height(); + width = QFontMetrics(startFont).width(element.text()) + 5; + QSvgGenerator *generator = createSvgGenerator(width, height); QPainter painter; painter.begin(generator); - painter.setFont(QFont(fontFamily, fontSize, fontWeight, italic)); + painter.setFont(startFont); qreal curY = 0.0; qreal curX = 0.0; @@ -483,7 +488,9 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgText(const QDomElement &elem //add resulting svg file to scene UBGraphicsSvgItem *svgItem = mCurrentScene->addSvg(QUrl::fromLocalFile(generator->fileName())); + repositionSvgItem(svgItem, width, height, x, y, hasTransform, transform); + hashSceneItem(element, svgItem); delete generator; return true; @@ -513,6 +520,7 @@ void UBCFFSubsetAdaptor::UBCFFSubsetReader::parseTSpan(const QDomElement &parent QDomCharacterData textData = curNode.toCharacterData(); QString text = textData.data().trimmed(); +// width = painter.fontMetrics().width(text); //get bounding rect to obtain desired text height lastDrawnTextBoundingRect = painter.boundingRect(QRectF(curX, curY, width, height - curY), textAlign|Qt::TextWordWrap, text); painter.drawText(curX, curY, width, lastDrawnTextBoundingRect.height(), textAlign|Qt::TextWordWrap, text); @@ -548,6 +556,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgTextarea(const QDomElement & QSvgGenerator *generator = createSvgGenerator(width, height); QPainter painter; painter.begin(generator); + painter.setFont(QFont(fontFamily, fontSize, fontWeight, italic)); qreal curY = 0.0; @@ -571,7 +580,9 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgTextarea(const QDomElement & //add resulting svg file to scene UBGraphicsSvgItem *svgItem = mCurrentScene->addSvg(QUrl::fromLocalFile(generator->fileName())); + repositionSvgItem(svgItem, width, height, x, y, hasTransform, transform); + hashSceneItem(element, svgItem); delete generator; return true; @@ -609,7 +620,6 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgImage(const QDomElement &ele hastransform = true; } repositionSvgItem(pixItem, width, height, x, y, hastransform, transform); -// experimentalReposition(pixItem, width, height, x, y, hastransform, transform); hashSceneItem(element, pixItem); return true; @@ -739,12 +749,6 @@ void UBCFFSubsetAdaptor::UBCFFSubsetReader::hashSceneItem(const QDomElement &ele QString key = element.attribute(aId); if (!key.isNull()) { persistedItems.insert(key, item); - - QHash::iterator iter; - iter = persistedItems.find(key); - UBGraphicsItem *itered = *iter; - if (key == "background") - itered->Delegate()->lock(true); } } @@ -780,7 +784,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgPage(const QDomElement &pare currentSvgElement = currentSvgElement.nextSiblingElement(); } - persistCurrentScene(); + return true; } bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgPageset(const QDomElement &parent) @@ -824,6 +828,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvg(const QDomElement &svgSecti bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseIwbGroup(QDomElement &parent) { + //TODO. Create groups from elements parsed by parseIwbElement() function if (parent.namespaceURI() != iwbNS) { qDebug() << "incorrect iwb group namespace, incorrect document"; return false; @@ -852,16 +857,10 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseIwbElement(QDomElement &element QHash::iterator iReferedItem; iReferedItem = persistedItems.find(IDRef); - if (iReferedItem != persistedItems.end() && IDRef == "background") { + if (iReferedItem != persistedItems.end()) { UBGraphicsItem *referedItem = *iReferedItem; -// UBGraphicsPixmapItem *item = dynamic_cast(referedItem); - referedItem->Delegate()->lock(false); - referedItem->Delegate()->printMessage("called from extended"); + referedItem->Delegate()->lock(locked); } - -// UBGraphicsItem *referedItem = *(persistedItems.find(IDRef)); -// referedItem->Delegate()->lock(locked); - } return true; @@ -878,6 +877,8 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseDoc() currentTopElement = currentTopElement.nextSiblingElement(); } + if (!persistScenes()) return false; + return true; } @@ -910,212 +911,6 @@ void UBCFFSubsetAdaptor::UBCFFSubsetReader::repositionSvgItem(QGraphicsItem *ite (int)((y - mViewBoxCenter.y()) * mVBTransFactor)); } } -void UBCFFSubsetAdaptor::UBCFFSubsetReader::experimentalReposition(QGraphicsItem *item, qreal width, qreal height, - qreal x, qreal y, - bool useTransform, QTransform &transform) -{ - Q_UNUSED(useTransform) - Q_UNUSED(transform) - - QRectF itemBounds = item->boundingRect(); - - qreal xScale = width / itemBounds.width(); - qreal yScale = height / itemBounds.height(); - - qreal newX = (x - mViewBox.center().x()) * xScale * mVBTransFactor; - qreal newY = (y - mViewBox.center().y()) * yScale * mVBTransFactor; - -// qDebug() << item->transform(); -// QTransform transform1(1, 0, 0, 1, mCurrentSceneRect.center().x(), mCurrentSceneRect.center().y()); -// QPointF newPos = QTransform(xScale * mVBTransFactor, 0, 0, yScale * mVBTransFactor, -// mCurrentSceneRect.center().x(), mCurrentSceneRect.center().y()).map(QPointF(x, y)); - - QPointF newPos(newX, newY); - - item->setTransform(QTransform(xScale * mVBTransFactor, 0, 0, yScale * mVBTransFactor, 0, 0)); - item->setPos(newPos); - - item->setPos(newPos); - - qDebug(); - - - - // QTransform transform; - -// QTransform newTransform(mVBTransFactor, 0, 0, -// mVBTransFactor, mViewPort.center().x(), mViewPort.center().y()); -// QRectF newItemRect = newTransform.mapRect(itemRect); -// item->setPos(newItemRect.topLeft()); -// item->setBou - - -// QTransform translateTransform(width * mVBTransFactor, 0, 0, height * mVBTransFactor, -// mViewPort.center().x(), mViewPort.center().y()); -// item->setTransform(translateTransform); -} - -//bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseText() -//{ -// if (currentState != SVG && currentState != PAGE) -// { -// qWarning() << "iwb content parse error, unexpected textarea tag at line" << mReader.lineNumber(); -// return false; -// } - -// //create new scene if it's not created yet (for one page document case) -// if (currentState == SVG && mCurrentScene == NULL) -// createNewScene(); - -// qreal x = mReader.attributes().value(aX).toString().toDouble(); -// qreal y = mReader.attributes().value(aY).toString().toDouble(); - -// qreal width = 0; -// qreal height = 0; - -// QList textRects; -// QList textFonts; -// QList textLines; -// QList textAligns; -// QList textColors; - -// qWarning() << QString().sprintf("Text coordinates : %f,%f. Text size %f,%f", x, y, width, height); - -// qreal fontSize = 12.0; -// QFont textFont; -// QColor fontColor; -// QString fontFamily = "Arial"; -// QString fontStretch = "normal"; - -// bool italic = false; -// int fontWeight = QFont::Normal; -// int textAlign = Qt::AlignLeft; -// QTransform fontTransform; -// parseTextAttributes(fontSize, fontColor, fontFamily, fontStretch, italic, fontWeight, textAlign, fontTransform); -// textFont = QFont(fontFamily, fontSize, fontWeight, italic); - -// QFontMetricsF metrics = QFontMetricsF(textFont); -// qreal curHeight = metrics.height(); - -// qreal curY = 0.0; -// qreal curX = 0.0; - -// qreal linespacing = QFontMetrics(textFont).leading(); - -// //remember if text area has transform -// QTransform transform; -// bool hasTransform = getCurElementTransorm(transform); - -// QRectF lastDrawnTextBoundingRect; - -// QStack fontStack; -// QStack colorStack; -// QStack alignStack; - -// // first extimate desired text area size -// // to do that, parse text area tags -// while(true) -// { -// mReader.readNext(); -// QStringRef elementName = mReader.name(); -// if (mReader.isEndDocument()) -// break; -// if (mReader.isEndElement()) -// { -// if (elementName == tBreak) -// { -// //when tbreak appers, move down by the drawn rect height -// //TODO: line spacing is not calculated yet, probably additional code is required -// curY += lastDrawnTextBoundingRect.height() + linespacing; -// curX = 0.0; -// height += lastDrawnTextBoundingRect.height(); -// lastDrawnTextBoundingRect = QRectF(0,0,0,0); -// continue; -// } -// if (elementName == tTspan) -// { -// textFont = fontStack.pop(); -// fontColor = colorStack.pop(); -// textAlign = alignStack.pop(); -// continue; -// } -// } -// if (mReader.isEndElement() && elementName == tText) -// break; -// if (mReader.isStartElement() && elementName == tTspan) -// { -// fontStack.push(textFont); -// colorStack.push(fontColor); -// alignStack.push(textAlign); - -// parseTextAttributes(fontSize, fontColor, fontFamily, fontStretch, italic, fontWeight, textAlign, fontTransform); -// textFont = QFont(fontFamily, fontSize, fontWeight, italic); -// metrics = QFontMetricsF(textFont); -// curHeight = metrics.height(); -// linespacing = QFontMetricsF(textFont).leading(); -// continue; -// } -// if (mReader.isCharacters() || mReader.isCDATA()) -// { -// QString text = mReader.text().toString(); - -// //skip empty text -// if (text.trimmed().length() == 0) -// continue; -// //get bounding rect to obtain desired text height -// lastDrawnTextBoundingRect = metrics.boundingRect(QRectF(), textAlign, text); -// QString log = QString().sprintf(" at rect %f, %f, %f, %f. Bounding rect is %f, %f, %f, %f", 0.0, curY, width, height - curY, lastDrawnTextBoundingRect.x(), lastDrawnTextBoundingRect.y(), lastDrawnTextBoundingRect.width(), lastDrawnTextBoundingRect.height()); -// qWarning() << "Text " << text << log; -// textFonts.append(textFont); -// textRects.append(QRectF(curX, curY, lastDrawnTextBoundingRect.width(), lastDrawnTextBoundingRect.height())); -// textLines.append(text); -// textAligns.append(textAlign); -// textColors.append(fontColor); -// curX += lastDrawnTextBoundingRect.width(); -// if (width < curX) -// width = curX; -// if (height == 0) -// height = curHeight; - -// continue; -// } -// } - -// QSvgGenerator *generator = createSvgGenerator(width, height); -// QPainter painter; -// painter.begin(generator); - -// if (textRects.count() != 0) -// { -// QListIterator textRectsIter(textRects); -// QListIterator textFontsIter(textFonts); -// QListIterator textLinesIter(textLines); -// QListIterator textAlignsIter(textAligns); -// QListIterator textColorsIter(textColors); - -// while (textRectsIter.hasNext()) -// { -// QRectF rt = textRectsIter.next(); -// QFont font = textFontsIter.next(); -// QString line = textLinesIter.next(); -// int align = textAlignsIter.next(); -// QColor color = textColorsIter.next(); -// painter.setFont(font); -// painter.setPen(color); -// painter.drawText(rt.x(), rt.y(), rt.width(), rt.height(), align, line); -// } -// } - -// painter.end(); - -// //add resulting svg file to scene -// UBGraphicsSvgItem *svgItem = mCurrentScene->addSvg(QUrl::fromLocalFile(generator->fileName())); -// repositionSvgItem(svgItem, width, height, x, y, hasTransform, transform); - -// delete generator; - -// return true; -//} bool UBCFFSubsetAdaptor::UBCFFSubsetReader::createNewScene() { @@ -1138,6 +933,30 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::persistCurrentScene() } return true; } +bool UBCFFSubsetAdaptor::UBCFFSubsetReader::persistScenes() +{ + if (!mProxy->pageCount()) { + qDebug() << "No pages created"; + return false; + } + for (int i = 0; i < mProxy->pageCount(); i++) { + mCurrentScene = UBPersistenceManager::persistenceManager()->getDocumentScene(mProxy, i); + if (!mCurrentScene) { + qDebug() << "can't allocate scene, loading failed"; + return false; + } + UBSvgSubsetAdaptor::persistScene(mProxy, mCurrentScene, i); + UBGraphicsScene *tmpScene = UBSvgSubsetAdaptor::loadScene(mProxy, i); + tmpScene->setModified(true); + UBThumbnailAdaptor::persistScene(mProxy->persistencePath(), tmpScene, i); + delete tmpScene; + + + mCurrentScene->setModified(false); + } + + return true; +} QColor UBCFFSubsetAdaptor::UBCFFSubsetReader::colorFromString(const QString& clrString) { @@ -1277,3 +1096,11 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::createTempFlashPath() return true; } +UBCFFSubsetAdaptor::UBCFFSubsetReader::~UBCFFSubsetReader() +{ +// QList pages; +// for (int i = 0; i < mProxy->pageCount(); i++) { +// pages << i; +// } +// UBPersistenceManager::persistenceManager()->deleteDocumentScenes(mProxy, pages); +} diff --git a/src/adaptors/UBCFFSubsetAdaptor.h b/src/adaptors/UBCFFSubsetAdaptor.h index 9f9440d0..d92dba52 100644 --- a/src/adaptors/UBCFFSubsetAdaptor.h +++ b/src/adaptors/UBCFFSubsetAdaptor.h @@ -38,7 +38,6 @@ class UBCFFSubsetAdaptor { public: UBCFFSubsetAdaptor(); - static bool ConvertCFFFileToUbz(QString &cffSourceFile, UBDocumentProxy* pDocument); private: @@ -46,6 +45,7 @@ private: { public: UBCFFSubsetReader(UBDocumentProxy *proxy, QFile *content); + ~UBCFFSubsetReader(); UBDocumentProxy *mProxy; QString pwdContent; @@ -101,7 +101,7 @@ private: inline void hashSceneItem(const QDomElement &element, UBGraphicsItem *item); // to kill - void parseTextAttributes(const QDomElement &element, qreal &fontSize, QColor &fontColor, + inline void parseTextAttributes(const QDomElement &element, qreal &fontSize, QColor &fontColor, QString &fontFamily, QString &fontStretch, bool &italic, int &fontWeight, int &textAlign, QTransform &fontTransform); @@ -110,14 +110,12 @@ private: bool createNewScene(); bool persistCurrentScene(); + bool persistScenes(); // helper methods void repositionSvgItem(QGraphicsItem *item, qreal width, qreal height, qreal x, qreal y, bool useTransform, QTransform &transform); - void experimentalReposition(QGraphicsItem *item, qreal width, qreal height, - qreal x, qreal y, - bool useTransform, QTransform &transform); QColor colorFromString(const QString& clrString); QTransform transformFromString(const QString trString); bool getViewBoxDimenstions(const QString& viewBox); diff --git a/src/adaptors/UBThumbnailAdaptor.cpp b/src/adaptors/UBThumbnailAdaptor.cpp index 22c251d7..b6087094 100644 --- a/src/adaptors/UBThumbnailAdaptor.cpp +++ b/src/adaptors/UBThumbnailAdaptor.cpp @@ -111,7 +111,6 @@ QList UBThumbnailAdaptor::load(UBDocumentProxy* proxy) moreToProcess = false; } } - return thumbnails; } diff --git a/src/core/UBPersistenceManager.h b/src/core/UBPersistenceManager.h index a0f60d44..74a3ab7c 100644 --- a/src/core/UBPersistenceManager.h +++ b/src/core/UBPersistenceManager.h @@ -86,6 +86,7 @@ class UBPersistenceManager : public QObject virtual void moveSceneToIndex(UBDocumentProxy* pDocumentProxy, int source, int target); virtual UBGraphicsScene* loadDocumentScene(UBDocumentProxy* pDocumentProxy, int sceneIndex); + UBGraphicsScene *getDocumentScene(UBDocumentProxy* pDocumentProxy, int sceneIndex) {return mSceneCache.value(pDocumentProxy, sceneIndex);} QList > documentProxies; diff --git a/src/domain/UBGraphicsPixmapItem.h b/src/domain/UBGraphicsPixmapItem.h index 053ce0e5..141710ae 100644 --- a/src/domain/UBGraphicsPixmapItem.h +++ b/src/domain/UBGraphicsPixmapItem.h @@ -26,7 +26,7 @@ class UBGraphicsItemDelegate; class UBGraphicsPixmapItem : public QObject, public QGraphicsPixmapItem, public UBItem, public UBGraphicsItem { - Q_OBJECT; + Q_OBJECT public: UBGraphicsPixmapItem(QGraphicsItem* parent = 0); @@ -38,7 +38,6 @@ class UBGraphicsPixmapItem : public QObject, public QGraphicsPixmapItem, public { return Type; } - virtual UBItem* deepCopy() const; virtual UBGraphicsScene* scene(); diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h index 0a9b0e96..5e6a9a3b 100644 --- a/src/domain/UBGraphicsScene.h +++ b/src/domain/UBGraphicsScene.h @@ -52,7 +52,7 @@ const double PI = 4.0 * atan(1.0); class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem { - Q_OBJECT; + Q_OBJECT public: diff --git a/src/domain/UBGraphicsTextItem.h b/src/domain/UBGraphicsTextItem.h index b9f08f5d..fd7c1a24 100644 --- a/src/domain/UBGraphicsTextItem.h +++ b/src/domain/UBGraphicsTextItem.h @@ -26,7 +26,7 @@ class UBGraphicsScene; class UBGraphicsTextItem : public QGraphicsTextItem, public UBItem, public UBResizableGraphicsItem, public UBGraphicsItem { - Q_OBJECT; + Q_OBJECT public: UBGraphicsTextItem(QGraphicsItem * parent = 0); @@ -97,7 +97,6 @@ class UBGraphicsTextItem : public QGraphicsTextItem, public UBItem, public UBRes virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); private: -// UBGraphicsItemDelegate *mDelegate; qreal mTextHeight; int mMultiClickState; @@ -106,8 +105,6 @@ class UBGraphicsTextItem : public QGraphicsTextItem, public UBItem, public UBRes QColor mColorOnDarkBackground; QColor mColorOnLightBackground; - - }; #endif /* UBGRAPHICSTEXTITEM_H_ */ diff --git a/src/pdf/PDFRenderer.cpp b/src/pdf/PDFRenderer.cpp index 57e9b36d..116755ec 100644 --- a/src/pdf/PDFRenderer.cpp +++ b/src/pdf/PDFRenderer.cpp @@ -19,7 +19,6 @@ #include "XPDFRenderer.h" - #include "core/memcheck.h" QMap< QUuid, QPointer > PDFRenderer::sRenderers;