PlainText -> PlainTextFile.
[dcpomatic.git] / src / wx / timing_panel.cc
index 49c405f9ef9aa09c0d977af6c8d7d458e5d1442b..93ac0278438bac6ff8932f4e0ecaa094fc123be3 100644 (file)
 #include "move_to_dialog.h"
 #include "lib/content.h"
 #include "lib/image_content.h"
-#include "lib/subtitle_content.h"
-#include "lib/dcp_subtitle_content.h"
+#include "lib/text_content.h"
+#include "lib/dcp_text_content.h"
 #include "lib/audio_content.h"
-#include "lib/text_subtitle_content.h"
+#include "lib/plain_text_file_content.h"
 #include "lib/video_content.h"
 #include <dcp/locale_convert.h>
 #include <boost/foreach.hpp>
@@ -155,15 +155,15 @@ TimingPanel::TimingPanel (ContentPanel* p, FilmViewer* viewer)
        grid->Layout ();
 
        _position->Changed.connect    (boost::bind (&TimingPanel::position_changed, this));
-       _move_to_start_of_reel->Bind  (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&TimingPanel::move_to_start_of_reel_clicked, this));
+       _move_to_start_of_reel->Bind  (wxEVT_BUTTON, boost::bind (&TimingPanel::move_to_start_of_reel_clicked, this));
        _full_length->Changed.connect (boost::bind (&TimingPanel::full_length_changed, this));
        _trim_start->Changed.connect  (boost::bind (&TimingPanel::trim_start_changed, this));
-       _trim_start_to_playhead->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&TimingPanel::trim_start_to_playhead_clicked, this));
+       _trim_start_to_playhead->Bind (wxEVT_BUTTON, boost::bind (&TimingPanel::trim_start_to_playhead_clicked, this));
        _trim_end->Changed.connect    (boost::bind (&TimingPanel::trim_end_changed, this));
-       _trim_end_to_playhead->Bind   (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&TimingPanel::trim_end_to_playhead_clicked, this));
+       _trim_end_to_playhead->Bind   (wxEVT_BUTTON, boost::bind (&TimingPanel::trim_end_to_playhead_clicked, this));
        _play_length->Changed.connect (boost::bind (&TimingPanel::play_length_changed, this));
-       _video_frame_rate->Bind       (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&TimingPanel::video_frame_rate_changed, this));
-       _set_video_frame_rate->Bind   (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&TimingPanel::set_video_frame_rate, this));
+       _video_frame_rate->Bind       (wxEVT_TEXT, boost::bind (&TimingPanel::video_frame_rate_changed, this));
+       _set_video_frame_rate->Bind   (wxEVT_BUTTON, boost::bind (&TimingPanel::set_video_frame_rate, this));
 
        _viewer->ImageChanged.connect (boost::bind (&TimingPanel::setup_sensitivity, this));
 
@@ -317,19 +317,21 @@ TimingPanel::film_content_changed (int property)
 void
 TimingPanel::position_changed ()
 {
+       DCPTime const pos = _position->get (_parent->film()->video_frame_rate ());
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
-               i->set_position (_position->get (_parent->film()->video_frame_rate ()));
+               i->set_position (pos);
        }
 }
 
 void
 TimingPanel::full_length_changed ()
 {
+       int const vfr = _parent->film()->video_frame_rate ();
+       Frame const len = _full_length->get (vfr).frames_round (vfr);
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
                shared_ptr<ImageContent> ic = dynamic_pointer_cast<ImageContent> (i);
                if (ic && ic->still ()) {
-                       int const vfr = _parent->film()->video_frame_rate ();
-                       ic->video->set_length (_full_length->get (vfr).frames_round (vfr));
+                       ic->video->set_length (len);
                }
        }
 }
@@ -344,6 +346,9 @@ TimingPanel::trim_start_changed ()
        shared_ptr<Content> ref;
        optional<FrameRateChange> ref_frc;
        optional<DCPTime> ref_ph;
+
+       ContentTime const trim = _trim_start->get (_parent->film()->video_frame_rate ());
+
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
                if (i->position() <= ph && ph < i->end()) {
                        /* The playhead is in i.  Use it as a reference to work out
@@ -355,7 +360,7 @@ TimingPanel::trim_start_changed ()
                        ref_ph = ph - i->position() + DCPTime (i->trim_start(), ref_frc.get());
                }
 
-               i->set_trim_start (_trim_start->get (_parent->film()->video_frame_rate ()));
+               i->set_trim_start (trim);
        }
 
        if (ref) {
@@ -370,8 +375,9 @@ TimingPanel::trim_end_changed ()
 {
        _viewer->set_coalesce_player_changes (true);
 
+       ContentTime const trim = _trim_end->get (_parent->film()->video_frame_rate ());
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
-               i->set_trim_end (_trim_end->get (_parent->film()->video_frame_rate ()));
+               i->set_trim_end (trim);
        }
 
        /* XXX: maybe playhead-off-the-end-of-the-film should be handled elsewhere */
@@ -385,11 +391,11 @@ TimingPanel::trim_end_changed ()
 void
 TimingPanel::play_length_changed ()
 {
+       DCPTime const play_length = _play_length->get (_parent->film()->video_frame_rate());
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
                FrameRateChange const frc = _parent->film()->active_frame_rate_change (i->position ());
                i->set_trim_end (
-                       ContentTime (i->full_length() - _play_length->get (_parent->film()->video_frame_rate()), frc)
-                       - i->trim_start ()
+                       ContentTime (max(DCPTime(), i->full_length() - play_length), frc) - i->trim_start ()
                        );
        }
 }
@@ -403,9 +409,16 @@ TimingPanel::video_frame_rate_changed ()
 void
 TimingPanel::set_video_frame_rate ()
 {
-       double const fr = locale_convert<double> (wx_to_std (_video_frame_rate->GetValue ()));
+       optional<double> fr;
+       if (_video_frame_rate->GetValue() != wxT("")) {
+               fr = locale_convert<double> (wx_to_std (_video_frame_rate->GetValue ()));
+       }
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
-               i->set_video_frame_rate (fr);
+               if (fr) {
+                       i->set_video_frame_rate (*fr);
+               } else {
+                       i->unset_video_frame_rate ();
+               }
        }
 
        _set_video_frame_rate->Enable (false);
@@ -435,14 +448,15 @@ TimingPanel::film_changed (Film::Property p)
 void
 TimingPanel::trim_start_to_playhead_clicked ()
 {
-       DCPTime const ph = _viewer->position ();
+       shared_ptr<const Film> film = _parent->film ();
+       DCPTime const ph = _viewer->position().floor (film->video_frame_rate ());
        optional<DCPTime> new_ph;
 
        _viewer->set_coalesce_player_changes (true);
 
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
                if (i->position() < ph && ph < i->end ()) {
-                       FrameRateChange const frc = _parent->film()->active_frame_rate_change (i->position ());
+                       FrameRateChange const frc = film->active_frame_rate_change (i->position ());
                        i->set_trim_start (i->trim_start() + ContentTime (ph - i->position (), frc));
                        new_ph = i->position ();
                }
@@ -458,10 +472,11 @@ TimingPanel::trim_start_to_playhead_clicked ()
 void
 TimingPanel::trim_end_to_playhead_clicked ()
 {
-       DCPTime const ph = _viewer->position ();
+       shared_ptr<const Film> film = _parent->film ();
+       DCPTime const ph = _viewer->position().floor (film->video_frame_rate ());
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
                if (i->position() < ph && ph < i->end ()) {
-                       FrameRateChange const frc = _parent->film()->active_frame_rate_change (i->position ());
+                       FrameRateChange const frc = film->active_frame_rate_change (i->position ());
                        i->set_trim_end (ContentTime (i->position() + i->full_length() - ph - DCPTime::from_frames (1, frc.dcp), frc) - i->trim_start());
                }
        }