Initial UI / backend storage.
authorCarl Hetherington <cth@carlh.net>
Thu, 11 Dec 2014 15:20:33 +0000 (15:20 +0000)
committerCarl Hetherington <cth@carlh.net>
Thu, 11 Dec 2014 15:20:33 +0000 (15:20 +0000)
src/lib/subtitle_content.cc
src/lib/subtitle_content.h
src/wx/subtitle_panel.cc
src/wx/subtitle_panel.h

index 5b370847ba08d2f2f156301f5864982f7820efae..7792f3ef6fafd7a8b9ed84963828e964558dbad9 100644 (file)
@@ -38,6 +38,7 @@ int const SubtitleContentProperty::SUBTITLE_Y_OFFSET = 501;
 int const SubtitleContentProperty::SUBTITLE_X_SCALE = 502;
 int const SubtitleContentProperty::SUBTITLE_Y_SCALE = 503;
 int const SubtitleContentProperty::USE_SUBTITLES = 504;
+int const SubtitleContentProperty::SUBTITLE_LANGUAGE = 505;
 
 SubtitleContent::SubtitleContent (shared_ptr<const Film> f)
        : Content (f)
@@ -88,6 +89,8 @@ SubtitleContent::SubtitleContent (shared_ptr<const Film> f, cxml::ConstNodePtr n
        } else {
                _subtitle_x_scale = _subtitle_y_scale = node->number_child<float> ("SubtitleScale");
        }
+
+       _subtitle_language = node->optional_string_child ("SubtitleLanguage");
 }
 
 SubtitleContent::SubtitleContent (shared_ptr<const Film> f, vector<shared_ptr<Content> > c)
@@ -125,6 +128,7 @@ SubtitleContent::SubtitleContent (shared_ptr<const Film> f, vector<shared_ptr<Co
        _subtitle_y_offset = ref->subtitle_y_offset ();
        _subtitle_x_scale = ref->subtitle_x_scale ();
        _subtitle_y_scale = ref->subtitle_y_scale ();
+       _subtitle_language = ref->subtitle_language ();
 }
 
 void
@@ -135,6 +139,9 @@ SubtitleContent::as_xml (xmlpp::Node* root) const
        root->add_child("SubtitleYOffset")->add_child_text (raw_convert<string> (_subtitle_y_offset));
        root->add_child("SubtitleXScale")->add_child_text (raw_convert<string> (_subtitle_x_scale));
        root->add_child("SubtitleYScale")->add_child_text (raw_convert<string> (_subtitle_y_scale));
+       if (_subtitle_language) {
+               root->add_child("SubtitleLanguage")->add_child_text (_subtitle_language.get ());
+       }
 }
 
 void
@@ -187,6 +194,16 @@ SubtitleContent::set_subtitle_y_scale (double s)
        signal_changed (SubtitleContentProperty::SUBTITLE_Y_SCALE);
 }
 
+void
+SubtitleContent::set_subtitle_language (string language)
+{
+       {
+               boost::mutex::scoped_lock lm (_mutex);
+               _subtitle_language = language;
+       }
+       signal_changed (SubtitleContentProperty::SUBTITLE_LANGUAGE);
+}
+
 string
 SubtitleContent::identifier () const
 {
@@ -197,5 +214,9 @@ SubtitleContent::identifier () const
          << "_" << raw_convert<string> (subtitle_x_offset())
          << "_" << raw_convert<string> (subtitle_y_offset());
 
+       /* The language is for metadata only, and doesn't affect
+          how this content looks.
+       */
+
        return s.str ();
 }
index c3c25232f4893ec59776d42c20f483ec5f72acc1..39a3f32ebb4b6c715ce0cc7b5d09afa4d4954c8d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -30,6 +30,7 @@ public:
        static int const SUBTITLE_X_SCALE;
        static int const SUBTITLE_Y_SCALE;
        static int const USE_SUBTITLES;
+       static int const SUBTITLE_LANGUAGE;
 };
 
 /** @class SubtitleContent
@@ -56,6 +57,7 @@ public:
        void set_subtitle_y_offset (double);
        void set_subtitle_x_scale (double);
        void set_subtitle_y_scale (double);
+       void set_subtitle_language (std::string language);
 
        bool use_subtitles () const {
                boost::mutex::scoped_lock lm (_mutex);
@@ -82,6 +84,10 @@ public:
                return _subtitle_y_scale;
        }
 
+       boost::optional<std::string> subtitle_language () const {
+               return _subtitle_language;
+       }
+
 private:
        friend struct ffmpeg_pts_offset_test;
 
@@ -98,6 +104,8 @@ private:
        double _subtitle_x_scale;
        /** y scale factor to apply to subtitles */
        double _subtitle_y_scale;
+
+       boost::optional<std::string> _subtitle_language;
 };
 
 #endif
index 21d6f8e5ba6c46a48a57004fa625e3a584af4641..bc6c8b749c85b1150096e84bc14183ad8698c8ec 100644 (file)
@@ -83,6 +83,10 @@ SubtitlePanel::SubtitlePanel (ContentPanel* p)
                add_label_to_sizer (s, this, _("%"), false);
                grid->Add (s);
        }
+
+       add_label_to_sizer (grid, this, _("Language"), true);
+       _language = new wxTextCtrl (this, wxID_ANY);
+       grid->Add (_language, 1, wxEXPAND);
        
        add_label_to_sizer (grid, this, _("Stream"), true);
        _stream = new wxChoice (this, wxID_ANY);
@@ -99,8 +103,9 @@ SubtitlePanel::SubtitlePanel (ContentPanel* p)
        _use->Bind         (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&SubtitlePanel::use_toggled, this));
        _x_offset->Bind    (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&SubtitlePanel::x_offset_changed, this));
        _y_offset->Bind    (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&SubtitlePanel::y_offset_changed, this));
-       _x_scale->Bind       (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&SubtitlePanel::x_scale_changed, this));
-       _y_scale->Bind       (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&SubtitlePanel::y_scale_changed, this));
+       _x_scale->Bind     (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&SubtitlePanel::x_scale_changed, this));
+       _y_scale->Bind     (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&SubtitlePanel::y_scale_changed, this));
+       _language->Bind    (wxEVT_COMMAND_TEXT_UPDATED,     boost::bind (&SubtitlePanel::language_changed, this));
        _stream->Bind      (wxEVT_COMMAND_CHOICE_SELECTED,  boost::bind (&SubtitlePanel::stream_changed, this));
        _view_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED,   boost::bind (&SubtitlePanel::view_clicked, this));
 }
@@ -260,6 +265,15 @@ SubtitlePanel::y_scale_changed ()
        }
 }
 
+void
+SubtitlePanel::language_changed ()
+{
+       SubtitleContentList c = _parent->selected_subtitle ();
+       for (SubtitleContentList::iterator i = c.begin(); i != c.end(); ++i) {
+               (*i)->set_subtitle_language (wx_to_std (_language->GetValue()));
+       }
+}
+
 void
 SubtitlePanel::content_selection_changed ()
 {
@@ -269,6 +283,7 @@ SubtitlePanel::content_selection_changed ()
        film_content_changed (SubtitleContentProperty::SUBTITLE_Y_OFFSET);
        film_content_changed (SubtitleContentProperty::SUBTITLE_X_SCALE);
        film_content_changed (SubtitleContentProperty::SUBTITLE_Y_SCALE);
+       film_content_changed (SubtitleContentProperty::SUBTITLE_LANGUAGE);
 }
 
 void
index bcff995a0029a5ef223d5381113648aaef893fc0..f82fb14e5bfe49ad2a224db55ef35fc59b633a3a 100644 (file)
@@ -38,6 +38,7 @@ private:
        void y_offset_changed ();
        void x_scale_changed ();
        void y_scale_changed ();
+       void language_changed ();
        void stream_changed ();
        void view_clicked ();
 
@@ -48,6 +49,7 @@ private:
        wxSpinCtrl* _y_offset;
        wxSpinCtrl* _x_scale;
        wxSpinCtrl* _y_scale;
+       wxTextCtrl* _language;
        wxChoice* _stream;
        wxButton* _view_button;
        SubtitleView* _view;