aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--desktop-widgets/mainwindow.cpp19
-rw-r--r--desktop-widgets/templatelayout.cpp29
-rw-r--r--desktop-widgets/templatelayout.h2
3 files changed, 48 insertions, 2 deletions
diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp
index 05314af1d..e5739bd47 100644
--- a/desktop-widgets/mainwindow.cpp
+++ b/desktop-widgets/mainwindow.cpp
@@ -256,8 +256,23 @@ MainWindow::MainWindow() : QMainWindow(),
connect(geoLookup, SIGNAL(started()),information(), SLOT(disableGeoLookupEdition()));
connect(geoLookup, SIGNAL(finished()), information(), SLOT(enableGeoLookupEdition()));
#ifndef NO_PRINTING
- // copy the bundled print templates to the user path; no overwriting occurs!
- copyPath(getPrintingTemplatePathBundle(), getPrintingTemplatePathUser());
+ // copy the bundled print templates to the user path
+ QStringList templateBackupList;
+ QString templatePathUser(getPrintingTemplatePathUser());
+ copy_bundled_templates(getPrintingTemplatePathBundle(), templatePathUser, &templateBackupList);
+ if (templateBackupList.length()) {
+ QMessageBox msgBox(this);
+ templatePathUser.replace("\\", "/");
+ templateBackupList.replaceInStrings(templatePathUser + "/", "");
+ msgBox.setWindowTitle(tr("Template backup created"));
+ msgBox.setText(tr("The following backup printing templates were created:\n\n%1\n\n"
+ "Location:\n%2\n\n"
+ "Please note that as of this version of Subsurface the default templates\n"
+ "are read-only and should not be edited directly, since the application\n"
+ "can overwrite them on startup.").arg(templateBackupList.join("\n")).arg(templatePathUser));
+ msgBox.setStandardButtons(QMessageBox::Ok);
+ msgBox.exec();
+ }
set_bundled_templates_as_read_only();
find_all_templates();
#endif
diff --git a/desktop-widgets/templatelayout.cpp b/desktop-widgets/templatelayout.cpp
index ab9b3f09a..f3f3c8be2 100644
--- a/desktop-widgets/templatelayout.cpp
+++ b/desktop-widgets/templatelayout.cpp
@@ -62,6 +62,35 @@ void set_bundled_templates_as_read_only()
QFile::setPermissions(pathUser + QDir::separator() + f, QFileDevice::ReadOwner | QFileDevice::ReadUser);
}
+void copy_bundled_templates(QString src, QString dst, QStringList *templateBackupList)
+{
+ QDir dir(src);
+ if (!dir.exists())
+ return;
+ foreach (QString d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
+ QString dst_path = dst + QDir::separator() + d;
+ dir.mkpath(dst_path);
+ copy_bundled_templates(src + QDir::separator() + d, dst_path, templateBackupList);
+ }
+ foreach (QString f, dir.entryList(QDir::Files)) {
+ QFile fileSrc(src + QDir::separator() + f);
+ QFile fileDest(dst + QDir::separator() + f);
+ if (fileDest.exists()) {
+ // if open() fails the file is either locked or r/o. try to remove it and then overwrite
+ if (!fileDest.open(QFile::ReadWrite | QFile::Text)) {
+ fileDest.setPermissions(QFileDevice::WriteOwner | QFileDevice::WriteUser);
+ fileDest.remove();
+ } else { // if the file is not read-only create a backup
+ fileDest.close();
+ const QString targetFile = fileDest.fileName().replace(".html", "-User.html");
+ fileDest.copy(targetFile);
+ *templateBackupList << targetFile;
+ }
+ }
+ fileSrc.copy(fileDest.fileName()); // in all cases copy the file
+ }
+}
+
TemplateLayout::TemplateLayout(print_options *PrintOptions, template_options *templateOptions) :
m_engine(NULL)
{
diff --git a/desktop-widgets/templatelayout.h b/desktop-widgets/templatelayout.h
index 8ec4eadc7..cb60cc03d 100644
--- a/desktop-widgets/templatelayout.h
+++ b/desktop-widgets/templatelayout.h
@@ -2,6 +2,7 @@
#ifndef TEMPLATELAYOUT_H
#define TEMPLATELAYOUT_H
+#include <QStringList>
#include <grantlee_templates.h>
#include "mainwindow.h"
#include "printoptions.h"
@@ -13,6 +14,7 @@
int getTotalWork(print_options *printOptions);
void find_all_templates();
void set_bundled_templates_as_read_only();
+void copy_bundled_templates(QString src, QString dst, QStringList *templateBackupList);
extern QList<QString> grantlee_templates, grantlee_statistics_templates;