From b8f006d1ca4a58dc3f2fa5436162ba4681015beb Mon Sep 17 00:00:00 2001 From: Anatoly Mihalchenko Date: Sat, 18 Aug 2012 15:54:27 +0300 Subject: [PATCH] Import procedure, improving of code, insertion of objects into existing document errors fix --- src/adaptors/UBCFFSubsetAdaptor.cpp | 29 +++- src/adaptors/UBImportAdaptor.cpp | 20 ++- src/adaptors/UBImportAdaptor.h | 32 +++- src/adaptors/UBImportCFF.cpp | 6 +- src/adaptors/UBImportCFF.h | 7 +- src/adaptors/UBImportDocument.cpp | 6 +- src/adaptors/UBImportDocument.h | 4 +- src/adaptors/UBImportImage.cpp | 39 ++++- src/adaptors/UBImportImage.h | 6 +- src/adaptors/UBImportPDF.cpp | 44 +++++- src/adaptors/UBImportPDF.h | 6 +- src/board/UBBoardController.cpp | 73 +++++++-- src/core/UBDocumentManager.cpp | 207 +++++++++++++------------- src/core/UBDocumentManager.h | 4 +- src/core/UBPersistenceManager.cpp | 182 ++++++---------------- src/core/UBPersistenceManager.h | 8 +- src/document/UBDocumentController.cpp | 7 +- 17 files changed, 392 insertions(+), 288 deletions(-) diff --git a/src/adaptors/UBCFFSubsetAdaptor.cpp b/src/adaptors/UBCFFSubsetAdaptor.cpp index f86477c5..7eb667b5 100644 --- a/src/adaptors/UBCFFSubsetAdaptor.cpp +++ b/src/adaptors/UBCFFSubsetAdaptor.cpp @@ -869,8 +869,18 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgAudio(const QDomElement &ele QUuid uuid = QUuid::createUuid(); - concreteUrl = QUrl::fromLocalFile(UBPersistenceManager::persistenceManager() - ->addAudioFileToDocument(mCurrentScene->document(), concreteUrl.toLocalFile(), uuid)); + QString destFile; + bool b = UBPersistenceManager::persistenceManager()->addFileToDocument( + mCurrentScene->document(), + concreteUrl.toLocalFile(), + UBPersistenceManager::audioDirectory, + uuid, + destFile); + if (!b) + { + return false; + } + concreteUrl = QUrl::fromLocalFile(destFile); UBGraphicsMediaItem *audioItem = mCurrentScene->addAudio(concreteUrl, false); QTransform transform; @@ -912,8 +922,19 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgVideo(const QDomElement &ele QUuid uuid = QUuid::createUuid(); - concreteUrl = QUrl::fromLocalFile(UBPersistenceManager::persistenceManager() - ->addVideoFileToDocument(mCurrentScene->document(), concreteUrl.toLocalFile(), uuid)); + + QString destFile; + bool b = UBPersistenceManager::persistenceManager()->addFileToDocument( + mCurrentScene->document(), + concreteUrl.toLocalFile(), + UBPersistenceManager::videoDirectory, + uuid, + destFile); + if (!b) + { + return false; + } + concreteUrl = QUrl::fromLocalFile(destFile); UBGraphicsMediaItem *videoItem = mCurrentScene->addVideo(concreteUrl, false); QTransform transform; diff --git a/src/adaptors/UBImportAdaptor.cpp b/src/adaptors/UBImportAdaptor.cpp index f9cce78a..143b6244 100644 --- a/src/adaptors/UBImportAdaptor.cpp +++ b/src/adaptors/UBImportAdaptor.cpp @@ -22,8 +22,9 @@ #include "core/memcheck.h" -UBImportAdaptor::UBImportAdaptor(QObject *parent) - :QObject(parent) +UBImportAdaptor::UBImportAdaptor(bool _documentBased, QObject *parent) + :QObject(parent), + documentBased(_documentBased) { // NOOP } @@ -33,6 +34,20 @@ UBImportAdaptor::~UBImportAdaptor() // NOOP } +UBPageBasedImportAdaptor::UBPageBasedImportAdaptor(QObject *parent) + :UBImportAdaptor(false, parent) +{ + // NOOP +} + +UBDocumentBasedImportAdaptor::UBDocumentBasedImportAdaptor(QObject *parent) + :UBImportAdaptor(true, parent) +{ + // NOOP +} + + +/* UBDocumentProxy* UBImportAdaptor::importFile(const QFile& pFile, const QString& pGroup) { QString documentName = QFileInfo(pFile.fileName()).completeBaseName(); @@ -53,3 +68,4 @@ UBDocumentProxy* UBImportAdaptor::importFile(const QFile& pFile, const QString& return newDocument; } +*/ \ No newline at end of file diff --git a/src/adaptors/UBImportAdaptor.h b/src/adaptors/UBImportAdaptor.h index 4dcdf9e0..6a29a3cd 100644 --- a/src/adaptors/UBImportAdaptor.h +++ b/src/adaptors/UBImportAdaptor.h @@ -18,6 +18,8 @@ #include +class UBGraphicsItem; +class UBGraphicsScene; class UBDocumentProxy; class UBImportAdaptor : public QObject @@ -25,15 +27,39 @@ class UBImportAdaptor : public QObject Q_OBJECT; protected: - UBImportAdaptor(QObject *parent = 0); + UBImportAdaptor(bool _documentBased, QObject *parent = 0); virtual ~UBImportAdaptor(); public: virtual QStringList supportedExtentions() = 0; virtual QString importFileFilter() = 0; - virtual UBDocumentProxy* importFile(const QFile& pFile, const QString& pGroup); - virtual bool addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile) = 0; + + bool isDocumentBased(){return documentBased;} + private: + bool documentBased; + +}; + +class UBPageBasedImportAdaptor : public UBImportAdaptor +{ +protected: + UBPageBasedImportAdaptor(QObject *parent = 0); + +public: + virtual QList import(const QUuid& uuid, const QString& filePath) = 0; + virtual void placeImportedItemToScene(UBGraphicsScene* scene, UBGraphicsItem* item) = 0; + virtual const QString& folderToCopy() = 0; }; +class UBDocumentBasedImportAdaptor : public UBImportAdaptor +{ +protected: + UBDocumentBasedImportAdaptor(QObject *parent = 0); +public: + virtual UBDocumentProxy* importFile(const QFile& pFile, const QString& pGroup) = 0; + virtual bool addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile) = 0; +}; + + #endif /* UBIMPORTADAPTOR_H_ */ diff --git a/src/adaptors/UBImportCFF.cpp b/src/adaptors/UBImportCFF.cpp index f8c8ebee..4ff7f7a9 100644 --- a/src/adaptors/UBImportCFF.cpp +++ b/src/adaptors/UBImportCFF.cpp @@ -14,6 +14,7 @@ */ #include +#include #include "core/UBApplication.h" #include "core/UBPersistenceManager.h" @@ -38,7 +39,7 @@ THIRD_PARTY_WARNINGS_ENABLE #include "core/memcheck.h" UBImportCFF::UBImportCFF(QObject *parent) - : UBImportAdaptor(parent) + : UBDocumentBasedImportAdaptor(parent) { // NOOP } @@ -77,7 +78,6 @@ QString UBImportCFF::importFileFilter() return filter; } - bool UBImportCFF::addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile) { QFileInfo fi(pFile); @@ -220,6 +220,7 @@ QString UBImportCFF::expandFileToDir(const QFile& pZipFile, const QString& pDir) return documentRootFolder; } + UBDocumentProxy* UBImportCFF::importFile(const QFile& pFile, const QString& pGroup) { Q_UNUSED(pGroup); // group is defined in the imported file @@ -277,4 +278,3 @@ UBDocumentProxy* UBImportCFF::importFile(const QFile& pFile, const QString& pGro return newDocument; } } - diff --git a/src/adaptors/UBImportCFF.h b/src/adaptors/UBImportCFF.h index b31666ab..749c67bf 100644 --- a/src/adaptors/UBImportCFF.h +++ b/src/adaptors/UBImportCFF.h @@ -21,7 +21,7 @@ class UBDocumentProxy; -class UBImportCFF : public UBImportAdaptor +class UBImportCFF : public UBDocumentBasedImportAdaptor { Q_OBJECT; @@ -33,13 +33,10 @@ class UBImportCFF : public UBImportAdaptor virtual QString importFileFilter(); virtual bool addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile); - - //base class method override virtual UBDocumentProxy* importFile(const QFile& pFile, const QString& pGroup); private: - - virtual QString expandFileToDir(const QFile& pZipFile, const QString& pDir); + QString expandFileToDir(const QFile& pZipFile, const QString& pDir); }; #endif // UBIMPORTCFF_H diff --git a/src/adaptors/UBImportDocument.cpp b/src/adaptors/UBImportDocument.cpp index 5e546856..a306285d 100644 --- a/src/adaptors/UBImportDocument.cpp +++ b/src/adaptors/UBImportDocument.cpp @@ -33,7 +33,7 @@ THIRD_PARTY_WARNINGS_ENABLE #include "core/memcheck.h" UBImportDocument::UBImportDocument(QObject *parent) - :UBImportAdaptor(parent) + :UBDocumentBasedImportAdaptor(parent) { // NOOP } @@ -173,7 +173,6 @@ QString UBImportDocument::expandFileToDir(const QFile& pZipFile, const QString& return documentRootFolder; } - UBDocumentProxy* UBImportDocument::importFile(const QFile& pFile, const QString& pGroup) { Q_UNUSED(pGroup); // group is defined in the imported file @@ -197,7 +196,6 @@ UBDocumentProxy* UBImportDocument::importFile(const QFile& pFile, const QString& } } - bool UBImportDocument::addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile) { QFileInfo fi(pFile); @@ -215,3 +213,5 @@ bool UBImportDocument::addFileToDocument(UBDocumentProxy* pDocument, const QFile return true; } + + diff --git a/src/adaptors/UBImportDocument.h b/src/adaptors/UBImportDocument.h index 8038808a..a7530200 100644 --- a/src/adaptors/UBImportDocument.h +++ b/src/adaptors/UBImportDocument.h @@ -21,7 +21,7 @@ class UBDocumentProxy; -class UBImportDocument : public UBImportAdaptor +class UBImportDocument : public UBDocumentBasedImportAdaptor { Q_OBJECT; @@ -37,7 +37,7 @@ class UBImportDocument : public UBImportAdaptor virtual bool addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile); private: - virtual QString expandFileToDir(const QFile& pZipFile, const QString& pDir); + QString expandFileToDir(const QFile& pZipFile, const QString& pDir); }; #endif /* UBIMPORTDOCUMENT_H_ */ diff --git a/src/adaptors/UBImportImage.cpp b/src/adaptors/UBImportImage.cpp index 312c1df3..c85ba342 100644 --- a/src/adaptors/UBImportImage.cpp +++ b/src/adaptors/UBImportImage.cpp @@ -21,14 +21,14 @@ #include "core/UBPersistenceManager.h" #include "core/UBDocumentManager.h" -#include "domain/UBGraphicsPDFItem.h" +#include "domain/UBGraphicsPixmapItem.h" #include "pdf/PDFRenderer.h" #include "core/memcheck.h" UBImportImage::UBImportImage(QObject *parent) - : UBImportAdaptor(parent) + : UBPageBasedImportAdaptor(parent) { // NOOP } @@ -74,7 +74,7 @@ QString UBImportImage::importFileFilter() return filter; } - +/* bool UBImportImage::addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile) { int res = UBDocumentManager::documentManager()->addImageAsPageToDocument(QStringList(QFileInfo(pFile).absoluteFilePath()), pDocument); @@ -89,3 +89,36 @@ bool UBImportImage::addFileToDocument(UBDocumentProxy* pDocument, const QFile& p return true; } } +*/ + + +QList UBImportImage::import(const QUuid& uuid, const QString& filePath) +{ + QList result; + + QPixmap pix(filePath); + if (pix.isNull()) + return result; + + UBGraphicsPixmapItem* pixmapItem = new UBGraphicsPixmapItem(); + pixmapItem->setPixmap(pix); + result << pixmapItem; + return result; +} + +void UBImportImage::placeImportedItemToScene(UBGraphicsScene* scene, UBGraphicsItem* item) +{ + UBGraphicsPixmapItem* pixmapItem = (UBGraphicsPixmapItem*)item; + + UBGraphicsPixmapItem* sceneItem = scene->addPixmap(pixmapItem->pixmap(), NULL, QPointF(0, 0)); + scene->setAsBackgroundObject(sceneItem, true); + + // Only stored pixmap, should be deleted now + delete pixmapItem; +} + +const QString& UBImportImage::folderToCopy() +{ + static QString f(""); + return f; +} diff --git a/src/adaptors/UBImportImage.h b/src/adaptors/UBImportImage.h index 07a6a0b2..55c470fd 100644 --- a/src/adaptors/UBImportImage.h +++ b/src/adaptors/UBImportImage.h @@ -21,7 +21,7 @@ class UBDocumentProxy; -class UBImportImage : public UBImportAdaptor +class UBImportImage : public UBPageBasedImportAdaptor { Q_OBJECT; @@ -32,7 +32,9 @@ class UBImportImage : public UBImportAdaptor virtual QStringList supportedExtentions(); virtual QString importFileFilter(); - virtual bool addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile); + virtual QList import(const QUuid& uuid, const QString& filePath); + virtual void placeImportedItemToScene(UBGraphicsScene* scene, UBGraphicsItem* item); + virtual const QString& folderToCopy(); }; #endif /* UBIMPORTIMAGE_H_ */ diff --git a/src/adaptors/UBImportPDF.cpp b/src/adaptors/UBImportPDF.cpp index 1457ce18..a1971118 100644 --- a/src/adaptors/UBImportPDF.cpp +++ b/src/adaptors/UBImportPDF.cpp @@ -27,7 +27,7 @@ #include "core/memcheck.h" UBImportPDF::UBImportPDF(QObject *parent) - : UBImportAdaptor(parent) + : UBPageBasedImportAdaptor(parent) { QDesktopWidget* desktop = UBApplication::desktop(); this->dpi = (desktop->physicalDpiX() + desktop->physicalDpiY()) / 2; @@ -52,6 +52,47 @@ QString UBImportPDF::importFileFilter() } +QList UBImportPDF::import(const QUuid& uuid, const QString& filePath) +{ + QList result; + + PDFRenderer *pdfRenderer = PDFRenderer::rendererForUuid(uuid, filePath, true); // renderer is automatically deleted when not used anymore + + if (!pdfRenderer->isValid()) + { + UBApplication::showMessage(tr("PDF import failed.")); + return result; + } + pdfRenderer->setDPI(this->dpi); + + int pdfPageCount = pdfRenderer->pageCount(); + + for(int pdfPageNumber = 1; pdfPageNumber <= pdfPageCount; pdfPageNumber++) + { + UBApplication::showMessage(tr("Importing page %1 of %2").arg(pdfPageNumber).arg(pdfPageCount), true); + + result << new UBGraphicsPDFItem(pdfRenderer, pdfPageNumber); // deleted by the scene + } + return result; +} + +void UBImportPDF::placeImportedItemToScene(UBGraphicsScene* scene, UBGraphicsItem* item) +{ + UBGraphicsPDFItem *pdfItem = (UBGraphicsPDFItem*)item; + + pdfItem->setPos(-pdfItem->boundingRect().width() / 2, -pdfItem->boundingRect().height() / 2); + + scene->setAsBackgroundObject(pdfItem, false, false); + + scene->setNominalSize(pdfItem->boundingRect().width(), pdfItem->boundingRect().height()); +} + +const QString& UBImportPDF::folderToCopy() +{ + return UBPersistenceManager::objectDirectory; +} + +/* bool UBImportPDF::addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile) { QString documentName = QFileInfo(pFile.fileName()).completeBaseName(); @@ -112,3 +153,4 @@ bool UBImportPDF::addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFi return true; } +*/ \ No newline at end of file diff --git a/src/adaptors/UBImportPDF.h b/src/adaptors/UBImportPDF.h index fa035adc..93e937e0 100644 --- a/src/adaptors/UBImportPDF.h +++ b/src/adaptors/UBImportPDF.h @@ -21,7 +21,7 @@ class UBDocumentProxy; -class UBImportPDF : public UBImportAdaptor +class UBImportPDF : public UBPageBasedImportAdaptor { Q_OBJECT; @@ -32,7 +32,9 @@ class UBImportPDF : public UBImportAdaptor virtual QStringList supportedExtentions(); virtual QString importFileFilter(); - virtual bool addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile); + virtual QList import(const QUuid& uuid, const QString& filePath); + virtual void placeImportedItemToScene(UBGraphicsScene* scene, UBGraphicsItem* item); + virtual const QString& folderToCopy(); private: int dpi; diff --git a/src/board/UBBoardController.cpp b/src/board/UBBoardController.cpp index 24581b06..eb39b204 100644 --- a/src/board/UBBoardController.cpp +++ b/src/board/UBBoardController.cpp @@ -1074,8 +1074,20 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri { QUuid uuid = QUuid::createUuid(); - QUrl url = QUrl::fromLocalFile(UBPersistenceManager::persistenceManager() - ->addVideoFileToDocument(selectedDocument(), sourceUrl, pData, uuid)); + QString destFile; + bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), + "", + UBPersistenceManager::videoDirectory, + uuid, + destFile, + &pData); + if (!b) + { + showMessage(tr("Add file operation failed: file copying error")); + return NULL; + } + + QUrl url = QUrl::fromLocalFile(destFile); mediaVideoItem = mActiveScene->addMedia(url, false, pPos); @@ -1105,8 +1117,20 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri { QUuid uuid = QUuid::createUuid(); - QUrl url = QUrl::fromLocalFile(UBPersistenceManager::persistenceManager() - ->addAudioFileToDocument(selectedDocument(), sourceUrl, pData, uuid)); + QString destFile; + bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), + "", + UBPersistenceManager::audioDirectory, + uuid, + destFile, + &pData); + if (!b) + { + showMessage(tr("Add file operation failed: file copying error")); + return NULL; + } + + QUrl url = QUrl::fromLocalFile(destFile); audioMediaItem = mActiveScene->addMedia(url, false, pPos); @@ -1186,15 +1210,18 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri qDebug() << "sourceurl : " + sourceUrl.toString(); int result = 0; if(!sourceUrl.isEmpty()){ - QFile sourceFile(sourceUrl.toLocalFile()); - result = UBDocumentManager::documentManager()->addFileToDocument(selectedDocument(), sourceFile); + QStringList fileNames; + fileNames << sourceUrl.toLocalFile(); + result = UBDocumentManager::documentManager()->addFilesToDocument(selectedDocument(), fileNames); } else if(pData.size()){ QTemporaryFile pdfFile("XXXXXX.pdf"); if (pdfFile.open()) { pdfFile.write(pData); - result = UBDocumentManager::documentManager()->addFileToDocument(selectedDocument(), pdfFile); + QStringList fileNames; + fileNames << pdfFile.fileName(); + result = UBDocumentManager::documentManager()->addFilesToDocument(selectedDocument(), fileNames); pdfFile.close(); } } @@ -1904,7 +1931,18 @@ UBGraphicsMediaItem* UBBoardController::addVideo(const QUrl& pSourceUrl, bool st QUuid uuid = QUuid::createUuid(); QUrl concreteUrl = pSourceUrl; - concreteUrl = QUrl::fromLocalFile(UBPersistenceManager::persistenceManager()->addVideoFileToDocument(selectedDocument(), pSourceUrl.toLocalFile(), uuid)); + QString destFile; + bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), + pSourceUrl.toLocalFile(), + UBPersistenceManager::videoDirectory, + uuid, + destFile); + if (!b) + { + showMessage(tr("Add file operation failed: file copying error")); + return NULL; + } + concreteUrl = QUrl::fromLocalFile(destFile); UBGraphicsMediaItem* vi = mActiveScene->addMedia(concreteUrl, startPlay, pos); selectedDocument()->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); @@ -1923,7 +1961,18 @@ UBGraphicsMediaItem* UBBoardController::addAudio(const QUrl& pSourceUrl, bool st QUuid uuid = QUuid::createUuid(); QUrl concreteUrl = pSourceUrl; - concreteUrl = QUrl::fromLocalFile(UBPersistenceManager::persistenceManager()->addAudioFileToDocument(selectedDocument(), pSourceUrl.toLocalFile(), uuid)); + QString destFile; + bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(selectedDocument(), + pSourceUrl.toLocalFile(), + UBPersistenceManager::audioDirectory, + uuid, + destFile); + if (!b) + { + showMessage(tr("Add file operation failed: file copying error")); + return NULL; + } + concreteUrl = QUrl::fromLocalFile(destFile); UBGraphicsMediaItem* ai = mActiveScene->addMedia(concreteUrl, startPlay, pos); selectedDocument()->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); @@ -1942,9 +1991,11 @@ UBGraphicsWidgetItem *UBBoardController::addW3cWidget(const QUrl &pUrl, const QP UBGraphicsWidgetItem* w3cWidgetItem = 0; QUuid uuid = QUuid::createUuid(); - QUrl newUrl = pUrl; - newUrl = QUrl::fromLocalFile(UBPersistenceManager::persistenceManager()->addGraphicsWidgteToDocument(selectedDocument(), pUrl.toLocalFile(), uuid)); + QString destPath; + if (!UBPersistenceManager::persistenceManager()->addGraphicsWidgteToDocument(selectedDocument(), pUrl.toLocalFile(), uuid, destPath)) + return NULL; + QUrl newUrl = QUrl::fromLocalFile(destPath); w3cWidgetItem = mActiveScene->addW3CWidget(newUrl, pos); diff --git a/src/core/UBDocumentManager.cpp b/src/core/UBDocumentManager.cpp index 1b6ad22a..9db3dbe0 100644 --- a/src/core/UBDocumentManager.cpp +++ b/src/core/UBDocumentManager.cpp @@ -128,36 +128,124 @@ UBDocumentProxy* UBDocumentManager::importFile(const QFile& pFile, const QString { QFileInfo fileInfo(pFile); - UBDocumentProxy* document = 0; - - foreach (UBImportAdaptor *importAdaptor, mImportAdaptors) + foreach (UBImportAdaptor *adaptor, mImportAdaptors) { - if (importAdaptor->supportedExtentions().lastIndexOf(fileInfo.suffix().toLower()) != -1) + if (adaptor->supportedExtentions().lastIndexOf(fileInfo.suffix().toLower()) != -1) { + UBDocumentProxy* document; UBApplication::setDisabled(true); - document = importAdaptor->importFile(pFile, pGroup); + + if (adaptor->isDocumentBased()) + { + UBDocumentBasedImportAdaptor* importAdaptor = (UBDocumentBasedImportAdaptor*)adaptor; + + document = importAdaptor->importFile(pFile, pGroup); + + } + else + { + UBPageBasedImportAdaptor* importAdaptor = (UBPageBasedImportAdaptor*)adaptor; + + // Document import procedure..... + QString documentName = QFileInfo(pFile.fileName()).completeBaseName(); + document = UBPersistenceManager::persistenceManager()->createDocument(pGroup, documentName); + + QUuid uuid = QUuid::createUuid(); + QString filepath = pFile.fileName(); + if (importAdaptor->folderToCopy() != "") + { + bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(document, pFile.fileName(), importAdaptor->folderToCopy() , uuid, filepath); + if (!b) + { + UBPersistenceManager::persistenceManager()->deleteDocument(document); + UBApplication::setDisabled(false); + return NULL; + } + } + + QList pages = importAdaptor->import(uuid, filepath); + int nPage = 0; + foreach(UBGraphicsItem* page, pages) + { + UBApplication::showMessage(tr("Inserting page %1 of %2").arg(++nPage).arg(pages.size()), true); + int pageIndex = document->pageCount(); + UBGraphicsScene* scene = UBPersistenceManager::persistenceManager()->createDocumentSceneAt(document, pageIndex); + importAdaptor->placeImportedItemToScene(scene, page); + UBPersistenceManager::persistenceManager()->persistDocumentScene(document, scene, pageIndex); + } + + UBPersistenceManager::persistenceManager()->persistDocumentMetadata(document); + UBApplication::showMessage(tr("Import successful.")); + } + UBApplication::setDisabled(false); + return document; } - } - return document; + } + return NULL; } -bool UBDocumentManager::addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile) +int UBDocumentManager::addFilesToDocument(UBDocumentProxy* document, QStringList fileNames) { - QFileInfo fileInfo(pFile); - foreach (UBImportAdaptor *importAdaptor, mImportAdaptors) + int nImportedDocuments = 0; + foreach(const QString& fileName, fileNames) { - if (importAdaptor->supportedExtentions().lastIndexOf(fileInfo.suffix().toLower()) != -1) + UBApplication::showMessage(tr("Importing file").arg(fileName)); + + QFile file(fileName); + QFileInfo fileInfo(file); + + foreach (UBImportAdaptor *adaptor, mImportAdaptors) { - UBApplication::setDisabled(true); - bool result = importAdaptor->addFileToDocument(pDocument, pFile); - UBApplication::setDisabled(false); - return result; + if (adaptor->supportedExtentions().lastIndexOf(fileInfo.suffix().toLower()) != -1) + { + UBApplication::setDisabled(true); + + if (adaptor->isDocumentBased()) + { + UBDocumentBasedImportAdaptor* importAdaptor = (UBDocumentBasedImportAdaptor*)adaptor; + + if (importAdaptor->addFileToDocument(document, file)) + nImportedDocuments++; + } + else + { + UBPageBasedImportAdaptor* importAdaptor = (UBPageBasedImportAdaptor*)adaptor; + + QUuid uuid = QUuid::createUuid(); + QString filepath = file.fileName(); + if (importAdaptor->folderToCopy() != "") + { + bool b = UBPersistenceManager::persistenceManager()->addFileToDocument(document, file.fileName(), importAdaptor->folderToCopy() , uuid, filepath); + if (!b) + { + continue; + } + } + + QList pages = importAdaptor->import(uuid, filepath); + int nPage = 0; + foreach(UBGraphicsItem* page, pages) + { + UBApplication::showMessage(tr("Inserting page %1 of %2").arg(++nPage).arg(pages.size()), true); + int pageIndex = document->pageCount(); + UBGraphicsScene* scene = UBPersistenceManager::persistenceManager()->createDocumentSceneAt(document, pageIndex); + importAdaptor->placeImportedItemToScene(scene, page); + UBPersistenceManager::persistenceManager()->persistDocumentScene(document, scene, pageIndex); + } + + UBPersistenceManager::persistenceManager()->persistDocumentMetadata(document); + UBApplication::showMessage(tr("Import of file %1 successful.").arg(file.fileName())); + nImportedDocuments++; + } + + UBApplication::setDisabled(false); + } } } - return false; + return nImportedDocuments; } @@ -167,14 +255,14 @@ int UBDocumentManager::addImageDirToDocument(const QDir& pDir, UBDocumentProxy* filenames = UBStringUtils::sortByLastDigit(filenames); - QStringList fullPathFilenames; + QStringList fileNames; foreach(QString f, filenames) { - fullPathFilenames << pDir.absolutePath() + "/" + f; + fileNames << pDir.absolutePath() + "/" + f; } - return addImageAsPageToDocument(fullPathFilenames, pDocument); + return addFilesToDocument(pDocument, fileNames); } @@ -209,87 +297,6 @@ QList UBDocumentManager::supportedExportAdaptors() return mExportAdaptors; } -int UBDocumentManager::addImageAsPageToDocument(const QStringList& filenames, UBDocumentProxy* pDocument) -{ - - int result = 0; - - if (filenames.size() > 0) - { - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - - QApplication::processEvents(); - - int pageIndex = pDocument->pageCount(); - - if (pageIndex == 1 && UBPersistenceManager::persistenceManager()->loadDocumentScene(pDocument, 0)->isEmpty()) - { - pageIndex = 0; - } - - int expectedPageCount = filenames.size(); - - for(int i = 0; i < filenames.size(); i ++) - { - UBApplication::showMessage(tr("Importing page %1 of %2").arg(i + 1).arg(expectedPageCount)); - - UBGraphicsScene* scene = 0; - - QString fullPath = filenames.at(i); - - QGraphicsItem *gi = 0; - - if (pageIndex == 0) - { - scene = UBPersistenceManager::persistenceManager()->loadDocumentScene(pDocument, pageIndex); - } - else - { - scene = UBPersistenceManager::persistenceManager()->createDocumentSceneAt(pDocument, pageIndex); - } - - scene->setBackground(false, false); - - if (fullPath.endsWith(".svg") || fullPath.endsWith(".svgz")) - { - gi = scene->addSvg(QUrl::fromLocalFile(fullPath), QPointF(0, 0)); - } - else - { - QPixmap pix(fullPath); - - if (pix.isNull()) - { - UBApplication::showMessage(tr("Erronous image data, skipping file %1").arg(filenames.at(i))); - expectedPageCount--; - continue; - } - else - { - gi = scene->addPixmap(pix, NULL, QPointF(0, 0)); - } - } - - if (gi) - { - scene->setAsBackgroundObject(gi, true); - - UBPersistenceManager::persistenceManager()->persistDocumentScene(pDocument, scene, pageIndex); - - pageIndex++; - } - - } - - result = expectedPageCount; - - QApplication::restoreOverrideCursor(); - - } - - return result; - -} void UBDocumentManager::emitDocumentUpdated(UBDocumentProxy* pDocument) { diff --git a/src/core/UBDocumentManager.h b/src/core/UBDocumentManager.h index eca7e2ba..006eede9 100644 --- a/src/core/UBDocumentManager.h +++ b/src/core/UBDocumentManager.h @@ -36,13 +36,11 @@ class UBDocumentManager : public QObject UBDocumentProxy* importFile(const QFile& pFile, const QString& pGroup); - bool addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile); + int addFilesToDocument(UBDocumentProxy* pDocument, QStringList fileNames); UBDocumentProxy* importDir(const QDir& pDir, const QString& pGroup); int addImageDirToDocument(const QDir& pDir, UBDocumentProxy* pDocument); - int addImageAsPageToDocument(const QStringList& images, UBDocumentProxy* document); - QList supportedExportAdaptors(); void emitDocumentUpdated(UBDocumentProxy* pDocument); diff --git a/src/core/UBPersistenceManager.cpp b/src/core/UBPersistenceManager.cpp index bc90fc52..954af5b5 100644 --- a/src/core/UBPersistenceManager.cpp +++ b/src/core/UBPersistenceManager.cpp @@ -878,170 +878,82 @@ QString UBPersistenceManager::addObjectToTeacherGuideDirectory(UBDocumentProxy* return destPath; } - -QString UBPersistenceManager::addVideoFileToDocument(UBDocumentProxy* pDocumentProxy, QString path, QUuid objectUuid) +bool UBPersistenceManager::addFileToDocument(UBDocumentProxy* pDocumentProxy, + QString path, + const QString& subdir, + QUuid objectUuid, + QString& destinationPath, + QByteArray* data) { QFileInfo fi(path); - if (!fi.exists() || !pDocumentProxy || objectUuid.isNull()) - return ""; - - QString fileName = UBPersistenceManager::videoDirectory + "/" + objectUuid.toString() + "." + fi.suffix(); - - QString destPath = pDocumentProxy->persistencePath() + "/" + fileName; - - if (!QFile::exists(destPath)) - { - QDir dir; - dir.mkdir(pDocumentProxy->persistencePath() + "/" + UBPersistenceManager::videoDirectory); - - QFile source(path); - - source.copy(destPath); - - } - - return destPath; - -} - - -QString UBPersistenceManager::addVideoFileToDocument(UBDocumentProxy* pDocumentProxy, QUrl sourceUrl, QByteArray pPayload, QUuid objectUuid) -{ if (!pDocumentProxy || objectUuid.isNull()) - return ""; + return false; + if (data == NULL && !fi.exists()) + return false; - QString urlPath = sourceUrl.path(); - int lastDot = urlPath.lastIndexOf("."); - QString suffix = urlPath.right(urlPath.length() - lastDot - 1); + QString fileName = subdir + "/" + objectUuid.toString() + "." + fi.suffix(); - QString fileName = UBPersistenceManager::videoDirectory + "/" + objectUuid.toString() + "." + suffix; - QString destPath = pDocumentProxy->persistencePath() + "/" + fileName; + destinationPath = pDocumentProxy->persistencePath() + "/" + fileName; - if (!QFile::exists(destPath)) + if (!QFile::exists(destinationPath)) { QDir dir; - dir.mkdir(pDocumentProxy->persistencePath() + "/" + UBPersistenceManager::videoDirectory); + dir.mkdir(pDocumentProxy->persistencePath() + "/" + subdir); + if (!QFile::exists(pDocumentProxy->persistencePath() + "/" + subdir)) + return false; - QFile newFile(destPath); - - if (newFile.open(QIODevice::WriteOnly)) + if (data == NULL) { - newFile.write(pPayload); - newFile.flush(); - newFile.close(); + QFile source(path); + return source.copy(destinationPath); } - } - - return destPath; - -} - - - -QString UBPersistenceManager::addAudioFileToDocument(UBDocumentProxy* pDocumentProxy, QString path, QUuid objectUuid) -{ - QFileInfo fi(path); - - if (!fi.exists() || !pDocumentProxy || objectUuid.isNull()) - return ""; - - QString fileName = UBPersistenceManager::audioDirectory + "/" + objectUuid.toString() + "." + fi.suffix(); - - QString destPath = pDocumentProxy->persistencePath() + "/" + fileName; - - if (!QFile::exists(destPath)) - { - QDir dir; - dir.mkdir(pDocumentProxy->persistencePath() + "/" + UBPersistenceManager::audioDirectory); - - QFile source(path); - - source.copy(destPath); - - } - - return destPath; - -} - - -QString UBPersistenceManager::addAudioFileToDocument(UBDocumentProxy* pDocumentProxy, QUrl sourceUrl, QByteArray pPayload, QUuid objectUuid) -{ - if (!pDocumentProxy || objectUuid.isNull()) - return ""; - - QString urlPath = sourceUrl.path(); - int lastDot = urlPath.lastIndexOf("."); - QString suffix = urlPath.right(urlPath.length() - lastDot - 1); - - QString fileName = UBPersistenceManager::audioDirectory + "/" + objectUuid.toString() + "." + suffix; - QString destPath = pDocumentProxy->persistencePath() + "/" + fileName; - - if (!QFile::exists(destPath)) - { - QDir dir; - dir.mkdir(pDocumentProxy->persistencePath() + "/" + UBPersistenceManager::audioDirectory); - - QFile newFile(destPath); - - if (newFile.open(QIODevice::WriteOnly)) + else { - newFile.write(pPayload); - newFile.flush(); - newFile.close(); + QFile newFile(destinationPath); + + if (newFile.open(QIODevice::WriteOnly)) + { + qint64 n = newFile.write(*data); + newFile.flush(); + newFile.close(); + return n == data->size(); + } + else + { + return false; + } } } - - //return fileName; - return destPath; - -} - - -QString UBPersistenceManager::addPdfFileToDocument(UBDocumentProxy* pDocumentProxy, QString path, QUuid objectUuid) -{ - QFileInfo fi(path); - - if (!fi.exists() || !pDocumentProxy || objectUuid.isNull()) - return ""; - - QString fileName = UBPersistenceManager::objectDirectory + "/" + objectUuid.toString() + "." + fi.suffix(); - QString destPath = pDocumentProxy->persistencePath() + "/" + fileName; - - if (!QFile::exists(destPath)) + else { - QDir dir; - dir.mkpath(pDocumentProxy->persistencePath() + "/" + UBPersistenceManager::objectDirectory); - - QFile source(path); - source.copy(destPath); + return false; } - - return fileName; } -QString UBPersistenceManager::addGraphicsWidgteToDocument(UBDocumentProxy *pDocumentProxy, QString path, QUuid objectUuid) + +bool UBPersistenceManager::addGraphicsWidgteToDocument(UBDocumentProxy *pDocumentProxy, + QString path, + QUuid objectUuid, + QString& destinationPath) { QFileInfo fi(path); if (!fi.exists() || !pDocumentProxy || objectUuid.isNull()) - return ""; + return false; QString widgetRootDir = path; QString extension = QFileInfo(widgetRootDir).suffix(); - QString widgetTargetDir = pDocumentProxy->persistencePath() + "/" + widgetDirectory + "/" + objectUuid.toString() + "." + extension; + destinationPath = pDocumentProxy->persistencePath() + "/" + widgetDirectory + "/" + objectUuid.toString() + "." + extension; - if (!QFile::exists(widgetTargetDir)) { + if (!QFile::exists(destinationPath)) { QDir dir; - dir.mkpath(widgetTargetDir); - UBFileSystemUtils::copyDir(widgetRootDir, widgetTargetDir); + if (!dir.mkpath(destinationPath)) + return false; + return UBFileSystemUtils::copyDir(widgetRootDir, destinationPath); } - - if (!QFile::exists(widgetTargetDir)) - widgetTargetDir = QString(); - - return widgetTargetDir; + else + return false; } diff --git a/src/core/UBPersistenceManager.h b/src/core/UBPersistenceManager.h index 14b339f6..9ea21db3 100644 --- a/src/core/UBPersistenceManager.h +++ b/src/core/UBPersistenceManager.h @@ -100,12 +100,8 @@ class UBPersistenceManager : public QObject virtual bool isEmpty(UBDocumentProxy* pDocumentProxy); virtual void purgeEmptyDocuments(); - virtual QString addVideoFileToDocument(UBDocumentProxy* pDocumentProxy, QString path, QUuid objectUuid); - virtual QString addVideoFileToDocument(UBDocumentProxy* pDocumentProxy, QUrl sourceUrl, QByteArray pPayload, QUuid objectUuid); - virtual QString addAudioFileToDocument(UBDocumentProxy* pDocumentProxy, QString path, QUuid objectUuid); - virtual QString addAudioFileToDocument(UBDocumentProxy* pDocumentProxy, QUrl sourceUrl, QByteArray pPayload, QUuid objectUuid); - virtual QString addPdfFileToDocument(UBDocumentProxy* pDocumentProxy, QString path, QUuid objectUuid); - virtual QString addGraphicsWidgteToDocument(UBDocumentProxy *mDocumentProxy, QString path, QUuid objectUuid); + bool addGraphicsWidgteToDocument(UBDocumentProxy *mDocumentProxy, QString path, QUuid objectUuid, QString& destinationPath); + bool addFileToDocument(UBDocumentProxy* pDocumentProxy, QString path, const QString& subdir, QUuid objectUuid, QString& destinationPath, QByteArray* data = NULL); bool mayHaveVideo(UBDocumentProxy* pDocumentProxy); bool mayHaveAudio(UBDocumentProxy* pDocumentProxy); diff --git a/src/document/UBDocumentController.cpp b/src/document/UBDocumentController.cpp index 1fe4763c..d7a5b6d3 100755 --- a/src/document/UBDocumentController.cpp +++ b/src/document/UBDocumentController.cpp @@ -1006,11 +1006,12 @@ bool UBDocumentController::addFileToDocument(UBDocumentProxy* document) if (filePath.length() > 0) { QApplication::processEvents(); - QFile selectedFile(filePath); showMessage(tr("Importing file %1...").arg(fileInfo.baseName()), true); - success = UBDocumentManager::documentManager()->addFileToDocument(document, selectedFile); + QStringList fileNames; + fileNames << filePath; + success = UBDocumentManager::documentManager()->addFilesToDocument(document, fileNames); if (success) { @@ -1438,7 +1439,7 @@ void UBDocumentController::addImages() UBSettings::settings()->lastImportFolderPath->set(QVariant(firstImage.absoluteDir().absolutePath())); int importedImageNumber - = UBDocumentManager::documentManager()->addImageAsPageToDocument(images, document); + = UBDocumentManager::documentManager()->addFilesToDocument(document, images); if (importedImageNumber == 0) {