/*
- Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
#include "static_text.h"
#include "check_box.h"
#include "dcpomatic_button.h"
+#include "markers_dialog.h"
+#include "metadata_dialog.h"
#include "lib/ratio.h"
#include "lib/config.h"
#include "lib/dcp_content_type.h"
using std::make_pair;
using boost::lexical_cast;
using boost::shared_ptr;
+using boost::weak_ptr;
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)
+ , _metadata_dialog (0)
, _film (film)
+ , _viewer (viewer)
, _generally_sensitive (true)
{
_panel = new wxPanel (n);
_upload_after_make_dcp = new CheckBox (_panel, _("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);
_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 ()));
_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);
_grid->Add (_upload_after_make_dcp, wxGBPosition (r, 0), wxGBSpan (1, 2));
++r;
+
+ 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;
}
}
_film->set_upload_after_make_dcp (_upload_after_make_dcp->GetValue ());
}
+void
+DCPPanel::markers_clicked ()
+{
+ if (_markers_dialog) {
+ _markers_dialog->Destroy ();
+ _markers_dialog = 0;
+ }
+
+ _markers_dialog = new MarkersDialog (_panel, _film, _viewer);
+ _markers_dialog->Show();
+}
+
+void
+DCPPanel::metadata_clicked ()
+{
+ if (_metadata_dialog) {
+ _metadata_dialog->Destroy ();
+ _metadata_dialog = 0;
+ }
+
+ _metadata_dialog = new MetadataDialog (_panel, _film);
+ _metadata_dialog->Show ();
+}
+
void
DCPPanel::film_changed (int p)
{
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 ()) {
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 (_metadata_dialog) {
+ _metadata_dialog->Destroy ();
+ _metadata_dialog = 0;
+ }
_film = film;
_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);
+ _markers->Enable (_generally_sensitive && _film && !_film->interop());
+ _metadata->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());
_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);
+ }
}
}
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 Button (panel, _("Show audio..."));
_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();
+}