Display only required tabs, including subs / ccap.
[dcpomatic.git] / src / wx / caption_panel.cc
index c4a71677b9ef79323cfc058627ddc1a4138e3a4f..3957c2a457b3b9937e8ca8c945edbefd37ee7107 100644 (file)
 #include "caption_panel.h"
 #include "film_editor.h"
 #include "wx_util.h"
-#include "subtitle_view.h"
+#include "caption_view.h"
 #include "content_panel.h"
 #include "fonts_dialog.h"
-#include "subtitle_appearance_dialog.h"
+#include "caption_appearance_dialog.h"
 #include "lib/ffmpeg_content.h"
-#include "lib/plain_text_file_content.h"
+#include "lib/text_caption_file_content.h"
 #include "lib/ffmpeg_subtitle_stream.h"
-#include "lib/dcp_text_content.h"
-#include "lib/plain_text_file_decoder.h"
-#include "lib/dcp_text_decoder.h"
+#include "lib/dcp_subtitle_content.h"
+#include "lib/text_caption_file_decoder.h"
+#include "lib/dcp_subtitle_decoder.h"
 #include "lib/dcp_content.h"
-#include "lib/text_content.h"
+#include "lib/caption_content.h"
 #include "lib/decoder_factory.h"
 #include <wx/spinctrl.h>
 #include <boost/foreach.hpp>
@@ -43,10 +43,11 @@ using std::list;
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
 
-CaptionPanel::CaptionPanel (ContentPanel* p)
-       : ContentSubPanel (p, _("Captions"))
-       , _subtitle_view (0)
+CaptionPanel::CaptionPanel (ContentPanel* p, CaptionType t)
+       : ContentSubPanel (p, std_to_wx(caption_type_to_name(t)))
+       , _caption_view (0)
        , _fonts_dialog (0)
+       , _original_type (t)
 {
        wxBoxSizer* reference_sizer = new wxBoxSizer (wxVERTICAL);
 
@@ -144,8 +145,8 @@ CaptionPanel::CaptionPanel (ContentPanel* p)
        {
                wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
 
-               _subtitle_view_button = new wxButton (this, wxID_ANY, _("View..."));
-               s->Add (_subtitle_view_button, 1, wxALL, DCPOMATIC_SIZER_GAP);
+               _caption_view_button = new wxButton (this, wxID_ANY, _("View..."));
+               s->Add (_caption_view_button, 1, wxALL, DCPOMATIC_SIZER_GAP);
                _fonts_dialog_button = new wxButton (this, wxID_ANY, _("Fonts..."));
                s->Add (_fonts_dialog_button, 1, wxALL, DCPOMATIC_SIZER_GAP);
                _appearance_dialog_button = new wxButton (this, wxID_ANY, _("Appearance..."));
@@ -163,7 +164,7 @@ CaptionPanel::CaptionPanel (ContentPanel* p)
 
        _reference->Bind                (wxEVT_CHECKBOX, boost::bind (&CaptionPanel::reference_clicked, this));
        _use->Bind                      (wxEVT_CHECKBOX, boost::bind (&CaptionPanel::use_toggled, this));
-       _type->Bind                     (wxEVT_CHOICE,   boost::bind (&CaptionPanel::type_changed, this));
+       _type->Bind              (wxEVT_CHOICE,   boost::bind (&CaptionPanel::type_changed, this));
        _burn->Bind                     (wxEVT_CHECKBOX, boost::bind (&CaptionPanel::burn_toggled, this));
        _x_offset->Bind                 (wxEVT_SPINCTRL, boost::bind (&CaptionPanel::x_offset_changed, this));
        _y_offset->Bind                 (wxEVT_SPINCTRL, boost::bind (&CaptionPanel::y_offset_changed, this));
@@ -172,7 +173,7 @@ CaptionPanel::CaptionPanel (ContentPanel* p)
        _line_spacing->Bind             (wxEVT_SPINCTRL, boost::bind (&CaptionPanel::line_spacing_changed, this));
        _language->Bind                 (wxEVT_TEXT,     boost::bind (&CaptionPanel::language_changed, this));
        _stream->Bind                   (wxEVT_CHOICE,   boost::bind (&CaptionPanel::stream_changed, this));
-       _subtitle_view_button->Bind     (wxEVT_BUTTON,   boost::bind (&CaptionPanel::subtitle_view_clicked, this));
+       _caption_view_button->Bind      (wxEVT_BUTTON,   boost::bind (&CaptionPanel::caption_view_clicked, this));
        _fonts_dialog_button->Bind      (wxEVT_BUTTON,   boost::bind (&CaptionPanel::fonts_dialog_clicked, this));
        _appearance_dialog_button->Bind (wxEVT_BUTTON,   boost::bind (&CaptionPanel::appearance_dialog_clicked, this));
 }
@@ -189,7 +190,7 @@ void
 CaptionPanel::film_content_changed (int property)
 {
        FFmpegContentList fc = _parent->selected_ffmpeg ();
-       ContentList sc = _parent->selected_subtitle ();
+       ContentList sc = _parent->selected_caption ();
 
        shared_ptr<FFmpegContent> fcs;
        if (fc.size() == 1) {
@@ -201,6 +202,11 @@ CaptionPanel::film_content_changed (int property)
                scs = sc.front ();
        }
 
+       shared_ptr<CaptionContent> caption;
+       if (scs) {
+               caption = scs->caption_of_original_type(_original_type);
+       }
+
        if (property == FFmpegContentProperty::SUBTITLE_STREAMS) {
                _stream->Clear ();
                if (fcs) {
@@ -216,16 +222,16 @@ CaptionPanel::film_content_changed (int property)
                        }
                }
                setup_sensitivity ();
-       } else if (property == TextContentProperty::USE) {
-               checked_set (_use, scs ? scs->subtitle->use() : false);
+       } else if (property == CaptionContentProperty::USE) {
+               checked_set (_use, caption ? caption->use() : false);
                setup_sensitivity ();
-       } else if (property == TextContentProperty::TYPE) {
-               if (scs) {
-                       switch (scs->subtitle->type()) {
-                       case TEXT_SUBTITLE:
+       } else if (property == CaptionContentProperty::TYPE) {
+               if (caption) {
+                       switch (caption->type()) {
+                       case CAPTION_OPEN:
                                _type->SetSelection (0);
                                break;
-                       case TEXT_CLOSED_CAPTION:
+                       case CAPTION_CLOSED:
                                _type->SetSelection (1);
                                break;
                        default:
@@ -235,30 +241,30 @@ CaptionPanel::film_content_changed (int property)
                        _type->SetSelection (0);
                }
                setup_sensitivity ();
-       } else if (property == TextContentProperty::BURN) {
-               checked_set (_burn, scs ? scs->subtitle->burn() : false);
-       } else if (property == TextContentProperty::X_OFFSET) {
-               checked_set (_x_offset, scs ? lrint (scs->subtitle->x_offset() * 100) : 0);
-       } else if (property == TextContentProperty::Y_OFFSET) {
-               checked_set (_y_offset, scs ? lrint (scs->subtitle->y_offset() * 100) : 0);
-       } else if (property == TextContentProperty::X_SCALE) {
-               checked_set (_x_scale, scs ? lrint (scs->subtitle->x_scale() * 100) : 100);
-       } else if (property == TextContentProperty::Y_SCALE) {
-               checked_set (_y_scale, scs ? lrint (scs->subtitle->y_scale() * 100) : 100);
-       } else if (property == TextContentProperty::LINE_SPACING) {
-               checked_set (_line_spacing, scs ? lrint (scs->subtitle->line_spacing() * 100) : 100);
-       } else if (property == TextContentProperty::LANGUAGE) {
-               checked_set (_language, scs ? scs->subtitle->language() : "");
-       } else if (property == DCPContentProperty::REFERENCE_SUBTITLE) {
+       } else if (property == CaptionContentProperty::BURN) {
+               checked_set (_burn, caption ? caption->burn() : false);
+       } else if (property == CaptionContentProperty::X_OFFSET) {
+               checked_set (_x_offset, caption ? lrint (caption->x_offset() * 100) : 0);
+       } else if (property == CaptionContentProperty::Y_OFFSET) {
+               checked_set (_y_offset, caption ? lrint (caption->y_offset() * 100) : 0);
+       } else if (property == CaptionContentProperty::X_SCALE) {
+               checked_set (_x_scale, caption ? lrint (caption->x_scale() * 100) : 100);
+       } else if (property == CaptionContentProperty::Y_SCALE) {
+               checked_set (_y_scale, caption ? lrint (caption->y_scale() * 100) : 100);
+       } else if (property == CaptionContentProperty::LINE_SPACING) {
+               checked_set (_line_spacing, caption ? lrint (caption->line_spacing() * 100) : 100);
+       } else if (property == CaptionContentProperty::LANGUAGE) {
+               checked_set (_language, caption ? caption->language() : "");
+       } else if (property == DCPContentProperty::REFERENCE_CAPTION) {
                if (scs) {
                        shared_ptr<DCPContent> dcp = dynamic_pointer_cast<DCPContent> (scs);
-                       checked_set (_reference, dcp ? dcp->reference_subtitle () : false);
+                       checked_set (_reference, dcp ? dcp->reference_caption(_original_type) : false);
                } else {
                        checked_set (_reference, false);
                }
 
                setup_sensitivity ();
-       } else if (property == DCPContentProperty::HAS_SUBTITLES) {
+       } else if (property == DCPContentProperty::CAPTIONS) {
                setup_sensitivity ();
        }
 }
@@ -266,21 +272,21 @@ CaptionPanel::film_content_changed (int property)
 void
 CaptionPanel::use_toggled ()
 {
-       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_subtitle ()) {
-               i->subtitle->set_use (_use->GetValue());
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_caption()) {
+               i->caption_of_original_type(_original_type)->set_use (_use->GetValue());
        }
 }
 
 void
 CaptionPanel::type_changed ()
 {
-       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_subtitle()) {
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_caption()) {
                switch (_type->GetSelection()) {
                case 0:
-                       i->subtitle->set_type (TEXT_SUBTITLE);
+                       i->caption_of_original_type(_original_type)->set_type (CAPTION_OPEN);
                        break;
                case 1:
-                       i->subtitle->set_type (TEXT_CLOSED_CAPTION);
+                       i->caption_of_original_type(_original_type)->set_type (CAPTION_CLOSED);
                        break;
                }
        }
@@ -289,8 +295,8 @@ CaptionPanel::type_changed ()
 void
 CaptionPanel::burn_toggled ()
 {
-       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_subtitle ()) {
-               i->subtitle->set_burn (_burn->GetValue());
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_caption ()) {
+               i->caption_of_original_type(_original_type)->set_burn (_burn->GetValue());
        }
 }
 
@@ -299,15 +305,15 @@ CaptionPanel::setup_sensitivity ()
 {
        int any_subs = 0;
        int ffmpeg_subs = 0;
-       ContentList sel = _parent->selected_subtitle ();
+       ContentList sel = _parent->selected_caption ();
        BOOST_FOREACH (shared_ptr<Content> i, sel) {
                /* These are the content types that could include subtitles */
                shared_ptr<const FFmpegContent> fc = boost::dynamic_pointer_cast<const FFmpegContent> (i);
-               shared_ptr<const PlainTextFileContent> sc = boost::dynamic_pointer_cast<const PlainTextFileContent> (i);
+               shared_ptr<const TextCaptionFileContent> sc = boost::dynamic_pointer_cast<const TextCaptionFileContent> (i);
                shared_ptr<const DCPContent> dc = boost::dynamic_pointer_cast<const DCPContent> (i);
-               shared_ptr<const DCPTextContent> dsc = boost::dynamic_pointer_cast<const DCPTextContent> (i);
+               shared_ptr<const DCPSubtitleContent> dsc = boost::dynamic_pointer_cast<const DCPSubtitleContent> (i);
                if (fc) {
-                       if (fc->subtitle) {
+                       if (!fc->caption.empty()) {
                                ++ffmpeg_subs;
                                ++any_subs;
                        }
@@ -325,7 +331,7 @@ CaptionPanel::setup_sensitivity ()
        }
 
        string why_not;
-       bool const can_reference = dcp && dcp->can_reference_subtitle (why_not);
+       bool const can_reference = dcp && dcp->can_reference_caption (_original_type, why_not);
        setup_refer_button (_reference, _reference_note, dcp, can_reference, why_not);
 
        bool const reference = _reference->GetValue ();
@@ -342,7 +348,7 @@ CaptionPanel::setup_sensitivity ()
        _line_spacing->Enable (!reference && use);
        _language->Enable (!reference && any_subs > 0 && use);
        _stream->Enable (!reference && ffmpeg_subs == 1);
-       _subtitle_view_button->Enable (!reference);
+       _caption_view_button->Enable (!reference);
        _fonts_dialog_button->Enable (!reference);
        _appearance_dialog_button->Enable (!reference && any_subs > 0 && use);
 }
@@ -372,49 +378,49 @@ CaptionPanel::stream_changed ()
 void
 CaptionPanel::x_offset_changed ()
 {
-       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_subtitle ()) {
-               i->subtitle->set_x_offset (_x_offset->GetValue() / 100.0);
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_caption ()) {
+               i->caption_of_original_type(_original_type)->set_x_offset (_x_offset->GetValue() / 100.0);
        }
 }
 
 void
 CaptionPanel::y_offset_changed ()
 {
-       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_subtitle ()) {
-               i->subtitle->set_y_offset (_y_offset->GetValue() / 100.0);
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_caption ()) {
+               i->caption_of_original_type(_original_type)->set_y_offset (_y_offset->GetValue() / 100.0);
        }
 }
 
 void
 CaptionPanel::x_scale_changed ()
 {
-       ContentList c = _parent->selected_subtitle ();
+       ContentList c = _parent->selected_caption ();
        if (c.size() == 1) {
-               c.front()->subtitle->set_x_scale (_x_scale->GetValue() / 100.0);
+               c.front()->caption_of_original_type(_original_type)->set_x_scale (_x_scale->GetValue() / 100.0);
        }
 }
 
 void
 CaptionPanel::y_scale_changed ()
 {
-       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_subtitle ()) {
-               i->subtitle->set_y_scale (_y_scale->GetValue() / 100.0);
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_caption ()) {
+               i->caption_of_original_type(_original_type)->set_y_scale (_y_scale->GetValue() / 100.0);
        }
 }
 
 void
 CaptionPanel::line_spacing_changed ()
 {
-       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_subtitle ()) {
-               i->subtitle->set_line_spacing (_line_spacing->GetValue() / 100.0);
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_caption ()) {
+               i->caption_of_original_type(_original_type)->set_line_spacing (_line_spacing->GetValue() / 100.0);
        }
 }
 
 void
 CaptionPanel::language_changed ()
 {
-       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_subtitle ()) {
-               i->subtitle->set_language (wx_to_std (_language->GetValue()));
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_caption ()) {
+               i->caption_of_original_type(_original_type)->set_language (wx_to_std (_language->GetValue()));
        }
 }
 
@@ -422,35 +428,35 @@ void
 CaptionPanel::content_selection_changed ()
 {
        film_content_changed (FFmpegContentProperty::SUBTITLE_STREAMS);
-       film_content_changed (TextContentProperty::USE);
-       film_content_changed (TextContentProperty::BURN);
-       film_content_changed (TextContentProperty::X_OFFSET);
-       film_content_changed (TextContentProperty::Y_OFFSET);
-       film_content_changed (TextContentProperty::X_SCALE);
-       film_content_changed (TextContentProperty::Y_SCALE);
-       film_content_changed (TextContentProperty::LINE_SPACING);
-       film_content_changed (TextContentProperty::LANGUAGE);
-       film_content_changed (TextContentProperty::FONTS);
-       film_content_changed (TextContentProperty::TYPE);
-       film_content_changed (DCPContentProperty::REFERENCE_SUBTITLE);
+       film_content_changed (CaptionContentProperty::USE);
+       film_content_changed (CaptionContentProperty::BURN);
+       film_content_changed (CaptionContentProperty::X_OFFSET);
+       film_content_changed (CaptionContentProperty::Y_OFFSET);
+       film_content_changed (CaptionContentProperty::X_SCALE);
+       film_content_changed (CaptionContentProperty::Y_SCALE);
+       film_content_changed (CaptionContentProperty::LINE_SPACING);
+       film_content_changed (CaptionContentProperty::LANGUAGE);
+       film_content_changed (CaptionContentProperty::FONTS);
+       film_content_changed (CaptionContentProperty::TYPE);
+       film_content_changed (DCPContentProperty::REFERENCE_CAPTION);
 }
 
 void
-CaptionPanel::subtitle_view_clicked ()
+CaptionPanel::caption_view_clicked ()
 {
-       if (_subtitle_view) {
-               _subtitle_view->Destroy ();
-               _subtitle_view = 0;
+       if (_caption_view) {
+               _caption_view->Destroy ();
+               _caption_view = 0;
        }
 
-       ContentList c = _parent->selected_subtitle ();
+       ContentList c = _parent->selected_caption ();
        DCPOMATIC_ASSERT (c.size() == 1);
 
        shared_ptr<Decoder> decoder = decoder_factory (c.front(), _parent->film()->log(), false);
 
        if (decoder) {
-               _subtitle_view = new SubtitleView (this, _parent->film(), c.front(), decoder, _parent->film_viewer());
-               _subtitle_view->Show ();
+               _caption_view = new CaptionView (this, _parent->film(), c.front(), c.front()->caption_of_original_type(_original_type), decoder, _parent->film_viewer());
+               _caption_view->Show ();
        }
 }
 
@@ -462,10 +468,10 @@ CaptionPanel::fonts_dialog_clicked ()
                _fonts_dialog = 0;
        }
 
-       ContentList c = _parent->selected_subtitle ();
+       ContentList c = _parent->selected_caption ();
        DCPOMATIC_ASSERT (c.size() == 1);
 
-       _fonts_dialog = new FontsDialog (this, c.front ());
+       _fonts_dialog = new FontsDialog (this, c.front(), c.front()->caption_of_original_type(_original_type));
        _fonts_dialog->Show ();
 }
 
@@ -482,16 +488,16 @@ CaptionPanel::reference_clicked ()
                return;
        }
 
-       d->set_reference_subtitle (_reference->GetValue ());
+       d->set_reference_caption (_original_type, _reference->GetValue ());
 }
 
 void
 CaptionPanel::appearance_dialog_clicked ()
 {
-       ContentList c = _parent->selected_subtitle ();
+       ContentList c = _parent->selected_caption ();
        DCPOMATIC_ASSERT (c.size() == 1);
 
-       SubtitleAppearanceDialog* d = new SubtitleAppearanceDialog (this, c.front());
+       CaptionAppearanceDialog* d = new CaptionAppearanceDialog (this, c.front(), c.front()->caption_of_original_type(_original_type));
        if (d->ShowModal () == wxID_OK) {
                d->apply ();
        }