summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-09-17 09:56:21 +0200
committerCarl Hetherington <cth@carlh.net>2023-09-17 09:56:21 +0200
commit8123b1c58c175e71f8c5a490318510031cd41103 (patch)
tree47033b0e22cfb7440e957f3d2da80673179377bc
parentab09ee044d9342a9b294dff79469e89abd61748e (diff)
Make it easier to update an existing template.
-rw-r--r--src/tools/dcpomatic.cc4
-rw-r--r--src/wx/save_template_dialog.cc65
-rw-r--r--src/wx/save_template_dialog.h11
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;
};