X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fwx%2Ftimeline.cc;h=f1c6e30f342c981f2dc307228e4929fdadc35e2a;hb=258da8a37c21a87ba5a7aa1c3e6243280d5c8d10;hp=6ed91e098e17b05b5961fb47b5056191806e526a;hpb=688fa9d705a6b23f216f380ac701c6a60e934f70;p=dcpomatic.git diff --git a/src/wx/timeline.cc b/src/wx/timeline.cc index 6ed91e098..f1c6e30f3 100644 --- a/src/wx/timeline.cc +++ b/src/wx/timeline.cc @@ -93,7 +93,12 @@ void Timeline::playlist_changed () { ensure_ui_thread (); - + recreate_views (); +} + +void +Timeline::recreate_views () +{ shared_ptr fl = _film.lock (); if (!fl) { return; @@ -108,7 +113,9 @@ Timeline::playlist_changed () if (dynamic_pointer_cast (*i)) { _views.push_back (shared_ptr (new TimelineVideoContentView (*this, *i))); } - if (dynamic_pointer_cast (*i)) { + + shared_ptr ac = dynamic_pointer_cast (*i); + if (ac && !ac->audio_mapping().mapped_dcp_channels().empty ()) { _views.push_back (shared_ptr (new TimelineAudioContentView (*this, *i))); } @@ -130,8 +137,13 @@ Timeline::playlist_content_changed (int property) if (property == ContentProperty::POSITION) { assign_tracks (); - setup_pixels_per_second (); + if (!_left_down) { + /* Only do this if we are not dragging, as it's confusing otherwise */ + setup_pixels_per_second (); + } Refresh (); + } else if (property == AudioContentProperty::AUDIO_MAPPING) { + recreate_views (); } } @@ -277,6 +289,12 @@ Timeline::left_up (wxMouseEvent& ev) } set_position_from_event (ev); + + /* We don't do this during drag, and set_position_from_event above + might not have changed the position, so do it now. + */ + setup_pixels_per_second (); + Refresh (); } void @@ -303,7 +321,7 @@ Timeline::right_down (wxMouseEvent& ev) cv->set_selected (true); } - _menu.popup (_film, selected_content (), ev.GetPosition ()); + _menu.popup (_film, selected_content (), selected_views (), ev.GetPosition ()); } void @@ -345,7 +363,7 @@ Timeline::set_position_from_event (wxMouseEvent& ev) if (_snap) { - DCPTime const new_end = new_position + _down_view->content()->length_after_trim (); + DCPTime const new_end = new_position + _down_view->content()->length_after_trim () - DCPTime (1); /* Signed `distance' to nearest thing (i.e. negative is left on the timeline, positive is right). */ @@ -354,14 +372,14 @@ Timeline::set_position_from_event (wxMouseEvent& ev) /* Find the nearest content edge; this is inefficient */ for (TimelineViewList::iterator i = _views.begin(); i != _views.end(); ++i) { shared_ptr cv = dynamic_pointer_cast (*i); - if (!cv || cv == _down_view) { + if (!cv || cv == _down_view || cv->content() == _down_view->content()) { continue; } maybe_snap (cv->content()->position(), new_position, nearest_distance); - maybe_snap (cv->content()->position(), new_end, nearest_distance); - maybe_snap (cv->content()->end(), new_position, nearest_distance); - maybe_snap (cv->content()->end(), new_end, nearest_distance); + maybe_snap (cv->content()->position(), new_end + DCPTime (1), nearest_distance); + maybe_snap (cv->content()->end() + DCPTime (1), new_position, nearest_distance); + maybe_snap (cv->content()->end() + DCPTime (1), new_end, nearest_distance); } if (nearest_distance) {