/*
- Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
#include "dcp_panel.h"
#include "wx_util.h"
-#include "key_dialog.h"
#include "isdcf_metadata_dialog.h"
#include "audio_dialog.h"
#include "focus_manager.h"
+#include "check_box.h"
+#include "static_text.h"
+#include "check_box.h"
+#include "dcpomatic_button.h"
+#include "markers_dialog.h"
+#include "interop_metadata_dialog.h"
+#include "smpte_metadata_dialog.h"
#include "lib/ratio.h"
#include "lib/config.h"
#include "lib/dcp_content_type.h"
#include "lib/dcp_content.h"
#include "lib/audio_content.h"
#include <dcp/locale_convert.h>
-#include <dcp/key.h>
#include <wx/wx.h>
#include <wx/notebook.h>
#include <wx/gbsizer.h>
using std::make_pair;
using boost::lexical_cast;
using boost::shared_ptr;
+using boost::weak_ptr;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
using dcp::locale_convert;
-DCPPanel::DCPPanel (wxNotebook* n, boost::shared_ptr<Film> film)
+DCPPanel::DCPPanel (wxNotebook* n, shared_ptr<Film> film, weak_ptr<FilmViewer> viewer)
: _audio_dialog (0)
+ , _markers_dialog (0)
+ , _interop_metadata_dialog (0)
+ , _smpte_metadata_dialog (0)
, _film (film)
+ , _viewer (viewer)
, _generally_sensitive (true)
{
_panel = new wxPanel (n);
_name = new wxTextCtrl (_panel, wxID_ANY);
FocusManager::instance()->add(_name);
- _use_isdcf_name = new wxCheckBox (_panel, wxID_ANY, _("Use ISDCF name"));
- _edit_isdcf_button = new wxButton (_panel, wxID_ANY, _("Details..."));
- _copy_isdcf_name_button = new wxButton (_panel, wxID_ANY, _("Copy as name"));
+ _use_isdcf_name = new CheckBox (_panel, _("Use ISDCF name"));
+ _edit_isdcf_button = new Button (_panel, _("Details..."));
+ _copy_isdcf_name_button = new Button (_panel, _("Copy as name"));
/* wxST_ELLIPSIZE_MIDDLE works around a bug in GTK2 and/or wxWidgets, see
http://trac.wxwidgets.org/ticket/12539
*/
- _dcp_name = new wxStaticText (
- _panel, wxID_ANY, wxT (""), wxDefaultPosition, wxDefaultSize,
+ _dcp_name = new StaticText (
+ _panel, wxT (""), wxDefaultPosition, wxDefaultSize,
wxALIGN_CENTRE_HORIZONTAL | wxST_NO_AUTORESIZE | wxST_ELLIPSIZE_MIDDLE
);
_dcp_content_type_label = create_label (_panel, _("Content Type"), true);
_dcp_content_type = new wxChoice (_panel, wxID_ANY);
- _signed = new wxCheckBox (_panel, wxID_ANY, _("Signed"));
- _encrypted = new wxCheckBox (_panel, wxID_ANY, _("Encrypted"));
+ _encrypted = new CheckBox (_panel, _("Encrypted"));
wxClientDC dc (_panel);
wxSize size = dc.GetTextExtent (wxT ("GGGGGGGG..."));
size.SetHeight (-1);
- _key_label = create_label (_panel, _("Key"), true);
- _key = new wxStaticText (_panel, wxID_ANY, "", wxDefaultPosition, size);
- _edit_key = new wxButton (_panel, wxID_ANY, _("Edit..."));
-
_reels_label = create_label (_panel, _("Reels"), true);
_reel_type = new wxChoice (_panel, wxID_ANY);
_standard_label = create_label (_panel, _("Standard"), true);
_standard = new wxChoice (_panel, wxID_ANY);
- _upload_after_make_dcp = new wxCheckBox (_panel, wxID_ANY, _("Upload DCP to TMS after it is made"));
+ _markers = new Button (_panel, _("Markers..."));
+ _metadata = new Button (_panel, _("Metadata..."));
_notebook = new wxNotebook (_panel, wxID_ANY);
_sizer->Add (_notebook, 1, wxEXPAND | wxTOP, 6);
_edit_isdcf_button->Bind (wxEVT_BUTTON, boost::bind (&DCPPanel::edit_isdcf_button_clicked, this));
_copy_isdcf_name_button->Bind(wxEVT_BUTTON, boost::bind (&DCPPanel::copy_isdcf_name_button_clicked, this));
_dcp_content_type->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::dcp_content_type_changed, this));
- _signed->Bind (wxEVT_CHECKBOX, boost::bind (&DCPPanel::signed_toggled, this));
_encrypted->Bind (wxEVT_CHECKBOX, boost::bind (&DCPPanel::encrypted_toggled, this));
- _edit_key->Bind (wxEVT_BUTTON, boost::bind (&DCPPanel::edit_key_clicked, this));
_reel_type->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::reel_type_changed, this));
_reel_length->Bind (wxEVT_SPINCTRL, boost::bind (&DCPPanel::reel_length_changed, this));
_standard->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::standard_changed, this));
- _upload_after_make_dcp->Bind (wxEVT_CHECKBOX, boost::bind (&DCPPanel::upload_after_make_dcp_changed, this));
+ _markers->Bind (wxEVT_BUTTON, boost::bind (&DCPPanel::markers_clicked, this));
+ _metadata->Bind (wxEVT_BUTTON, boost::bind (&DCPPanel::metadata_clicked, this));
BOOST_FOREACH (DCPContentType const * i, DCPContentType::all()) {
_dcp_content_type->Append (std_to_wx (i->pretty_name ()));
_grid->Add (_dcp_content_type, wxGBPosition (r, 1));
++r;
- _signed->Show (full);
- if (full) {
- _grid->Add (_signed, wxGBPosition (r, 0), wxGBSpan (1, 2));
- ++r;
- }
-
_grid->Add (_encrypted, wxGBPosition (r, 0), wxGBSpan (1, 2));
++r;
- _key_label->Show (full);
- _key->Show (full);
- _edit_key->Show (full);
_reels_label->Show (full);
_reel_type->Show (full);
_reel_length_label->Show (full);
_reel_length_gb_label->Show (full);
_standard_label->Show (full);
_standard->Show (full);
- _upload_after_make_dcp->Show (full);
+ _markers->Show (full);
+ _metadata->Show (full);
_reencode_j2k->Show (full);
_encrypted->Show (full);
if (full) {
- add_label_to_sizer (_grid, _key_label, true, wxGBPosition (r, 0));
- {
- wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
- s->Add (_key, 1, wxALIGN_CENTER_VERTICAL);
- s->Add (_edit_key);
- _grid->Add (s, wxGBPosition (r, 1));
- }
- ++r;
-
add_label_to_sizer (_grid, _reels_label, true, wxGBPosition (r, 0));
_grid->Add (_reel_type, wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
++r;
_grid->Add (_standard, wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
++r;
- _grid->Add (_upload_after_make_dcp, wxGBPosition (r, 0), wxGBSpan (1, 2));
+ wxBoxSizer* extra = new wxBoxSizer (wxHORIZONTAL);
+ extra->Add (_markers, 1, wxRIGHT, DCPOMATIC_SIZER_X_GAP);
+ extra->Add (_metadata, 1, wxRIGHT, DCPOMATIC_SIZER_X_GAP);
+ _grid->Add (extra, wxGBPosition(r, 0), wxGBSpan(1, 2));
++r;
}
}
-void
-DCPPanel::edit_key_clicked ()
-{
- KeyDialog* d = new KeyDialog (_panel, _film->key ());
- if (d->ShowModal () == wxID_OK) {
- _film->set_key (d->key ());
- }
- d->Destroy ();
-}
-
void
DCPPanel::name_changed ()
{
_film->set_j2k_bandwidth (_j2k_bandwidth->GetValue() * 1000000);
}
-void
-DCPPanel::signed_toggled ()
-{
- if (!_film) {
- return;
- }
-
- _film->set_signed (_signed->GetValue ());
-}
-
void
DCPPanel::encrypted_toggled ()
{
}
_film->set_video_frame_rate (
- boost::lexical_cast<int> (
- wx_to_std (_frame_rate_choice->GetString (_frame_rate_choice->GetSelection ()))
- )
+ boost::lexical_cast<int>(
+ wx_to_std(_frame_rate_choice->GetString(_frame_rate_choice->GetSelection()))
+ ),
+ true
);
}
}
void
-DCPPanel::upload_after_make_dcp_changed ()
+DCPPanel::markers_clicked ()
{
- if (!_film) {
- return;
+ if (_markers_dialog) {
+ _markers_dialog->Destroy ();
+ _markers_dialog = 0;
}
- _film->set_upload_after_make_dcp (_upload_after_make_dcp->GetValue ());
+ _markers_dialog = new MarkersDialog (_panel, _film, _viewer);
+ _markers_dialog->Show();
+}
+
+void
+DCPPanel::metadata_clicked ()
+{
+ if (_film->interop()) {
+ if (_interop_metadata_dialog) {
+ _interop_metadata_dialog->Destroy ();
+ _interop_metadata_dialog = 0;
+ }
+
+ _interop_metadata_dialog = new InteropMetadataDialog (_panel, _film);
+ _interop_metadata_dialog->Show ();
+ } else {
+ if (_smpte_metadata_dialog) {
+ _smpte_metadata_dialog->Destroy ();
+ _smpte_metadata_dialog = 0;
+ }
+
+ _smpte_metadata_dialog = new SMPTEMetadataDialog (_panel, _film);
+ _smpte_metadata_dialog->Show ();
+ }
}
void
checked_set (_dcp_content_type, DCPContentType::as_index (_film->dcp_content_type ()));
setup_dcp_name ();
break;
- case Film::SIGNED:
- checked_set (_signed, _film->is_signed ());
- break;
case Film::ENCRYPTED:
checked_set (_encrypted, _film->encrypted ());
- if (_film->encrypted ()) {
- _film->set_signed (true);
- _signed->Enable (false);
- _key->Enable (_generally_sensitive);
- _edit_key->Enable (_generally_sensitive);
- } else {
- _signed->Enable (_generally_sensitive);
- _key->Enable (false);
- _edit_key->Enable (false);
- }
- break;
- case Film::KEY:
- checked_set (_key, _film->key().hex().substr (0, 8) + "...");
break;
case Film::RESOLUTION:
checked_set (_resolution, _film->resolution() == RESOLUTION_2K ? 0 : 1);
case Film::USE_ISDCF_NAME:
{
checked_set (_use_isdcf_name, _film->use_isdcf_name ());
+ if (_film->use_isdcf_name()) {
+ /* We are going back to using an ISDCF name. Remove anything after a _ in the current name,
+ in case the user has clicked 'Copy as name' then re-ticked 'Use ISDCF name' (#1513).
+ */
+ string const name = _film->name ();
+ string::size_type const u = name.find("_");
+ if (u != string::npos) {
+ _film->set_name (name.substr(0, u));
+ }
+ }
setup_dcp_name ();
_edit_isdcf_button->Enable (_film->use_isdcf_name ());
break;
case Film::INTEROP:
checked_set (_standard, _film->interop() ? 1 : 0);
setup_dcp_name ();
+ _markers->Enable (!_film->interop());
break;
case Film::AUDIO_PROCESSOR:
if (_film->audio_processor ()) {
case Film::REEL_LENGTH:
checked_set (_reel_length, _film->reel_length() / 1000000000LL);
break;
- case Film::UPLOAD_AFTER_MAKE_DCP:
- checked_set (_upload_after_make_dcp, _film->upload_after_make_dcp ());
- break;
case Film::CONTENT:
setup_dcp_name ();
+ setup_sensitivity ();
break;
default:
break;
void
DCPPanel::set_film (shared_ptr<Film> film)
{
- /* We are changing film, so destroy any audio dialog for the old one */
+ /* We are changing film, so destroy any dialogs for the old one */
if (_audio_dialog) {
_audio_dialog->Destroy ();
_audio_dialog = 0;
}
+ if (_markers_dialog) {
+ _markers_dialog->Destroy ();
+ _markers_dialog = 0;
+ }
+ if (_interop_metadata_dialog) {
+ _interop_metadata_dialog->Destroy ();
+ _interop_metadata_dialog = 0;
+ }
+ if (_smpte_metadata_dialog) {
+ _smpte_metadata_dialog->Destroy ();
+ _smpte_metadata_dialog = 0;
+ }
_film = film;
+ if (!_film) {
+ /* Really should all the film_changed below but this might be enough */
+ checked_set (_dcp_name, wxT(""));
+ set_general_sensitivity (false);
+ return;
+ }
+
film_changed (Film::NAME);
film_changed (Film::USE_ISDCF_NAME);
film_changed (Film::CONTENT);
film_changed (Film::DCP_CONTENT_TYPE);
film_changed (Film::CONTAINER);
film_changed (Film::RESOLUTION);
- film_changed (Film::SIGNED);
film_changed (Film::ENCRYPTED);
- film_changed (Film::KEY);
film_changed (Film::J2K_BANDWIDTH);
film_changed (Film::ISDCF_METADATA);
film_changed (Film::VIDEO_FRAME_RATE);
film_changed (Film::AUDIO_PROCESSOR);
film_changed (Film::REEL_TYPE);
film_changed (Film::REEL_LENGTH);
- film_changed (Film::UPLOAD_AFTER_MAKE_DCP);
film_changed (Film::REENCODE_J2K);
set_general_sensitivity(static_cast<bool>(_film));
_edit_isdcf_button->Enable (_generally_sensitive);
_dcp_content_type->Enable (_generally_sensitive);
_copy_isdcf_name_button->Enable (_generally_sensitive);
-
- bool si = _generally_sensitive;
- if (_film && _film->encrypted ()) {
- si = false;
- }
- _signed->Enable (si);
-
_encrypted->Enable (_generally_sensitive);
- _key->Enable (_generally_sensitive && _film && _film->encrypted ());
- _edit_key->Enable (_generally_sensitive && _film && _film->encrypted ());
_reel_type->Enable (_generally_sensitive && _film && !_film->references_dcp_video() && !_film->references_dcp_audio());
_reel_length->Enable (_generally_sensitive && _film && _film->reel_type() == REELTYPE_BY_LENGTH);
- _upload_after_make_dcp->Enable (_generally_sensitive);
- _frame_rate_choice->Enable (_generally_sensitive && _film && !_film->references_dcp_video());
- _frame_rate_spin->Enable (_generally_sensitive && _film && !_film->references_dcp_video());
- _audio_channels->Enable (_generally_sensitive && _film && !_film->references_dcp_audio());
+ _markers->Enable (_generally_sensitive && _film && !_film->interop());
+ _metadata->Enable (_generally_sensitive);
+ _frame_rate_choice->Enable (_generally_sensitive && _film && !_film->references_dcp_video() && !_film->contains_atmos_content());
+ _frame_rate_spin->Enable (_generally_sensitive && _film && !_film->references_dcp_video() && !_film->contains_atmos_content());
+ _audio_channels->Enable (_generally_sensitive && _film && !_film->references_dcp_audio() && !_film->contains_atmos_content());
_audio_processor->Enable (_generally_sensitive && _film && !_film->references_dcp_audio());
_j2k_bandwidth->Enable (_generally_sensitive && _film && !_film->references_dcp_video());
_container->Enable (_generally_sensitive && _film && !_film->references_dcp_video());
- _best_frame_rate->Enable (_generally_sensitive && _film && _film->best_video_frame_rate () != _film->video_frame_rate ());
+ _best_frame_rate->Enable (
+ _generally_sensitive &&
+ _film &&
+ _film->best_video_frame_rate () != _film->video_frame_rate() &&
+ !_film->references_dcp_video() &&
+ !_film->contains_atmos_content()
+ );
_resolution->Enable (_generally_sensitive && _film && !_film->references_dcp_video());
_three_d->Enable (_generally_sensitive && _film && !_film->references_dcp_video());
- _standard->Enable (_generally_sensitive && _film && !_film->references_dcp_video() && !_film->references_dcp_audio());
+
+ _standard->Enable (
+ _generally_sensitive &&
+ _film &&
+ !_film->references_dcp_video() &&
+ !_film->references_dcp_audio() &&
+ !_film->contains_atmos_content()
+ );
+
+ _reencode_j2k->Enable (_generally_sensitive && _film);
+ _show_audio->Enable (_generally_sensitive && _film);
}
void
_audio_grid->Clear ();
add_audio_panel_to_grid ();
_audio_grid->Layout ();
+ } else if (p == Config::SHOW_EXPERIMENTAL_AUDIO_PROCESSORS) {
+ _audio_processor->Clear ();
+ add_audio_processors ();
+ if (_film) {
+ film_changed (Film::AUDIO_PROCESSOR);
+ }
}
}
_frame_rate_choice->Show ();
_frame_rate_spin->Hide ();
}
-
- _frame_rate_sizer->Layout ();
}
wxPanel *
_container_label = create_label (panel, _("Container"), true);
_container = new wxChoice (panel, wxID_ANY);
- _container_size = new wxStaticText (panel, wxID_ANY, wxT (""));
+ _container_size = new StaticText (panel, wxT (""));
_resolution_label = create_label (panel, _("Resolution"), true);
_resolution = new wxChoice (panel, wxID_ANY);
_frame_rate_label = create_label (panel, _("Frame Rate"), true);
_frame_rate_choice = new wxChoice (panel, wxID_ANY);
- _frame_rate_sizer = new wxBoxSizer (wxHORIZONTAL);
- _frame_rate_sizer->Add (_frame_rate_choice, 1, wxALIGN_CENTER_VERTICAL);
_frame_rate_spin = new wxSpinCtrl (panel, wxID_ANY);
- _frame_rate_sizer->Add (_frame_rate_spin, 1, wxALIGN_CENTER_VERTICAL);
setup_frame_rate_widget ();
- _best_frame_rate = new wxButton (panel, wxID_ANY, _("Use best"));
- _frame_rate_sizer->Add (_best_frame_rate, 1, wxALIGN_CENTER_VERTICAL);
+ _best_frame_rate = new Button (panel, _("Use best"));
- _three_d = new wxCheckBox (panel, wxID_ANY, _("3D"));
+ _three_d = new CheckBox (panel, _("3D"));
_j2k_bandwidth_label = create_label (panel, _("JPEG2000 bandwidth\nfor newly-encoded data"), true);
_j2k_bandwidth = new wxSpinCtrl (panel, wxID_ANY);
_mbits_label = create_label (panel, _("Mbit/s"), false);
- _reencode_j2k = new wxCheckBox (panel, wxID_ANY, _("Re-encode JPEG2000 data from input"));
+ _reencode_j2k = new CheckBox (panel, _("Re-encode JPEG2000 data from input"));
_container->Bind (wxEVT_CHOICE, boost::bind(&DCPPanel::container_changed, this));
_frame_rate_choice->Bind (wxEVT_CHOICE, boost::bind(&DCPPanel::frame_rate_choice_changed, this));
_frame_rate_sizer = new wxBoxSizer (wxHORIZONTAL);
_frame_rate_sizer->Add (_frame_rate_choice, 1, wxALIGN_CENTER_VERTICAL);
_frame_rate_sizer->Add (_frame_rate_spin, 1, wxALIGN_CENTER_VERTICAL);
- _frame_rate_sizer->Add (_best_frame_rate, 1, wxALIGN_CENTER_VERTICAL);
+ _frame_rate_sizer->Add (_best_frame_rate, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
_video_grid->Add (_frame_rate_sizer, wxGBPosition (r, 1));
++r;
}
DCPPanel::make_audio_panel ()
{
wxPanel* panel = new wxPanel (_notebook);
- wxSizer* sizer = new wxBoxSizer (wxVERTICAL);
+ _audio_panel_sizer = new wxBoxSizer (wxVERTICAL);
_audio_grid = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
- sizer->Add (_audio_grid, 0, wxALL, 8);
- panel->SetSizer (sizer);
+ _audio_panel_sizer->Add (_audio_grid, 0, wxALL, 8);
+ panel->SetSizer (_audio_panel_sizer);
_channels_label = create_label (panel, _("Channels"), true);
_audio_channels = new wxChoice (panel, wxID_ANY);
_processor_label = create_label (panel, _("Processor"), true);
_audio_processor = new wxChoice (panel, wxID_ANY);
- _audio_processor->Append (_("None"), new wxStringClientData (N_("none")));
- BOOST_FOREACH (AudioProcessor const * ap, AudioProcessor::all ()) {
- _audio_processor->Append (std_to_wx (ap->name ()), new wxStringClientData (std_to_wx (ap->id ())));
- }
+ add_audio_processors ();
- _show_audio = new wxButton (panel, wxID_ANY, _("Show audio..."));
+ _show_audio = new Button (panel, _("Show audio..."));
_audio_channels->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::audio_channels_changed, this));
_audio_processor->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::audio_processor_changed, this));
_audio_dialog = 0;
}
- AudioDialog* d = new AudioDialog (_panel, _film);
+ AudioDialog* d = new AudioDialog (_panel, _film, _viewer);
d->Show ();
}
_film->set_reel_length (_reel_length->GetValue() * 1000000000LL);
}
+
+void
+DCPPanel::add_audio_processors ()
+{
+ _audio_processor->Append (_("None"), new wxStringClientData (N_("none")));
+ BOOST_FOREACH (AudioProcessor const * ap, AudioProcessor::visible()) {
+ _audio_processor->Append (std_to_wx(ap->name()), new wxStringClientData(std_to_wx(ap->id())));
+ }
+ _audio_panel_sizer->Layout();
+}