diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-09-17 09:56:21 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2023-09-17 09:56:21 +0200 |
| commit | 8123b1c58c175e71f8c5a490318510031cd41103 (patch) | |
| tree | 47033b0e22cfb7440e957f3d2da80673179377bc | |
| parent | ab09ee044d9342a9b294dff79469e89abd61748e (diff) | |
Make it easier to update an existing template.
| -rw-r--r-- | src/tools/dcpomatic.cc | 4 | ||||
| -rw-r--r-- | src/wx/save_template_dialog.cc | 65 | ||||
| -rw-r--r-- | src/wx/save_template_dialog.h | 11 |
3 files changed, 68 insertions, 12 deletions
diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 0ed65da8d..2dcf48a1c 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -446,6 +446,7 @@ public: if (template_name) { film->use_template (template_name.get()); } + _last_template = template_name; film->set_name (path.filename().generic_string()); film->write_metadata (); set_film (film); @@ -606,7 +607,7 @@ private: void file_save_as_template () { - SaveTemplateDialog dialog(this); + SaveTemplateDialog dialog(this, _last_template); if (dialog.ShowModal() == wxID_OK) { try { Config::instance()->save_template(_film, dialog.name()); @@ -1558,6 +1559,7 @@ private: bool _update_news_requested = false; shared_ptr<Content> _clipboard; bool _first_shown_called = false; + optional<string> _last_template; }; diff --git a/src/wx/save_template_dialog.cc b/src/wx/save_template_dialog.cc index 6a6644efe..13481271c 100644 --- a/src/wx/save_template_dialog.cc +++ b/src/wx/save_template_dialog.cc @@ -18,27 +18,60 @@ */ +#include "check_box.h" +#include "dcpomatic_choice.h" #include "save_template_dialog.h" #include "wx_util.h" #include "lib/config.h" using std::string; +using boost::optional; #if BOOST_VERSION >= 106100 using namespace boost::placeholders; #endif -SaveTemplateDialog::SaveTemplateDialog (wxWindow* parent) + +SaveTemplateDialog::SaveTemplateDialog(wxWindow* parent, optional<string> last_template) : TableDialog (parent, _("Save template"), 2, 1, true) { - add (_("Template name"), true); + _as_existing = new wxRadioButton(this, wxID_ANY, "Save over existing template"); + add(_as_existing, true); + _existing = new Choice(this); + add(_existing); + + auto const existing_templates = Config::instance()->templates(); + for (auto i: existing_templates) { + _existing->add(i); + } + + _new = new wxRadioButton(this, wxID_ANY, _("Make new template with name")); + add(_new, true); _name = add (new wxTextCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (300, -1))); _name->SetFocus (); layout (); - wxButton* ok = dynamic_cast<wxButton *> (FindWindowById (wxID_OK, this)); - ok->Bind (wxEVT_BUTTON, boost::bind(&SaveTemplateDialog::check, this, _1)); + _as_existing->Enable(!existing_templates.empty()); + _existing->Enable(!existing_templates.empty()); + + if (last_template) { + auto iter = std::find(existing_templates.begin(), existing_templates.end(), *last_template); + if (iter != existing_templates.end()) { + _as_existing->SetValue(true); + _existing->set(std::distance(existing_templates.begin(), iter)); + } + } else if (!existing_templates.empty()) { + _new->SetValue(true); + } + + + auto ok = dynamic_cast<wxButton *>(FindWindowById(wxID_OK, this)); + if (ok) { + ok->Bind(wxEVT_BUTTON, boost::bind(&SaveTemplateDialog::check, this, _1)); + } - _name->Bind (wxEVT_TEXT, boost::bind(&SaveTemplateDialog::setup_sensitivity, this)); + _as_existing->Bind(wxEVT_RADIOBUTTON, boost::bind(&SaveTemplateDialog::setup_sensitivity, this)); + _new->Bind(wxEVT_RADIOBUTTON, boost::bind(&SaveTemplateDialog::setup_sensitivity, this)); + _name->Bind(wxEVT_TEXT, boost::bind(&SaveTemplateDialog::setup_sensitivity, this)); setup_sensitivity (); } @@ -47,9 +80,13 @@ SaveTemplateDialog::SaveTemplateDialog (wxWindow* parent) void SaveTemplateDialog::setup_sensitivity () { - wxButton* ok = dynamic_cast<wxButton *>(FindWindowById(wxID_OK, this)); - if (ok) { - ok->Enable (!_name->GetValue().IsEmpty()); + _existing->Enable(_as_existing->GetValue()); + _name->Enable(_new->GetValue()); + if (_new->GetValue()) { + _name->SetFocus(); + } + if (auto ok = dynamic_cast<wxButton *>(FindWindowById(wxID_OK, this))) { + ok->Enable(_as_existing->GetValue() || (_new->GetValue() && !_name->GetValue().IsEmpty())); } } @@ -57,15 +94,23 @@ SaveTemplateDialog::setup_sensitivity () string SaveTemplateDialog::name () const { - return wx_to_std (_name->GetValue ()); + if (_as_existing->GetValue()) { + auto const templates = Config::instance()->templates(); + auto selection = _existing->get(); + DCPOMATIC_ASSERT(selection && *selection < int(templates.size())); + return templates[*selection]; + } else { + return wx_to_std(_name->GetValue()); + } } + void SaveTemplateDialog::check (wxCommandEvent& ev) { bool ok = true; - if (Config::instance()->existing_template (wx_to_std (_name->GetValue ()))) { + if (_new->GetValue() && Config::instance()->existing_template(wx_to_std(_name->GetValue()))) { ok = confirm_dialog (this, _("There is already a template with this name. Do you want to overwrite it?")); } diff --git a/src/wx/save_template_dialog.h b/src/wx/save_template_dialog.h index 7e4808ca2..e6d42d181 100644 --- a/src/wx/save_template_dialog.h +++ b/src/wx/save_template_dialog.h @@ -18,12 +18,18 @@ */ + #include "table_dialog.h" + +class CheckBox; +class Choice; + + class SaveTemplateDialog : public TableDialog { public: - explicit SaveTemplateDialog (wxWindow* parent); + SaveTemplateDialog(wxWindow* parent, boost::optional<std::string> last_template); std::string name () const; @@ -32,4 +38,7 @@ private: void check (wxCommandEvent& ev); wxTextCtrl* _name; + wxRadioButton* _as_existing; + Choice* _existing; + wxRadioButton* _new; }; |
