+{
+ setup_sensitivity ();
+
+ film_content_changed (ContentProperty::POSITION);
+ film_content_changed (ContentProperty::LENGTH);
+ film_content_changed (ContentProperty::TRIM_START);
+ film_content_changed (ContentProperty::TRIM_END);
+ film_content_changed (ContentProperty::VIDEO_FRAME_RATE);
+}
+
+void
+TimingPanel::film_changed (Film::Property p)
+{
+ if (p == Film::VIDEO_FRAME_RATE) {
+ update_full_length ();
+ update_play_length ();
+ }
+}
+
+void
+TimingPanel::trim_start_to_playhead_clicked ()
+{
+ 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 = film->active_frame_rate_change (i->position ());
+ i->set_trim_start (i->trim_start() + ContentTime (ph - i->position (), frc));
+ new_ph = i->position ();
+ }
+ }
+
+ if (new_ph) {
+ _viewer->set_position (new_ph.get());
+ }
+
+ _viewer->set_coalesce_player_changes (false);
+}
+
+void
+TimingPanel::trim_end_to_playhead_clicked ()
+{
+ 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 = 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());
+ }
+ }
+}
+
+void
+TimingPanel::setup_sensitivity ()