summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-09-28 00:36:30 +0000
committerCarl Hetherington <carl@carlh.net>2011-09-28 00:36:30 +0000
commitde53e1154b2ebdc050b390b2df760177b8f57c90 (patch)
tree8a4641b8ea98948ac8e2be3957db656b7f125106
parent3f8f1b3478dd00dc92776c36034b534bcc3b0684 (diff)
Fix problems with selecting control points in AutomationRegionViews with non-zero region start. Firstly, determine_visible_control_points considers a subset of the AutomationLine's points if start is non-zero, and this must be taken into account when matching up AutomationLine points with AutomationList points. Secondly, _offset should not part of the calculation when converting model position to session frames. Fixes #4338.
git-svn-id: svn://localhost/ardour2/branches/3.0@10151 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/automation_line.cc34
-rw-r--r--gtk2_ardour/automation_line.h2
2 files changed, 30 insertions, 6 deletions
diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc
index 5e5d511250..7206f2dfdc 100644
--- a/gtk2_ardour/automation_line.cc
+++ b/gtk2_ardour/automation_line.cc
@@ -340,11 +340,19 @@ AutomationLine::model_representation (ControlPoint& cp, ModelRepresentation& mr)
}
}
+/** @param points AutomationLine points to consider. These will correspond 1-to-1 to
+ * points in the AutomationList, but will have been transformed so that they are in pixels;
+ * the x coordinate being the pixel distance from the start of the line (0, or the start
+ * of the AutomationRegionView if we are in one).
+ *
+ * @param skipped Number of points in the AutomationList that were skipped before
+ * `points' starts.
+ */
+
void
-AutomationLine::determine_visible_control_points (ALPoints& points)
+AutomationLine::determine_visible_control_points (ALPoints& points, int skipped)
{
uint32_t view_index, pi, n;
- AutomationList::iterator model;
uint32_t npoints;
uint32_t this_rx = 0;
uint32_t prev_rx = 0;
@@ -383,8 +391,16 @@ AutomationLine::determine_visible_control_points (ALPoints& points)
view_index = 0;
- for (model = alist->begin(), pi = 0; pi < npoints; ++model, ++pi) {
+ /* skip over unused AutomationList points before we start */
+
+ AutomationList::iterator model = alist->begin ();
+ for (int i = 0; i < skipped; ++i) {
+ ++model;
+ }
+
+ for (pi = 0; pi < npoints; ++model, ++pi) {
+ /* If this line is in an AutomationRegionView, this is an offset from the region position, in pixels */
double tx = points[pi].x;
double ty = points[pi].y;
@@ -973,7 +989,12 @@ AutomationLine::get_selectables (
for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
double const model_when = (*(*i)->model())->when;
- framepos_t const session_frames_when = _time_converter.to (model_when) + _time_converter.origin_b () - _offset;
+
+ /* model_when is relative to the start of the source, so we just need to add on the origin_b here
+ (as it is the session frame position of the start of the source)
+ */
+
+ framepos_t const session_frames_when = _time_converter.to (model_when) + _time_converter.origin_b ();
if (session_frames_when >= start && session_frames_when <= end && (*i)->get_y() >= bot_track && (*i)->get_y() <= top_track) {
results.push_back (*i);
@@ -1066,6 +1087,7 @@ AutomationLine::reset_callback (const Evoral::ControlList& events)
}
AutomationList::const_iterator ai;
+ int skipped = 0;
for (ai = events.begin(); ai != events.end(); ++ai) {
@@ -1078,10 +1100,12 @@ AutomationLine::reset_callback (const Evoral::ControlList& events)
trackview.editor().frame_to_unit (translated_x),
_height - (translated_y * _height))
);
+ } else if (translated_x < 0) {
+ ++skipped;
}
}
- determine_visible_control_points (tmp_points);
+ determine_visible_control_points (tmp_points, skipped);
}
void
diff --git a/gtk2_ardour/automation_line.h b/gtk2_ardour/automation_line.h
index 5ac63fad8b..3a28362195 100644
--- a/gtk2_ardour/automation_line.h
+++ b/gtk2_ardour/automation_line.h
@@ -182,7 +182,7 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulDestructible
static void invalidate_point (ALPoints&, uint32_t index);
static bool invalid_point (ALPoints&, uint32_t index);
- void determine_visible_control_points (ALPoints&);
+ void determine_visible_control_points (ALPoints &, int);
void sync_model_with_view_point (ControlPoint&, bool, int64_t);
void sync_model_with_view_points (std::list<ControlPoint*>, bool, int64_t);
void start_drag_common (double, float);