bool Object::read(QString filePath) { QFileInfo fileInfo(filePath); if( fileInfo.isDir() ) return false; QFile* file = new QFile(filePath); if (!file->open(QFile::ReadOnly)) return false; QDomDocument doc; doc.setContent(file); QDomElement docElem = doc.documentElement(); loadDomElement(docElem, filePath); /* // old code: list all the files beginning with the same name QStringList list = name.split("."); QStringList filtername(list.at(0)+"*.*"); QDir dir(fileInfo.absolutePath()); QStringList entries = dir.entryList(filtername,QDir::Files,QDir::Type); */ return true; }
bool MainWindow2::openObject( QString strFilePath ) { QProgressDialog progress( tr("Opening document..."), tr("Abort"), 0, 100, this ); progress.setWindowModality( Qt::WindowModal ); progress.show(); editor->setCurrentLayer( 0 ); editor->layerManager()->setCurrentFrameIndex( 1 ); editor->fps = 12; m_pTimeLine->setFps( editor->fps ); m_pScribbleArea->setMyView( QMatrix() ); ObjectSaveLoader objectLoader( this ); Object* pObject = objectLoader.loadFromFile( strFilePath ); if ( pObject != NULL && objectLoader.error().code() == PCL_OK ) { SafeDelete( m_object ); m_object = pObject; pObject->setFilePath( strFilePath ); QSettings settings( "Pencil", "Pencil" ); settings.setValue( "lastFilePath", QVariant( pObject->filePath() ) ); editor->setObject( pObject ); editor->updateObject(); m_recentFileMenu->addRecentFile( pObject->filePath() ); m_recentFileMenu->saveToDisk(); qDebug() << "Current File Path=" << pObject->filePath(); setWindowTitle( pObject->filePath() ); } else { return false; } return true; //------------------- QString filePath = strFilePath; bool openingTheOLDWAY = true; QString realXMLFilePath = filePath; QString tmpFilePath; // ---- test before opening ---- QStringList zippedFileList = JlCompress::getFileList( filePath ); if ( !zippedFileList.empty() ) { qDebug() << "Recognized New zipped Pencil File Format !"; openingTheOLDWAY = false; // ---- now decompress PFF ----- QFileInfo fileInfo( filePath ); QDir dir( QDir::tempPath() ); tmpFilePath = QDir::tempPath() + "/" + fileInfo.completeBaseName() + PFF_TMP_DECOMPRESS_EXT; if ( fileInfo.exists() ) { dir.rmpath( tmpFilePath ); // --removes an old decompression directory removePFFTmpDirectory( tmpFilePath ); // --removes an old decompression directory - better approach } dir.mkpath( tmpFilePath ); // --creates a new decompression directory JlCompress::extractDir( filePath, tmpFilePath ); realXMLFilePath = tmpFilePath + "/" + PFF_XML_FILE_NAME; } else { qDebug() << "Recognized Old Pencil File Format !"; } QScopedPointer<QFile> file( new QFile( realXMLFilePath ) ); //QFile* file = new QFile(filePath); if ( !file->open( QFile::ReadOnly ) ) { if ( !openingTheOLDWAY ) { removePFFTmpDirectory( tmpFilePath ); // --removes temporary decompression directory } return false; } QDomDocument doc; if ( !doc.setContent( file.data() ) ) { if ( !openingTheOLDWAY ) { removePFFTmpDirectory( tmpFilePath ); // --removes temporary decompression directory } return false; // this is not a XML file } QDomDocumentType type = doc.doctype(); if ( type.name() != "PencilDocument" && type.name() != "MyObject" ) { if ( !openingTheOLDWAY ) { removePFFTmpDirectory( tmpFilePath ); // --removes temporary decompression directory } return false; // this is not a Pencil document } // delete old object @sent foreward -> if (ok) /*if (m_object != NULL) { m_object->deleteLater(); }*/ // ----------------------------- //QSettings settings("Pencil","Pencil"); //settings.setValue("lastFilePath", QVariant(object->strCurrentFilePath) ); QString dataLayersDir; if ( openingTheOLDWAY ) { dataLayersDir = filePath + "." + PFF_LAYERS_DIR; } else { dataLayersDir = tmpFilePath + "/" + PFF_LAYERS_DIR; } Object* newObject = new Object(); if ( !newObject->loadPalette( dataLayersDir ) ) { newObject->loadDefaultPalette(); } editor->setObject( newObject ); newObject->setFilePath( filePath ); // ------- reads the XML file ------- bool ok = true; int progVal = 0; QDomElement docElem = doc.documentElement(); if ( docElem.isNull() ) { return false; } if ( docElem.tagName() == "document" ) { qDebug( "Object Loader: start." ); qreal rProgressValue = 0; qreal rProgressDelta = 100 / docElem.childNodes().count(); QDomNode tag = docElem.firstChild(); while ( !tag.isNull() ) { QDomElement element = tag.toElement(); // try to convert the node to an element. if ( !element.isNull() ) { progVal = qMin( (int)rProgressValue, 100 ); progress.setValue( progVal ); rProgressValue += rProgressDelta; if ( element.tagName() == "editor" ) { qDebug( " Load editor" ); loadDomElement( element, filePath ); } else if ( element.tagName() == "object" ) { qDebug( " Load object" ); ok = newObject->loadDomElement( element, dataLayersDir ); qDebug() << " dataDir:" << dataLayersDir; } } tag = tag.nextSibling(); } } else { if ( docElem.tagName() == "object" || docElem.tagName() == "MyOject" ) // old Pencil format (<=0.4.3) { ok = newObject->loadDomElement( docElem, filePath ); } } // ------------------------------ if ( ok ) { editor->updateObject(); if ( !openingTheOLDWAY ) { removePFFTmpDirectory( tmpFilePath ); // --removes temporary decompression directory } m_recentFileMenu->addRecentFile( filePath ); m_recentFileMenu->saveToDisk(); //qDebug() << "Current File Path=" << newObject->strCurrentFilePath; setWindowTitle( newObject->filePath() ); // FIXME: need to free the old object. but delete object will crash app, don't know why. // fixed by shoshon... don't know if it's right Object* objectToDelete = m_object; m_object = newObject; if ( objectToDelete != NULL ) { delete objectToDelete; } } progress.setValue( 100 ); return true; }
bool MainWindow2::openObject(QString filePath) { // ---- test before opening ---- QScopedPointer<QFile> file(new QFile(filePath)); //QFile* file = new QFile(filePath); if (!file->open(QFile::ReadOnly)) { return false; } QDomDocument doc; if (!doc.setContent(file.data())) { return false; // this is not a XML file } QDomDocumentType type = doc.doctype(); if (type.name() != "PencilDocument" && type.name() != "MyObject") { return false; // this is not a Pencil document } // delete old object if (m_object != NULL) { m_object->deleteLater(); } // ----------------------------- QProgressDialog progress("Opening document...", "Abort", 0, 100, this); progress.setWindowModality(Qt::WindowModal); progress.show(); //QSettings settings("Pencil","Pencil"); //settings.setValue("lastFilePath", QVariant(object->strCurrentFilePath) ); Object* newObject = new Object(); if (!newObject->loadPalette(filePath+".data")) { newObject->loadDefaultPalette(); } editor->setObject(newObject); newObject->strCurrentFilePath = filePath; // ------- reads the XML file ------- bool ok = true; int prog = 0; QDomElement docElem = doc.documentElement(); if (docElem.isNull()) { return false; } if (docElem.tagName() == "document") { qDebug("Object Loader: start."); QDomNode tag = docElem.firstChild(); while (!tag.isNull()) { QDomElement element = tag.toElement(); // try to convert the node to an element. if (!element.isNull()) { prog += std::min(prog + 10, 100); progress.setValue(prog); if (element.tagName() == "editor") { qDebug(" Load editor"); loadDomElement(element, filePath); } else if (element.tagName() == "object") { qDebug(" Load object"); ok = newObject->loadDomElement(element, filePath); qDebug() << " filePath:" << filePath; } } tag = tag.nextSibling(); } } else { if (docElem.tagName() == "object" || docElem.tagName() == "MyOject") // old Pencil format (<=0.4.3) { ok = newObject->loadDomElement(docElem, filePath); } } // ------------------------------ if (ok) { editor->updateObject(); qDebug() << "Current File Path=" << newObject->strCurrentFilePath; setWindowTitle(newObject->strCurrentFilePath); // FIXME: need to free the old object. but delete object will crash app, don't know why. m_object = newObject; } progress.setValue(100); return ok; }