Keep current frame visible when trimming start. Don't trim the current
[dcpomatic.git] / src / wx / timing_panel.cc
index f05268f92434d79626268eebfe936716a9bf35a9..bb0547b9c62368553d8c58bd2c08b3f66476fad6 100644 (file)
@@ -37,6 +37,7 @@ using std::string;
 using std::set;
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
+using boost::optional;
 
 TimingPanel::TimingPanel (ContentPanel* p, FilmViewer* viewer)
        /* horrid hack for apparent lack of context support with wxWidgets i18n code */
@@ -401,12 +402,23 @@ void
 TimingPanel::trim_start_to_playhead_clicked ()
 {
        DCPTime const ph = _viewer->position ();
+       optional<DCPTime> new_ph;
+
+       _viewer->set_ignore_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 ());
                        i->set_trim_start (i->trim_start() + ContentTime (ph - i->position (), frc));
+                       new_ph = i->position ();
                }
        }
+
+       _viewer->set_ignore_player_changes (false);
+
+       if (new_ph) {
+               _viewer->set_position (new_ph.get());
+       }
 }
 
 void
@@ -416,7 +428,7 @@ TimingPanel::trim_end_to_playhead_clicked ()
        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 ());
-                       i->set_trim_end (ContentTime (i->position() + i->full_length() - ph, frc) - i->trim_start());
+                       i->set_trim_end (ContentTime (i->position() + i->full_length() - ph - DCPTime::from_frames (1, frc.dcp), frc) - i->trim_start());
                }
 
        }