diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais
index 0a22f1148..cc9aa18f1 100644
--- a/rtdata/languages/Francais
+++ b/rtdata/languages/Francais
@@ -523,6 +523,7 @@ MAIN_MSG_JOBSINQUEUE;travail(aux) en file d'attente
MAIN_MSG_NAVIGATOR;Navigateur
MAIN_MSG_PLACES;Emplacement
MAIN_MSG_QOVERWRITE;Voulez-vous l'écraser?
+MAIN_MSG_WRITEFAILED;Échec de l'enregistrement du fichier\n\n"%1"\n\nAssurez-vous que le dossier existe et qu'il est permis d'y écrire.
MAIN_TAB_BASIC;Basique
MAIN_TAB_COLOR;Couleur
MAIN_TAB_COLOR_TOOLTIP;Alt-c
diff --git a/rtdata/languages/default b/rtdata/languages/default
index bd7121f9d..ae3d369a9 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -523,6 +523,7 @@ MAIN_MSG_JOBSINQUEUE;job(s) in the queue
MAIN_MSG_NAVIGATOR;Navigator
MAIN_MSG_PLACES;Places
MAIN_MSG_QOVERWRITE;Do you want to overwrite it?
+MAIN_MSG_WRITEFAILED;Failed to write\n\n"%1"\n\nMake sure that the folder exists and that you have write permission to it.
MAIN_TAB_BASIC;Basic
MAIN_TAB_COLOR;Color
MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-C
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 272d5176d..f81e9fde3 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -856,8 +856,13 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, ParamsEdited* p
int error1, error2;
error1 = write (fname , sPParams);
- error2 = write (fname2, sPParams);
- return error1 & error2;
+ if (fname2.length()) {
+ error2 = write (fname2, sPParams);
+ // If at least one file has been saved, it's a success
+ return error1 & error2;
+ }
+ else
+ return error1;
}
int ProcParams::write (Glib::ustring &fname, Glib::ustring &content) const {
diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc
index 611398297..0ed52e6b0 100644
--- a/rtgui/guiutils.cc
+++ b/rtgui/guiutils.cc
@@ -115,6 +115,12 @@ bool confirmOverwrite (Gtk::Window& parent, const std::string& filename) {
return safe;
}
+void writeFailed (Gtk::Window& parent, const std::string& filename) {
+ Glib::ustring msg_ = Glib::ustring::compose(M("MAIN_MSG_WRITEFAILED"), filename);
+ Gtk::MessageDialog msgd (parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
+ msgd.run ();
+}
+
void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int imh, int startx, int starty, double scale, const rtengine::procparams::CropParams& cparams) {
cr->set_line_width (0.);
diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h
index 1eed7274b..c2f400419 100644
--- a/rtgui/guiutils.h
+++ b/rtgui/guiutils.h
@@ -28,6 +28,7 @@ void thumbInterp (const unsigned char* src, int sw, int sh, unsigned char* dst,
Glib::ustring removeExtension (const Glib::ustring& filename);
Glib::ustring getExtension (const Glib::ustring& filename);
bool confirmOverwrite (Gtk::Window& parent, const std::string& filename);
+void writeFailed (Gtk::Window& parent, const std::string& filename);
void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int imh, int startx, int starty, double scale, const rtengine::procparams::CropParams& cparams);
/**
diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc
index 182fc8f9a..bec6349bd 100644
--- a/rtgui/profilepanel.cc
+++ b/rtgui/profilepanel.cc
@@ -186,17 +186,29 @@ void ProfilePanel::save_clicked (GdkEventButton* event) {
// saving the partial profile
PartialProfile ppTemp(true);
partialProfileDlg->applyPaste (ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited);
- ppTemp.pparams->save (fname, "", ppTemp.pedited);
+ int retCode = ppTemp.pparams->save (fname, "", ppTemp.pedited);
ppTemp.deleteInstance();
+ if (retCode)
+ writeFailed(dialog, fname);
+ else {
+ done=true;
+ refreshProfileList ();
+ }
}
else {
// saving a full profile
- toSave->pparams->save (fname);
+ int retCode = toSave->pparams->save (fname);
+ if (retCode)
+ writeFailed(dialog, fname);
+ else {
+ done=true;
+ refreshProfileList ();
+ }
}
- refreshProfileList ();
}
+ else done = true;
}
- done = true;
+ else done = true;
} while (!done);
return;
}