Fix messed up position slider caused by trim changes.
[dcpomatic.git] / src / wx / film_viewer.cc
index e33a3c118dc92eedf9f63bb1b79c88c88d1834d8..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;
@@ -213,7 +213,6 @@ FilmViewer::get (DCPTime p, bool accurate)
                _position = p;
        }
 
-       set_position_text ();
        refresh_panel ();
 
        _last_get_accurate = accurate;
@@ -223,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 ()
 {
@@ -286,6 +277,7 @@ FilmViewer::slider_moved ()
                t = _film->length() - DCPTime::from_frames (1, _film->video_frame_rate ());
        }
        get (t, false);
+       update_position_label ();
 }
 
 void
@@ -296,6 +288,8 @@ FilmViewer::panel_sized (wxSizeEvent& ev)
 
        calculate_sizes ();
        get (_position, _last_get_accurate);
+       update_position_label ();
+       update_position_slider ();
 }
 
 void
@@ -348,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));
@@ -391,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
@@ -408,6 +424,8 @@ FilmViewer::player_changed (bool frequent)
 
        calculate_sizes ();
        get (_position, _last_get_accurate);
+       update_position_label ();
+       update_position_slider ();
 }
 
 void