diff --git a/Scribus/scribus/canvasmode_normal.cpp b/Scribus/scribus/canvasmode_normal.cpp index 7cf09ab..803e947 100644 --- a/Scribus/scribus/canvasmode_normal.cpp +++ b/Scribus/scribus/canvasmode_normal.cpp @@ -1476,6 +1476,7 @@ void CanvasMode_Normal::importToPage() m_doc->useRaster = savedAlignGrid; m_doc->SnapGuides = savedAlignGuides; m_doc->SnapElement = savedAlignElement; + m_ScMW->checkMissingImages(); m_doc->setLoading(false); m_doc->view()->DrawNew(); if (m_doc->m_Selection->count() > 0) diff --git a/Scribus/scribus/scribus.cpp b/Scribus/scribus/scribus.cpp index 331736f..58e3a03 100644 --- a/Scribus/scribus/scribus.cpp +++ b/Scribus/scribus/scribus.cpp @@ -229,6 +229,7 @@ for which a new license (GPL+exception) is in place. #include "urllauncher.h" #include "util.h" #include "util_formats.h" +#include "util_file.h" #include "util_ghostscript.h" #include "util_icon.h" #include "util_math.h" @@ -4134,6 +4135,7 @@ bool ScribusMainWindow::loadDoc(QString fileName) Apply_MasterPage(doc->DocPages.at(p)->MPageNam, p, false); } view->reformPages(false); + checkMissingImages(); doc->setLoading(false); /* if (fileLoader->FileType > FORMATID_NATIVEIMPORTEND) { @@ -10313,3 +10315,29 @@ void ScribusMainWindow::updateTableMenuActions() scrActions["tableAdjustTableToFrame"]->setEnabled(table); } +void ScribusMainWindow::checkMissingImages() +{ + QMap missingMap; + for (int a = 0; a < doc->Items->count(); ++a) + { + PageItem *currItem = doc->Items->at(a); + if (!currItem->Pfile.isEmpty()) + { + QFileInfo fi = QFileInfo(currItem->Pfile); + if (!fi.exists()) + missingMap.insert(fi.absoluteFilePath(), currItem); + } + } + + if (!missingMap.isEmpty()) + { + QMap replaceMap = fileFinder(missingMap.keys(), this); + foreach (QString filePath, replaceMap.keys()) + { + PageItem* item = missingMap.value(filePath); + item->loadImage(replaceMap.value(filePath), false); + } + doc->updatePic(); + } +} + diff --git a/Scribus/scribus/scribus.h b/Scribus/scribus/scribus.h index e79d311..74d2801 100644 --- a/Scribus/scribus/scribus.h +++ b/Scribus/scribus/scribus.h @@ -518,7 +518,8 @@ public slots: * canvas modes/gestures. */ void updateTableMenuActions(); - + //! \brief check for missing externals files (images for now) + void checkMissingImages(); signals: void AppModeChanged(int oldMode, int newMode); void TextStyle(const ParagraphStyle&); diff --git a/Scribus/scribus/util_file.cpp b/Scribus/scribus/util_file.cpp index 589ebd8..10713f4 100644 --- a/Scribus/scribus/util_file.cpp +++ b/Scribus/scribus/util_file.cpp @@ -13,14 +13,19 @@ for which a new license (GPL+exception) is in place. # include #endif +#include #include #include #include #include +#include +#include #include #include #include +#include +#include "ui/customfdialog.h" #include "scstreamfilter.h" bool copyData(QIODevice& src, QIODevice& dest) @@ -230,3 +235,88 @@ bool fileInPath(const QString& filename) } return false; } + +QMap fileFinder(QList filesList, QWidget* parent) +{ + QString searchPath = QString(); + bool reUsePath = false; + QMap resultMap; + foreach (QString sPath, filesList) + resultMap.insert(sPath, QString()); + QMap replacePaths; //map for remember replaced paths + foreach (QString filePath, filesList) + { + QFileInfo fi = QFileInfo(filePath); + if (fi.exists()) + { + resultMap.insert(filePath, filePath); + continue; + } + + QString sPath = fi.absolutePath(); + QString dPath = QString(); + if (replacePaths.contains(sPath)) + { + dPath = replacePaths.value(sPath); + QFile f(dPath + "/" + fi.fileName()); + if (f.exists()) + { + resultMap.insert(filePath, dPath + "/" + fi.fileName()); + continue; + } + if (!searchPath.isEmpty()) + { + QFile f(searchPath + "/" + fi.fileName()); + if (f.exists()) + { + resultMap.insert(filePath, searchPath + "/" + fi.fileName()); + continue; + } + else + searchPath.clear(); + } + } + QString wdir = QDir::fromNativeSeparators( fi.path() ); + QString fname = fi.fileName(); + + CustomFDialog *dia = new CustomFDialog(parent, wdir, QWidget::tr("Find Missing External File: ") + fi.filePath(), QString(), fdShowPreview + fdExistingFiles); + QCheckBox* usePath = new QCheckBox(dia); + usePath->setText( QWidget::tr("Search other missing files in selected directory")); + usePath->setToolTip( QWidget::tr("If other missing files were found then first they will searched in that directory and dialog does not appear.")); + usePath->setChecked(reUsePath); + dia->addWidgets(usePath); + QCheckBox* stopSearch = new QCheckBox(dia); + stopSearch->setText( QWidget::tr("Stop searching of missing files")); + stopSearch->setChecked(false); + dia->addWidgets(stopSearch); + dia->setSelection(fname); + + if (dia->exec() == QDialog::Accepted) + { + fname = dia->selectedFile(); + if (!fname.isEmpty()) + { + fi = QFileInfo(fname); + resultMap.insert(filePath, fi.absoluteFilePath()); + replacePaths.insert(wdir, fi.absolutePath()); + if (usePath->isChecked()) + { + searchPath = fi.absolutePath(); + reUsePath = true; + } + else + { + searchPath.clear(); + reUsePath = false; + } + } + } + if (stopSearch->isChecked()) + { + delete dia; + break; + } + delete dia; + } + return resultMap; +} diff --git a/Scribus/scribus/util_file.h b/Scribus/scribus/util_file.h index 933cdf8..33e7531 100644 --- a/Scribus/scribus/util_file.h +++ b/Scribus/scribus/util_file.h @@ -8,10 +8,12 @@ for which a new license (GPL+exception) is in place. #define _UTIL_FILE_H #include "scribusapi.h" - +#include +#include class QDataStream; class QString; class ScStreamFilter; +class QWidget; /** * @brief Copy a source file to a target @@ -83,4 +85,15 @@ bool SCRIBUS_API touchFile(const QString& file); **/ bool SCRIBUS_API fileInPath(const QString& filename); +/** + * @brief Ask user for missing files + * + * FileFinder can be used for asking user for some missing files + * FileFinder takes list of missing files paths + * and returns map of replaced paths + * Dirs where files was found are stored and used for next searches + * for minimalize asks to user + */ +QMap SCRIBUS_API fileFinder(QList filesList, QWidget* parent); + #endif