From 330a7807ed773068701ad1ea476eb0417dde9c1c Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Mon, 14 Oct 2019 21:31:22 +0200 Subject: [PATCH 1/3] Partial profile save dialog order If it's a partial profile, it's more intuitive to first allow the user to choose which parameters to save before showing the Save As dialog. Closes #5491 --- rtgui/profilepanel.cc | 69 ++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index b4b85dfd0..627f413f3 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -275,6 +275,23 @@ void ProfilePanel::save_clicked (GdkEventButton* event) return; } + // If it's a partial profile, it's more intuitive to first allow the user + // to choose which parameters to save before showing the Save As dialog + // #5491 + if (event->state & Gdk::CONTROL_MASK) { + if(!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + } + + partialProfileDlg->set_title(M("PROFILEPANEL_SAVEPPASTE")); + int i = partialProfileDlg->run(); + partialProfileDlg->hide(); + + if (i != Gtk::RESPONSE_OK) { + return; + } + } + Gtk::FileChooserDialog dialog (getToplevelWindow (this), M("PROFILEPANEL_SAVEDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_SAVE); bindCurrentFolder (dialog, options.loadSaveProfilePath); dialog.set_current_name (lastFilename); @@ -294,7 +311,6 @@ void ProfilePanel::save_clicked (GdkEventButton* event) dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK); //Add filters, so that only certain file types can be selected: - Glib::RefPtr filter_pp = Gtk::FileFilter::create(); filter_pp->set_name(M("FILECHOOSER_FILTER_PP")); filter_pp->add_pattern("*" + paramFileExtension); @@ -305,8 +321,6 @@ void ProfilePanel::save_clicked (GdkEventButton* event) filter_any->add_pattern("*"); dialog.add_filter(filter_any); -// dialog.set_do_overwrite_confirmation (true); - bool done = false; do { @@ -337,45 +351,27 @@ void ProfilePanel::save_clicked (GdkEventButton* event) } if (toSave) { + int retCode; if (event->state & Gdk::CONTROL_MASK) { - // opening the partial paste dialog window - if(!partialProfileDlg) { - partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); - } - partialProfileDlg->set_title(M("PROFILEPANEL_SAVEPPASTE")); - int i = partialProfileDlg->run(); - partialProfileDlg->hide(); - - if (i != Gtk::RESPONSE_OK) { - return; - } - - // saving the partial profile + // Build partial profile PartialProfile ppTemp(true); partialProfileDlg->applyPaste (ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited); - int retCode = ppTemp.pparams->save (fname, "", true, ppTemp.pedited); + // Save partial profile + retCode = ppTemp.pparams->save (fname, "", true, ppTemp.pedited); + // Cleanup ppTemp.deleteInstance(); - - if (retCode) { - writeFailed(dialog, fname); - } else { - done = true; - bool ccPrevState = changeconn.block(true); - ProfileStore::getInstance()->parseProfiles(); - changeconn.block (ccPrevState); - } } else { - // saving a full profile - int retCode = toSave->pparams->save (fname); + // Save full profile + retCode = toSave->pparams->save (fname); + } - if (retCode) { - writeFailed(dialog, fname); - } else { - done = true; - bool ccPrevState = changeconn.block(true); - ProfileStore::getInstance()->parseProfiles(); - changeconn.block (ccPrevState); - } + if (!retCode) { + done = true; + bool ccPrevState = changeconn.block(true); + ProfileStore::getInstance()->parseProfiles(); + changeconn.block (ccPrevState); + } else { + writeFailed(dialog, fname); } } else { done = true; @@ -465,7 +461,6 @@ void ProfilePanel::load_clicked (GdkEventButton* event) dialog.add_button(M("GENERAL_OPEN"), Gtk::RESPONSE_OK); //Add filters, so that only certain file types can be selected: - Glib::RefPtr filter_pp = Gtk::FileFilter::create(); filter_pp->set_name(M("FILECHOOSER_FILTER_PP")); filter_pp->add_pattern("*" + paramFileExtension); From 095b5233a9082b3bf2286dde29d5368c45d9d92e Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 21 Oct 2019 22:50:17 +0200 Subject: [PATCH 2/3] partial save code review --- rtgui/profilepanel.cc | 50 +++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index 627f413f3..a6885d7d3 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -278,23 +278,24 @@ void ProfilePanel::save_clicked (GdkEventButton* event) // If it's a partial profile, it's more intuitive to first allow the user // to choose which parameters to save before showing the Save As dialog // #5491 - if (event->state & Gdk::CONTROL_MASK) { - if(!partialProfileDlg) { - partialProfileDlg = new PartialPasteDlg (Glib::ustring (), parent); + const auto isPartial = event->state & Gdk::CONTROL_MASK; + if (isPartial) { + if (!partialProfileDlg) { + partialProfileDlg = new PartialPasteDlg(Glib::ustring(), parent); } partialProfileDlg->set_title(M("PROFILEPANEL_SAVEPPASTE")); - int i = partialProfileDlg->run(); + const auto response = partialProfileDlg->run(); partialProfileDlg->hide(); - if (i != Gtk::RESPONSE_OK) { + if (response != Gtk::RESPONSE_OK) { return; } } - Gtk::FileChooserDialog dialog (getToplevelWindow (this), M("PROFILEPANEL_SAVEDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_SAVE); - bindCurrentFolder (dialog, options.loadSaveProfilePath); - dialog.set_current_name (lastFilename); + Gtk::FileChooserDialog dialog(getToplevelWindow(this), M("PROFILEPANEL_SAVEDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_SAVE); + bindCurrentFolder(dialog, options.loadSaveProfilePath); + dialog.set_current_name(lastFilename); //Add the user's default (or global if multiuser=false) profile path to the Shortcut list try { @@ -311,33 +312,32 @@ void ProfilePanel::save_clicked (GdkEventButton* event) dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK); //Add filters, so that only certain file types can be selected: - Glib::RefPtr filter_pp = Gtk::FileFilter::create(); + auto filter_pp = Gtk::FileFilter::create(); filter_pp->set_name(M("FILECHOOSER_FILTER_PP")); filter_pp->add_pattern("*" + paramFileExtension); dialog.add_filter(filter_pp); - Glib::RefPtr filter_any = Gtk::FileFilter::create(); + auto filter_any = Gtk::FileFilter::create(); filter_any->set_name(M("FILECHOOSER_FILTER_ANY")); filter_any->add_pattern("*"); dialog.add_filter(filter_any); - bool done = false; + bool done = true; do { if (dialog.run() == Gtk::RESPONSE_OK) { std::string fname = dialog.get_filename(); - Glib::ustring ext = getExtension (fname); - if (("." + ext) != paramFileExtension) { + if (("." + getExtension(fname)) != paramFileExtension) { fname += paramFileExtension; } - if (!confirmOverwrite (dialog, fname)) { + if (!confirmOverwrite(dialog, fname)) { continue; } - lastFilename = Glib::path_get_basename (fname); + lastFilename = Glib::path_get_basename(fname); const PartialProfile* toSave; @@ -347,7 +347,7 @@ void ProfilePanel::save_clicked (GdkEventButton* event) toSave = lastsaved; } else { const ProfileStoreEntry* entry = profiles->getSelectedEntry(); - toSave = entry ? ProfileStore::getInstance()->getProfile (profiles->getSelectedEntry()) : nullptr; + toSave = entry ? ProfileStore::getInstance()->getProfile(entry) : nullptr; } if (toSave) { @@ -355,33 +355,27 @@ void ProfilePanel::save_clicked (GdkEventButton* event) if (event->state & Gdk::CONTROL_MASK) { // Build partial profile PartialProfile ppTemp(true); - partialProfileDlg->applyPaste (ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited); + partialProfileDlg->applyPaste(ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited); // Save partial profile - retCode = ppTemp.pparams->save (fname, "", true, ppTemp.pedited); + retCode = ppTemp.pparams->save(fname, "", true, ppTemp.pedited); // Cleanup ppTemp.deleteInstance(); } else { // Save full profile - retCode = toSave->pparams->save (fname); + retCode = toSave->pparams->save(fname); } if (!retCode) { - done = true; - bool ccPrevState = changeconn.block(true); + const auto ccPrevState = changeconn.block(true); ProfileStore::getInstance()->parseProfiles(); - changeconn.block (ccPrevState); + changeconn.block(ccPrevState); } else { + done = false; writeFailed(dialog, fname); } - } else { - done = true; } - } else { - done = true; } } while (!done); - - return; } /* From 45900cbd68fdd56515a90f867b6665d4b8252d57 Mon Sep 17 00:00:00 2001 From: Ingo Weyrich Date: Mon, 21 Oct 2019 23:02:48 +0200 Subject: [PATCH 3/3] partial save code review --- rtgui/profilepanel.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index a6885d7d3..fc418e5b7 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -346,13 +346,13 @@ void ProfilePanel::save_clicked (GdkEventButton* event) } else if (isLastSavedSelected()) { toSave = lastsaved; } else { - const ProfileStoreEntry* entry = profiles->getSelectedEntry(); + const auto entry = profiles->getSelectedEntry(); toSave = entry ? ProfileStore::getInstance()->getProfile(entry) : nullptr; } if (toSave) { int retCode; - if (event->state & Gdk::CONTROL_MASK) { + if (isPartial) { // Build partial profile PartialProfile ppTemp(true); partialProfileDlg->applyPaste(ppTemp.pparams, ppTemp.pedited, toSave->pparams, toSave->pedited);