Slightly unpleasant hack to stop control points being
authorCarl Hetherington <carl@carlh.net>
Thu, 31 May 2012 14:39:48 +0000 (14:39 +0000)
committerCarl Hetherington <carl@carlh.net>
Thu, 31 May 2012 14:39:48 +0000 (14:39 +0000)
unselected when you ctrl-drag a selected point in order to
do a push drag.

git-svn-id: svn://localhost/ardour2/branches/3.0@12502 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_selection.cc
gtk2_ardour/selection.cc
gtk2_ardour/selection.h

index 573303825b5eb8a0aae529c41b6da9ba7715302e..e17c8046c47f5021166d0f3c99bb95260f781b81 100644 (file)
@@ -281,6 +281,7 @@ Editor::Editor ()
 
        , _region_selection_change_updates_region_list (true)
        , _following_mixer_selection (false)
+       , _control_point_toggled_on_press (false)
 {
        constructed = false;
 
index 1953bb27ea57a61ad207cbaecb4d308eab003d19..e51fe88d452aad6e459702d4bc39f805f7c4dad0 100644 (file)
@@ -2092,6 +2092,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        void toggle_sound_midi_notes ();
 
+       /** Flag for a bit of a hack wrt control point selection; see set_selected_control_point_from_click */
+       bool _control_point_toggled_on_press;
+
        friend class Drag;
        friend class RegionDrag;
        friend class RegionMoveDrag;
index 6e12a03856769ddf5799871bd60bdbd1b54e68db..eb67fb363125d956ed9fcd88597ccba2527b812d 100644 (file)
@@ -318,19 +318,39 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation
                return false;
        }
 
-       if (!press) {
-               return true;
-       }
-
        switch (op) {
        case Selection::Set:
-               selection->set (clicked_control_point);
+               if (press) {
+                       selection->set (clicked_control_point);
+               }
                break;
        case Selection::Add:
-               selection->add (clicked_control_point);
+               if (press) {
+                       selection->add (clicked_control_point);
+               }
                break;
        case Selection::Toggle:
-               selection->toggle (clicked_control_point);
+               /* This is a bit of a hack; if we Primary-Click-Drag a control
+                  point (for push drag) we want the point we clicked on to be
+                  selected, otherwise we end up confusingly dragging an
+                  unselected point.  So here we ensure that the point is selected
+                  after the press, and if we subsequently get a release (meaning no
+                  drag occurred) we set things up so that the toggle has happened.
+               */
+               if (press && !selection->selected (clicked_control_point)) {
+                       /* This is the button press, and the control point is not selected; make it so,
+                          in case this press leads to a drag.  Also note that having done this, we don't
+                          need to toggle again on release.
+                       */
+                       selection->toggle (clicked_control_point);
+                       _control_point_toggled_on_press = true;
+               } else if (!press && !_control_point_toggled_on_press) {
+                       /* This is the release, and the point wasn't toggled on the press, so do it now */
+                       selection->toggle (clicked_control_point);
+               } else {
+                       /* Reset our flag */
+                       _control_point_toggled_on_press = false;
+               }
                break;
        case Selection::Extend:
                /* XXX */
index 724618e540b94726add5869b7d496f847ab3fd7d..009b40d26d6ce208db4f50adb14538512ba7a40b 100644 (file)
@@ -861,6 +861,12 @@ Selection::selected (RegionView* rv)
        return find (regions.begin(), regions.end(), rv) != regions.end();
 }
 
+bool
+Selection::selected (ControlPoint* cp)
+{
+       return find (points.begin(), points.end(), cp) != points.end();
+}
+
 bool
 Selection::empty (bool internal_selection)
 {
index df7212593f599b5a1eb1b90a5c496ab8c70f5f71..e30ca612eafde66f1a3cbf05018e3770b30ba159 100644 (file)
@@ -114,6 +114,7 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList
        bool selected (TimeAxisView*);
        bool selected (RegionView*);
        bool selected (Marker*);
+       bool selected (ControlPoint*);
 
        void set (std::list<Selectable*> const &);
        void add (std::list<Selectable*> const &);