Fix messed up position slider caused by trim changes.
[dcpomatic.git] / src / wx / film_viewer.cc
index 0938d52a4cdd094af5cfe0255addf9376e5b52e1..26d81ee86490653db9856603ea80949f7c17a377 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2015 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
@@ -130,8 +130,8 @@ FilmViewer::set_film (shared_ptr<Film> f)
 
        _frame.reset ();
        
-       _slider->SetValue (0);
-       set_position_text ();
+       update_position_slider ();
+       update_position_label ();
        
        if (!_film) {
                return;
@@ -144,6 +144,11 @@ FilmViewer::set_film (shared_ptr<Film> f)
                _film.reset ();
                return;
        }
+
+       /* Always burn in subtitles, even if we are set not to, otherwise we won't see them
+          in the preview.
+       */
+       _player->set_burn_subtitles (true);
        
        _film_connection = _film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1));
 
@@ -208,7 +213,6 @@ FilmViewer::get (DCPTime p, bool accurate)
                _position = p;
        }
 
-       set_position_text ();
        refresh_panel ();
 
        _last_get_accurate = accurate;
@@ -218,18 +222,10 @@ void
 FilmViewer::timer ()
 {
        get (_position + DCPTime::from_frames (1, _film->video_frame_rate ()), true);
-
-       DCPTime const len = _film->length ();
-
-       if (len.get ()) {
-               int const new_slider_position = 4096 * _position.get() / len.get();
-               if (new_slider_position != _slider->GetValue()) {
-                       _slider->SetValue (new_slider_position);
-               }
-       }
+       update_position_label ();
+       update_position_slider ();
 }
 
-
 void
 FilmViewer::paint_panel ()
 {
@@ -281,6 +277,7 @@ FilmViewer::slider_moved ()
                t = _film->length() - DCPTime::from_frames (1, _film->video_frame_rate ());
        }
        get (t, false);
+       update_position_label ();
 }
 
 void
@@ -291,6 +288,8 @@ FilmViewer::panel_sized (wxSizeEvent& ev)
 
        calculate_sizes ();
        get (_position, _last_get_accurate);
+       update_position_label ();
+       update_position_slider ();
 }
 
 void
@@ -343,14 +342,32 @@ FilmViewer::check_play_state ()
 }
 
 void
-FilmViewer::set_position_text ()
+FilmViewer::update_position_slider ()
+{
+       if (!_film) {
+               _slider->SetValue (0);
+               return;
+       }
+       
+       DCPTime const len = _film->length ();
+
+       if (len.get ()) {
+               int const new_slider_position = 4096 * _position.get() / len.get();
+               if (new_slider_position != _slider->GetValue()) {
+                       _slider->SetValue (new_slider_position);
+               }
+       }
+}
+
+void
+FilmViewer::update_position_label ()
 {
        if (!_film) {
                _frame_number->SetLabel ("0");
                _timecode->SetLabel ("0:0:0.0");
                return;
        }
-               
+
        double const fps = _film->video_frame_rate ();
        /* Count frame number from 1 ... not sure if this is the best idea */
        _frame_number->SetLabel (wxString::Format (wxT("%d"), int (rint (_position.seconds() * fps)) + 1));
@@ -386,12 +403,16 @@ FilmViewer::back_clicked ()
        }
 
        get (p, true);
+       update_position_label ();
+       update_position_slider ();
 }
 
 void
 FilmViewer::forward_clicked ()
 {
        get (_position + DCPTime::from_frames (1, _film->video_frame_rate ()), true);
+       update_position_label ();
+       update_position_slider ();
 }
 
 void
@@ -403,6 +424,8 @@ FilmViewer::player_changed (bool frequent)
 
        calculate_sizes ();
        get (_position, _last_get_accurate);
+       update_position_label ();
+       update_position_slider ();
 }
 
 void