diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-01-25 15:35:31 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-01-25 15:35:31 +0000 |
| commit | 1fde1118c78309dee4c2e76bb2b39147dc9b7f2a (patch) | |
| tree | f941d46483995162359f281b6be155695cd6be52 /src | |
| parent | 2e9855c34f861ed59affb0cfc021f78ea5417808 (diff) | |
Hand-apply 39e9f0794349f44caf440db9568b8b15eb900381 from master; snap improvements in timeline.
Diffstat (limited to 'src')
| -rw-r--r-- | src/wx/timeline.cc | 55 | ||||
| -rw-r--r-- | src/wx/timeline.h | 3 |
2 files changed, 26 insertions, 32 deletions
diff --git a/src/wx/timeline.cc b/src/wx/timeline.cc index 6bce881a4..bd001b12e 100644 --- a/src/wx/timeline.cc +++ b/src/wx/timeline.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net> + Copyright (C) 2013-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 @@ -670,6 +670,15 @@ Timeline::right_down (wxMouseEvent& ev) } void +Timeline::maybe_snap (DCPTime a, DCPTime b, optional<DCPTime>& nearest_distance) const +{ + DCPTime const d = a - b; + if (!nearest_distance || d.abs() < nearest_distance.get().abs()) { + nearest_distance = d; + } +} + +void Timeline::set_position_from_event (wxMouseEvent& ev) { if (!_pixels_per_second) { @@ -698,10 +707,12 @@ Timeline::set_position_from_event (wxMouseEvent& ev) DCPTime new_position = _down_view_position + DCPTime::from_seconds ((p.x - _down_point.x) / pps); if (_snap) { - - bool first = true; - DCPTime nearest_distance = DCPTime::max (); - DCPTime nearest_new_position = DCPTime::max (); + + DCPTime const new_end = new_position + _down_view->content()->length_after_trim (); + /* Signed `distance' to nearest thing (i.e. negative is left on the timeline, + positive is right). + */ + optional<DCPTime> nearest_distance; /* Find the nearest content edge; this is inefficient */ for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) { @@ -709,35 +720,17 @@ Timeline::set_position_from_event (wxMouseEvent& ev) if (!cv || cv == _down_view) { continue; } - - { - /* Snap starts to ends */ - DCPTime const d = DCPTime (cv->content()->end() - new_position).abs (); - if (first || d < nearest_distance) { - nearest_distance = d; - nearest_new_position = cv->content()->end() + DCPTime::delta (); - } - } - - { - /* Snap ends to starts */ - DCPTime const d = DCPTime ( - cv->content()->position() - (new_position + _down_view->content()->length_after_trim()) - ).abs (); - - if (d < nearest_distance) { - nearest_distance = d; - nearest_new_position = cv->content()->position() - _down_view->content()->length_after_trim () - DCPTime::delta(); - } - } - - first = false; + + 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); } - if (!first) { + if (nearest_distance) { /* Snap if it's close; `close' means within a proportion of the time on the timeline */ - if (nearest_distance < DCPTime::from_seconds ((width() / pps) / 32)) { - new_position = nearest_new_position; + if (nearest_distance.get().abs() < DCPTime::from_seconds ((width() / pps) / 64)) { + new_position += nearest_distance.get (); } } } diff --git a/src/wx/timeline.h b/src/wx/timeline.h index 82d10afde..7595f1067 100644 --- a/src/wx/timeline.h +++ b/src/wx/timeline.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Carl Hetherington <cth@carlh.net> + Copyright (C) 2013-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 @@ -91,6 +91,7 @@ private: boost::shared_ptr<View> event_to_view (wxMouseEvent &); ContentViewList selected_views () const; ContentList selected_content () const; + void maybe_snap (DCPTime a, DCPTime b, boost::optional<DCPTime>& nearest_distance) const; ContentPanel* _content_panel; boost::weak_ptr<Film> _film; |
