//////////////////////////////////////////////////////////////////////////////// /** * \file project.cpp * \version v1.0 * \author Ing. Dominik Malcik */ //////////////////////////////////////////////////////////////////////////////// #include "project.h" #include "mainwindow.h" #include "xmlparser.h" // Konstanty const QString Project::PROJVERSION = QString("1.0"); const QString Project::PROJSUBDIR_IMAGES = QString("images"); const QString Project::PROJSUBDIR_LAYERS = QString("layers"); const QString Project::PROJ_FILE_EXT = QString(".mapro"); const QString Project::XML_TRUE = QString("1"); const QString Project::XML_FALSE = QString("0"); // -------------------------------------------- /** * @brief = KONSTRUKTOR */ // -------------------------------------------- Project::Project(QObject *parent) : QObject(parent){ valueInit(); } // -------------------------------------------- /** * @brief = DESTRUKTOR */ // -------------------------------------------- Project::~Project() { } void Project::valueInit() { setProjectName(""); setProjectFileName(""); setProjectRootDir(""); setProjectRootDir_old(""); setImagesDir(PROJSUBDIR_IMAGES); setLayersDir(PROJSUBDIR_LAYERS); setFileImported(false); std::vector imgs; setImages(imgs); std::vector lrs; setLayers(lrs); } void Project::setProjectName (QString s) { this->projectName = s; } QString Project::getProjectName (void) { return this->projectName; } void Project::setProjectFileName (QString s) { this->projectFileName = s; } QString Project::getProjectFileName (void) { return this->projectFileName; } void Project::setProjectRootDir (QString s) { this->projectRootDir = s; } QString Project::getProjectRootDir (void) { return this->projectRootDir; } void Project::setProjectRootDir_old (QString s) { this->projectRootDir_old = s; } QString Project::getProjectRootDir_old (void) { return this->projectRootDir_old; } void Project::setImagesDir (QString s) { this->imagesDir = s; } QString Project::getImagesDir (void) { return this->imagesDir; } void Project::setLayersDir (QString s) { this->layersDir = s; } QString Project::getLayersDir (void) { return this->layersDir; } void Project::setFileImported (bool i) { this->fileImported = i; } bool Project::getFileImported (void) { return this->fileImported; } void Project::setImages (std::vector i) { if (i != getImages()) { this->images = i; emit imagesValueChanged(); } } std::vector Project::getImages (void) { return this->images; } void Project::addToImages (QString s) { this->images.push_back(s); emit imagesValueChanged(); } QString Project::getSelectedImage (unsigned int index) { if (images.size() > index) { return this->images[index]; } else { return "ERROR"; } } void Project::eraseSelectedImage(unsigned int index) { if (images.size() > index) { std::vector::iterator it = images.begin(); it += index; images.erase(it); } } void Project::emitDeleteImported() { emit imagesValueChanged(); } void Project::setLayers (std::vector i) { if (i != getLayers()) { this->layers = i; emit layersValueChanged(); } } std::vector Project::getLayers (void) { return this->layers; } void Project::addToLayers (QString s) { this->layers.push_back(s); emit layersValueChanged(); } QString Project::getSelectedLayer (unsigned int index) { if (layers.size() > index) { return this->layers[index]; } else { return "ERROR"; } } void Project::eraseSelectedLayer(unsigned int index) { if (layers.size() > index) { std::vector::iterator it = layers.begin(); it += index; layers.erase(it); } } void Project::emitDeleteAnalysings() { emit layersValueChanged(); } int Project::layersCount() { return this->layers.size(); } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- void Project::prepareProject(QString rootDir, QString projectName, QString projectFileName, bool fileImported, std::vector images, std::vector layers) { setProjectRootDir_old(getProjectRootDir()); setProjectRootDir(rootDir); setProjectName(projectName); setProjectFileName(projectFileName); setFileImported(fileImported); setImagesDir(Project::PROJSUBDIR_IMAGES); setLayersDir(Project::PROJSUBDIR_LAYERS); setImages(images); setLayers(layers); } bool Project::fileCopy(QString fileName, QString destDir, QString destFilename, QString * newFileName) { // remembering of the filename QFileInfo fi(fileName); // get the number for filename (filename_number.ext) QDir dir(destDir); int number = dir.count(); number--; while (1) { QString numStr = QString::number(number); QFile destFile(destDir + "/" + destFilename + "_" + numStr + "." + fi.completeSuffix()); if (!destFile.exists()) { break; } else { number++; } } // copy the file to the project directory with a specified filename QString numStr = QString::number(number); QString finalDestFileString = destDir + "/" + destFilename + "_" + numStr + "." + fi.completeSuffix(); QFile sourceFile(fileName); QFile finalDestFile(finalDestFileString); QFileInfo finalFi(finalDestFileString); *newFileName = finalFi.baseName() + "." + finalFi.completeSuffix(); if (sourceFile.exists()) { if (!sourceFile.copy(finalDestFile.fileName())) { return false; } } return true; } bool Project::removeDir(QString dirName) { bool result = true; QDir dir(dirName); if (dir.exists(dirName)) { Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) { if (info.isDir()) { result = this->removeDir(info.absoluteFilePath()); } else { result = QFile::remove(info.absoluteFilePath()); } if (!result) { return result; } } result = dir.rmdir(dirName); } return result; } bool Project::saveToFile(bool removeSubDirs) { if (getProjectRootDir() == getProjectRootDir_old()) { removeSubDirs = false; } QFile mapro(getProjectRootDir() + "/" + getProjectFileName()); if (mapro.exists()) { if (!mapro.open(QIODevice::WriteOnly | QIODevice::Truncate)) { return false; } } else { if (!mapro.open(QIODevice::ReadWrite)) { return false; } } // make an entry in XML for an imported image QString importedInt = XML_FALSE; if (getFileImported()) { importedInt = XML_TRUE; } // prepare directory structure for the project QString projImages_dir = getProjectRootDir(); projImages_dir.append("/").append(getImagesDir()); QString projLayers_dir = getProjectRootDir(); projLayers_dir.append("/").append(getLayersDir()); if (removeSubDirs) { if (QDir(projImages_dir).exists()) { removeDir(projImages_dir); } QDir().mkpath(projImages_dir); if (QDir(projLayers_dir).exists()) { removeDir(projLayers_dir); } QDir().mkpath(projLayers_dir); } else { if (!QDir(projImages_dir).exists()) { QDir().mkpath(projImages_dir); } if (!QDir(projLayers_dir).exists()) { QDir().mkpath(projLayers_dir); } } // copying of the files and creating an XML entry // BACKGROUNDs QString importedImageFilesXML = ""; std::vector tmpB = getImages(); for (uint i = 0; i < getImages().size(); i++) { QString scrImage = getImages()[i]; // source file QFileInfo scrFi(scrImage); // if the file is already in the right place, do not perform the copying bool fileFromProjectDir = false; if (scrImage == (scrFi.baseName() + "." + scrFi.completeSuffix())) { scrImage = getProjectRootDir_old() + "/" + getImagesDir() + "/" + scrImage; fileFromProjectDir = true; } QString destAddr = getProjectRootDir() + "/" + getImagesDir(); // destination directory QString newFileName_part = "pict"; // renaming of the file QString newFileName_whole; // final file name for XML entry // for SAVE it does not copy files that already exist in the project bool makeCopy = true; QFile testExist(scrImage); if (!removeSubDirs && fileFromProjectDir && testExist.exists()) { makeCopy = false; newFileName_whole = getImages()[i]; } if (makeCopy && !fileCopy(scrImage, destAddr, newFileName_part, &newFileName_whole)) { removeDir(getProjectRootDir()); return false; } if (makeCopy) { tmpB[i] = newFileName_whole; } importedImageFilesXML += "\t\t" + newFileName_whole + "\n"; } setImages(tmpB); // copying of the files and creating an XML entry // LAYERs QString importedLayerFilesXML = ""; std::vector tmpL = getLayers(); for (uint i = 0; i < getLayers().size(); i++) { QString scrImage = getLayers()[i]; // source file QFileInfo scrFi(scrImage); bool fileFromProjectDir = false; if (scrImage == (scrFi.baseName() + "." + scrFi.completeSuffix())) { scrImage = getProjectRootDir_old() + "/" + getLayersDir() + "/" + scrImage; fileFromProjectDir = true; } QString destAddr = getProjectRootDir() + "/" + getLayersDir(); // destination directory QString newFileName_part = scrFi.baseName(); // renaming of the file QString newFileName_whole; // final file name for XML entry // for SAVE it does not copy files that already exist in the project bool makeCopy = true; QFile testExist(scrImage); if (!removeSubDirs && fileFromProjectDir && testExist.exists()) { makeCopy = false; newFileName_whole = getLayers()[i]; } if (makeCopy && !fileCopy(scrImage, destAddr, newFileName_part, &newFileName_whole)) { removeDir(getProjectRootDir()); return false; } if (makeCopy) { tmpL[i] = newFileName_whole; } importedLayerFilesXML += "\t\t" + newFileName_whole + "\n"; } setLayers(tmpL); // XML format of the project file QTextStream ts( &mapro ); ts << "" << endl << "\t" + PROJVERSION + "" << endl << "\t" + getProjectName() + "" << endl << "\t" + importedInt + "" << endl << "\t" + getImagesDir() + "" << endl << "\t" + getLayersDir() + "" << endl << "\t" << endl; if (importedImageFilesXML.length() > 0) { ts << importedImageFilesXML; } ts << "\t" << endl << "\t" << endl; if (importedLayerFilesXML.length() > 0) { ts << importedLayerFilesXML; } ts << "\t" << endl << "" << endl; mapro.close(); return true; } bool Project::deleteAnalysing(int index) { // prepare path for removing of a file QString fileToRemove = getProjectRootDir() + "/"; fileToRemove += getLayersDir() + "/"; fileToRemove += getSelectedLayer(index); // remove file from LAYERs eraseSelectedLayer(index); return QFile::remove(fileToRemove); } bool Project::deleteImported(int index) { // prepare path for removing of a file QString fileToRemove = getProjectRootDir() + "/"; fileToRemove += getImagesDir() + "/"; fileToRemove += getSelectedImage(index); // remove file from BACKGROUNDs eraseSelectedImage(index); // samotne smazani souboru return QFile::remove(fileToRemove); }