From: Carl Hetherington Date: Mon, 2 May 2022 22:37:04 +0000 (+0200) Subject: Add preference for default KDM duration (#2224). X-Git-Tag: v2.16.11~28 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=26866fdeba6dd868b1809de49799690555164f70 Add preference for default KDM duration (#2224). --- diff --git a/src/lib/config.cc b/src/lib/config.cc index 3334e6fbf..b46093726 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -78,6 +78,7 @@ boost::signals2::signal Config::Bad; Config::Config () /* DKDMs are not considered a thing to reset on set_defaults() */ : _dkdms (new DKDMGroup ("root")) + , _default_kdm_duration (1, RoughDuration::Unit::WEEKS) { set_defaults (); } @@ -188,6 +189,7 @@ Config::set_defaults () _write_kdms_to_disk = true; _email_kdms = false; _default_kdm_type = dcp::Formulation::MODIFIED_TRANSITIONAL_1; + _default_kdm_duration = RoughDuration(1, RoughDuration::Unit::WEEKS); _auto_crop_threshold = 0.1; _allowed_dcp_frame_rates.clear (); @@ -580,6 +582,11 @@ try _write_kdms_to_disk = f.optional_bool_child("WriteKDMsToDisk").get_value_or(true); _email_kdms = f.optional_bool_child("EmailKDMs").get_value_or(false); _default_kdm_type = dcp::string_to_formulation(f.optional_string_child("DefaultKDMType").get_value_or("modified-transitional-1")); + if (auto duration = f.optional_node_child("DefaultKDMDuration")) { + _default_kdm_duration = RoughDuration(duration); + } else { + _default_kdm_duration = RoughDuration(1, RoughDuration::Unit::WEEKS); + } _auto_crop_threshold = f.optional_number_child("AutoCropThreshold").get_value_or(0.1); if (boost::filesystem::exists (_cinemas_file)) { @@ -725,6 +732,7 @@ Config::write_config () const /* [XML:opt] DefaultKDMDirectory Default directory to write KDMs to. */ root->add_child("DefaultKDMDirectory")->add_child_text (_default_kdm_directory->string ()); } + _default_kdm_duration.as_xml(root->add_child("DefaultKDMDuration")); /* [XML] MailServer Hostname of SMTP server to use. */ root->add_child("MailServer")->add_child_text (_mail_server); /* [XML] MailPort Port number to use on SMTP server. */ diff --git a/src/lib/config.h b/src/lib/config.h index 40497e219..e425a976c 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -28,6 +28,7 @@ #include "audio_mapping.h" +#include "rough_duration.h" #include "state.h" #include "types.h" #include @@ -572,6 +573,10 @@ public: return _default_kdm_type; } + RoughDuration default_kdm_duration () const { + return _default_kdm_duration; + } + double auto_crop_threshold () const { return _auto_crop_threshold; } @@ -1100,6 +1105,10 @@ public: maybe_set (_default_kdm_type, type); } + void set_default_kdm_duration (RoughDuration duration) { + maybe_set (_default_kdm_duration, duration); + } + void set_auto_crop_threshold (double threshold) { maybe_set (_auto_crop_threshold, threshold, AUTO_CROP_THRESHOLD); } @@ -1324,6 +1333,7 @@ private: bool _write_kdms_to_disk; bool _email_kdms; dcp::Formulation _default_kdm_type; + RoughDuration _default_kdm_duration; double _auto_crop_threshold; static int const _current_version; diff --git a/src/lib/rough_duration.cc b/src/lib/rough_duration.cc new file mode 100644 index 000000000..e6c03126c --- /dev/null +++ b/src/lib/rough_duration.cc @@ -0,0 +1,79 @@ +/* + Copyright (C) 2022 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + + +#include "dcpomatic_assert.h" +#include "rough_duration.h" +#include +#include +LIBDCP_DISABLE_WARNINGS +#include +LIBDCP_ENABLE_WARNINGS + + +using std::string; + + +RoughDuration::RoughDuration (cxml::ConstNodePtr node) + : duration(dcp::raw_convert(node->content())) +{ + auto const unit_name = node->string_attribute("unit"); + if (unit_name == "days") { + unit = Unit::DAYS; + } else if (unit_name == "weeks") { + unit = Unit::WEEKS; + } else if (unit_name == "months") { + unit = Unit::MONTHS; + } else if (unit_name == "years") { + unit = Unit::YEARS; + } else { + DCPOMATIC_ASSERT (false); + } +} + + +void +RoughDuration::as_xml (xmlpp::Element* node) const +{ + node->add_child_text(dcp::raw_convert(duration)); + + switch (unit) { + case Unit::DAYS: + node->set_attribute("unit", "days"); + break; + case Unit::WEEKS: + node->set_attribute("unit", "weeks"); + break; + case Unit::MONTHS: + node->set_attribute("unit", "months"); + break; + case Unit::YEARS: + node->set_attribute("unit", "years"); + break; + } +} + + +bool +operator== (RoughDuration const& a, RoughDuration const& b) +{ + return a.duration == b.duration && a.unit == b.unit; +} + diff --git a/src/lib/rough_duration.h b/src/lib/rough_duration.h new file mode 100644 index 000000000..d9f452e53 --- /dev/null +++ b/src/lib/rough_duration.h @@ -0,0 +1,56 @@ +/* + Copyright (C) 2022 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + + +#include + + +namespace xmlpp { + class Element; +} + + +class RoughDuration +{ +public: + enum class Unit { + DAYS, + WEEKS, + MONTHS, + YEARS + }; + + RoughDuration (int duration_, Unit unit_) + : duration(duration_) + , unit(unit_) + {} + + RoughDuration (cxml::ConstNodePtr node); + + void as_xml (xmlpp::Element* node) const; + + int duration; + Unit unit; +}; + + +bool +operator== (RoughDuration const& a, RoughDuration const& b); + diff --git a/src/lib/wscript b/src/lib/wscript index 22fb144bc..b280aec4e 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -177,6 +177,7 @@ sources = """ transcode_job.cc trusted_device.cc types.cc + rough_duration.cc signal_manager.cc stdout_log.cc update_checker.cc diff --git a/src/wx/full_config_dialog.cc b/src/wx/full_config_dialog.cc index b14c642c8..a9618ce38 100644 --- a/src/wx/full_config_dialog.cc +++ b/src/wx/full_config_dialog.cc @@ -343,6 +343,14 @@ private: _kdm_type = new KDMChoice (_panel); table->Add (_kdm_type, 1, wxEXPAND); + add_label_to_sizer (table, _panel, _("Default KDM duration"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); + _kdm_duration = new wxSpinCtrl (_panel); + _kdm_duration_unit = new wxChoice (_panel, wxID_ANY); + auto kdm_duration_sizer = new wxBoxSizer (wxHORIZONTAL); + kdm_duration_sizer->Add (_kdm_duration, 0, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP); + kdm_duration_sizer->Add (_kdm_duration_unit, 0, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP); + table->Add (kdm_duration_sizer, 1, wxEXPAND); + table->Add (_use_isdcf_name_by_default = new CheckBox(_panel, _("Use ISDCF name by default")), 0, wxALIGN_CENTRE_VERTICAL); _still_length->SetRange (1, 3600); @@ -351,6 +359,13 @@ private: _directory->Bind (wxEVT_DIRPICKER_CHANGED, boost::bind (&DefaultsPage::directory_changed, this)); _kdm_directory->Bind (wxEVT_DIRPICKER_CHANGED, boost::bind (&DefaultsPage::kdm_directory_changed, this)); _kdm_type->Bind (wxEVT_CHOICE, boost::bind(&DefaultsPage::kdm_type_changed, this)); + _kdm_duration_unit->Append (_("days")); + _kdm_duration_unit->Append (_("weeks")); + _kdm_duration_unit->Append (_("months")); + _kdm_duration_unit->Append (_("years")); + + _kdm_duration->Bind (wxEVT_SPINCTRL, boost::bind(&DefaultsPage::kdm_duration_changed, this)); + _kdm_duration_unit->Bind (wxEVT_CHOICE, boost::bind(&DefaultsPage::kdm_duration_changed, this)); _use_isdcf_name_by_default->Bind (wxEVT_CHECKBOX, boost::bind(&DefaultsPage::use_isdcf_name_by_default_changed, this)); @@ -436,9 +451,51 @@ private: } } + checked_set (_kdm_duration, config->default_kdm_duration().duration); + switch (config->default_kdm_duration().unit) { + case RoughDuration::Unit::DAYS: + _kdm_duration->SetRange(1, 365); + checked_set (_kdm_duration_unit, 0); + break; + case RoughDuration::Unit::WEEKS: + _kdm_duration->SetRange(1, 52); + checked_set (_kdm_duration_unit, 1); + break; + case RoughDuration::Unit::MONTHS: + _kdm_duration->SetRange(1, 12); + checked_set (_kdm_duration_unit, 2); + break; + case RoughDuration::Unit::YEARS: + _kdm_duration->SetRange(1, 40); + checked_set (_kdm_duration_unit, 3); + break; + } + setup_sensitivity (); } + void kdm_duration_changed () + { + auto config = Config::instance(); + auto duration = _kdm_duration->GetValue(); + RoughDuration::Unit unit = RoughDuration::Unit::DAYS; + switch (_kdm_duration_unit->GetSelection()) { + case 0: + unit = RoughDuration::Unit::DAYS; + break; + case 1: + unit = RoughDuration::Unit::WEEKS; + break; + case 2: + unit = RoughDuration::Unit::MONTHS; + break; + case 3: + unit = RoughDuration::Unit::YEARS; + break; + } + config->set_default_kdm_duration (RoughDuration(duration, unit)); + } + void j2k_bandwidth_changed () { Config::instance()->set_default_j2k_bandwidth (_j2k_bandwidth->GetValue() * 1000000); @@ -531,6 +588,8 @@ private: wxDirPickerCtrl* _kdm_directory; #endif KDMChoice* _kdm_type; + wxSpinCtrl* _kdm_duration; + wxChoice* _kdm_duration_unit; wxCheckBox* _use_isdcf_name_by_default; wxChoice* _container; wxChoice* _dcp_content_type; diff --git a/src/wx/kdm_timing_panel.cc b/src/wx/kdm_timing_panel.cc index c5ecd1f1f..0fd00de93 100644 --- a/src/wx/kdm_timing_panel.cc +++ b/src/wx/kdm_timing_panel.cc @@ -18,35 +18,39 @@ */ + #include "kdm_timing_panel.h" #include "static_text.h" #include "time_picker.h" #include "wx_util.h" +#include "lib/config.h" #include LIBDCP_DISABLE_WARNINGS #include #include LIBDCP_ENABLE_WARNINGS + using std::cout; using boost::bind; + KDMTimingPanel::KDMTimingPanel (wxWindow* parent) : wxPanel (parent, wxID_ANY) { - wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); + auto overall_sizer = new wxBoxSizer (wxVERTICAL); #ifdef __WXGTK3__ /* wxDatePickerCtrl is too small with the GTK3 backend so we need to make it bigger with some fudge factors */ wxClientDC dc (parent); - wxSize size = dc.GetTextExtent (wxT("99/99/9999")); + auto size = dc.GetTextExtent(wxT("99/99/9999")); size.SetWidth (size.GetWidth() * 1.75); size.SetHeight (-1); #else - wxSize size = wxDefaultSize; + auto size = wxDefaultSize; #endif - wxSizer* table = new wxBoxSizer (wxHORIZONTAL); + auto table = new wxBoxSizer (wxHORIZONTAL); add_label_to_sizer (table, this, _("From"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); wxDateTime from; from.SetToCurrent (); @@ -67,9 +71,24 @@ KDMTimingPanel::KDMTimingPanel (wxWindow* parent) table->Add (_from_time, 0, wxALIGN_CENTER_VERTICAL); add_label_to_sizer (table, this, _("until"), false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); - wxDateTime to = from; - /* 1 week from now */ - to.Add (wxDateSpan (0, 0, 1, 0)); + auto to = from; + + auto const duration = Config::instance()->default_kdm_duration(); + switch (duration.unit) { + case RoughDuration::Unit::DAYS: + to.Add(wxDateSpan(0, 0, 0, duration.duration)); + break; + case RoughDuration::Unit::WEEKS: + to.Add(wxDateSpan(0, 0, duration.duration, 0)); + break; + case RoughDuration::Unit::MONTHS: + to.Add(wxDateSpan(0, duration.duration, 0, 0)); + break; + case RoughDuration::Unit::YEARS: + to.Add(wxDateSpan(duration.duration, 0, 0, 0)); + break; + } + _until_date = new wxDatePickerCtrl (this, wxID_ANY, to, wxDefaultPosition, size); #ifdef DCPOMATIC_OSX /* Hack to tweak alignment, which I can't get right by "proper" means for some reason */ @@ -110,34 +129,39 @@ KDMTimingPanel::KDMTimingPanel (wxWindow* parent) SetSizer (overall_sizer); } + boost::posix_time::ptime KDMTimingPanel::from () const { return posix_time (_from_date, _from_time); } + boost::posix_time::ptime KDMTimingPanel::posix_time (wxDatePickerCtrl* date_picker, TimePicker* time_picker) { - wxDateTime const date = date_picker->GetValue (); + auto const date = date_picker->GetValue (); return boost::posix_time::ptime ( boost::gregorian::date (date.GetYear(), date.GetMonth() + 1, date.GetDay()), boost::posix_time::time_duration (time_picker->hours(), time_picker->minutes(), 0) ); } + boost::posix_time::ptime KDMTimingPanel::until () const { return posix_time (_until_date, _until_time); } + bool KDMTimingPanel::valid () const { return until() > from(); } + void KDMTimingPanel::changed () const { diff --git a/test/data b/test/data index 4394355a9..6e7c48f62 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 4394355a9bc598774a0f438a6d44231b306db526 +Subproject commit 6e7c48f621574698db4dcf8021ab137c1f7eee2c