summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-01-25 15:35:31 +0000
committerCarl Hetherington <cth@carlh.net>2015-01-25 15:35:31 +0000
commit1fde1118c78309dee4c2e76bb2b39147dc9b7f2a (patch)
treef941d46483995162359f281b6be155695cd6be52 /src
parent2e9855c34f861ed59affb0cfc021f78ea5417808 (diff)
Hand-apply 39e9f0794349f44caf440db9568b8b15eb900381 from master; snap improvements in timeline.
Diffstat (limited to 'src')
-rw-r--r--src/wx/timeline.cc55
-rw-r--r--src/wx/timeline.h3
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;