summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-01-05 03:15:28 +0000
committerCarl Hetherington <carl@carlh.net>2010-01-05 03:15:28 +0000
commita23811502c638be8b5c896f03fb218b8c9301a7b (patch)
tree45c81f119422d7c32d1190c1078eaba46f3e044d /gtk2_ardour
parent0d5ce8d939b1772626f3b223042b2bce0c72154a (diff)
Cleanup of previous two commits.
git-svn-id: svn://localhost/ardour2/branches/3.0@6452 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/control_point.h4
-rw-r--r--gtk2_ardour/editor.h6
-rw-r--r--gtk2_ardour/editor_selection.cc112
3 files changed, 41 insertions, 81 deletions
diff --git a/gtk2_ardour/control_point.h b/gtk2_ardour/control_point.h
index 6ef6f8fb3e..0264015f93 100644
--- a/gtk2_ardour/control_point.h
+++ b/gtk2_ardour/control_point.h
@@ -64,6 +64,10 @@ class ControlPoint
void show ();
void set_color ();
+ double size () const {
+ return _size;
+ }
+
void set_size (double);
void set_visible (bool);
bool visible () const;
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index a43bfa4383..6227afa805 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -1630,12 +1630,6 @@ public:
/* object rubberband select process */
- std::pair<std::list<Selectable*>, TrackViewList> find_selectables_within (
- nframes64_t, nframes64_t, double, double, TrackViewList const &
- );
-
- bool select_selectables_and_tracks (std::list<Selectable*> const &, TrackViewList const &, Selection::Operation);
-
bool select_all_within (nframes64_t, nframes64_t, double, double, TrackViewList const &, Selection::Operation op);
ArdourCanvas::SimpleRect *rubberband_rect;
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc
index dac890fee4..3423878190 100644
--- a/gtk2_ardour/editor_selection.cc
+++ b/gtk2_ardour/editor_selection.cc
@@ -242,14 +242,25 @@ Editor::set_selected_control_point_from_click (Selection::Operation op, bool /*n
return false;
}
- /* rectangle 10 pixels surrounding the clicked control point */
- /* XXX: not really sure why we look for more control points close to the clicked one,
- and don't just use the clicked one
- */
- nframes64_t const x1 = pixel_to_frame (clicked_control_point->get_x() - 10);
- nframes64_t const x2 = pixel_to_frame (clicked_control_point->get_x() + 10);
- double y1 = clicked_control_point->get_y() - 10;
- double y2 = clicked_control_point->get_y() + 10;
+ if (clicked_control_point->selected()) {
+ /* the clicked control point is already selected; others may be as well, so
+ don't change the selection.
+ */
+ return true;
+ }
+
+ /* We know the ControlPoint that was clicked, but (as discussed in automation_selectable.h)
+ * selected automation data are described by areas on the AutomationLine. A ControlPoint
+ * represents any model points in the space that it takes up, so the AutomationSelectable
+ * needs to be the size of the ControlPoint.
+ */
+
+ double const size = clicked_control_point->size ();
+
+ nframes64_t const x1 = pixel_to_frame (clicked_control_point->get_x() - size / 2);
+ nframes64_t const x2 = pixel_to_frame (clicked_control_point->get_x() + size / 2);
+ double y1 = clicked_control_point->get_y() - size / 2;
+ double y2 = clicked_control_point->get_y() + size / 2;
/* convert the y values to trackview space */
double dummy = 0;
@@ -258,36 +269,8 @@ Editor::set_selected_control_point_from_click (Selection::Operation op, bool /*n
_trackview_group->w2i (dummy, y1);
_trackview_group->w2i (dummy, y2);
- /* find any other points nearby */
- pair<list<Selectable*>, TrackViewList> const f = find_selectables_within (x1, x2, y1, y2, selection->tracks);
-
- PointSelection ps;
- for (list<Selectable*>::const_iterator i = f.first.begin(); i != f.first.end(); ++i) {
- AutomationSelectable* a = dynamic_cast<AutomationSelectable*> (*i);
- if (a) {
- ps.push_back (*a);
- }
- }
-
- list<ControlPoint*> const cp = clicked_control_point->line().point_selection_to_control_points (ps);
- list<ControlPoint*>::const_iterator i = cp.begin ();
- while (i != cp.end() && (*i)->selected() == false) {
- ++i;
- }
-
- if (i != cp.end()) {
- /* one of the control points that we just clicked on is already selected,
- so leave the selection alone.
- */
-
- for (list<Selectable*>::const_iterator i = f.first.begin(); i != f.first.end(); ++i) {
- delete *i;
- }
-
- return true;
- }
-
- return select_selectables_and_tracks (f.first, f.second, op);
+ /* and set up the selection */
+ return select_all_within (x1, x2, y1, y2, selection->tracks, Selection::Set);
}
void
@@ -993,15 +976,13 @@ Editor::invert_selection ()
selection->set (touched);
}
-/** Find Selectable things within an area.
- * @param start Start temporal position (session frames)
- * @param end End temporal position (session frames)
- * @param top Top (lower) y position (trackview coordinates)
- * @param bot Bottom (higher) y position (trackview coordinates)
- * @return Selectable things and tracks that they are on.
+/** @param top Top (lower) y limit in trackview coordinates.
+ * @param bottom Bottom (higher) y limit in trackview coordinates.
*/
-pair<list<Selectable*>, TrackViewList>
-Editor::find_selectables_within (nframes64_t start, nframes64_t end, double top, double bot, const TrackViewList& tracklist)
+bool
+Editor::select_all_within (
+ nframes64_t start, nframes64_t end, double top, double bot, const TrackViewList& tracklist, Selection::Operation op
+ )
{
list<Selectable*> found;
TrackViewList tracks;
@@ -1020,41 +1001,22 @@ Editor::find_selectables_within (nframes64_t start, nframes64_t end, double top,
tracks.push_back (*iter);
}
}
-
- return make_pair (found, tracks);
-}
-
-/** @param top Top (lower) y limit in trackview coordinates.
- * @param bottom Bottom (higher) y limit in trackview coordinates.
- */
-bool
-Editor::select_all_within (
- nframes64_t start, nframes64_t end, double top, double bot, const TrackViewList& tracklist, Selection::Operation op
- )
-{
- pair<list<Selectable*>, TrackViewList> const f = find_selectables_within (start, end, top, bot, tracklist);
- return select_selectables_and_tracks (f.first, f.second, op);
-}
-
-/** Select a list of Selectables and also a list of Tracks; nothing will be selected if there are no Selectables */
-bool
-Editor::select_selectables_and_tracks (list<Selectable*> const & s, TrackViewList const & t, Selection::Operation op)
-{
- if (s.empty()) {
+
+ if (found.empty()) {
return false;
}
- if (!t.empty()) {
+ if (!tracks.empty()) {
switch (op) {
case Selection::Add:
- selection->add (t);
+ selection->add (tracks);
break;
case Selection::Toggle:
- selection->toggle (t);
+ selection->toggle (tracks);
break;
case Selection::Set:
- selection->set (t);
+ selection->set (tracks);
break;
case Selection::Extend:
/* not defined yet */
@@ -1065,13 +1027,13 @@ Editor::select_selectables_and_tracks (list<Selectable*> const & s, TrackViewLis
begin_reversible_command (_("select all within"));
switch (op) {
case Selection::Add:
- selection->add (s);
+ selection->add (found);
break;
case Selection::Toggle:
- selection->toggle (s);
+ selection->toggle (found);
break;
case Selection::Set:
- selection->set (s);
+ selection->set (found);
break;
case Selection::Extend:
/* not defined yet */
@@ -1080,7 +1042,7 @@ Editor::select_selectables_and_tracks (list<Selectable*> const & s, TrackViewLis
commit_reversible_command ();
- return !s.empty();
+ return !found.empty();
}
void