make sure that when extending the selection in the editor and mixer, the clicked...
authorPaul Davis <paul@linuxaudiosystems.com>
Sun, 26 Feb 2017 17:22:39 +0000 (18:22 +0100)
committerPaul Davis <paul@linuxaudiosystems.com>
Sun, 26 Feb 2017 17:24:56 +0000 (18:24 +0100)
This makes it be the "first" selected strip for control surfaces and the editor mixer

gtk2_ardour/editor_selection.cc
gtk2_ardour/mixer_ui.cc

index 1c065289c620347f66ea72127ea6c909bade5fae..f0ba5916d77ddd97b3b8c4f41607c2fb075b1ec0 100644 (file)
@@ -89,10 +89,6 @@ Editor::extend_selection_to_track (TimeAxisView& view)
 
        sorted.sort (cmp);
 
-       if (!selection->selected (&view)) {
-               to_be_added.push_back (&view);
-       }
-
        /* figure out if we should go forward or backwards */
 
        for (TrackViewList::iterator i = sorted.begin(); i != sorted.end(); ++i) {
@@ -158,6 +154,10 @@ Editor::extend_selection_to_track (TimeAxisView& view)
                }
        }
 
+       if (!selection->selected (&view)) {
+               to_be_added.push_back (&view);
+       }
+
        if (!to_be_added.empty()) {
                selection->add (to_be_added);
                return true;
@@ -981,19 +981,33 @@ Editor::set_selected_regionview_from_map_event (GdkEventAny* /*ev*/, StreamView*
        return true;
 }
 
+struct SelectionOrderSorter {
+       bool operator() (TimeAxisView const * const a, TimeAxisView const * const b) const  {
+               boost::shared_ptr<Stripable> sa = a->stripable ();
+               boost::shared_ptr<Stripable> sb = b->stripable ();
+               if (!sa && !sb) {
+                       return a < b;
+               }
+               if (!sa) {
+                       return false;
+               }
+               if (!sb) {
+                       return true;
+               }
+               return sa->presentation_info().selection_cnt() < sb->presentation_info().selection_cnt();
+       }
+};
+
 void
 Editor::track_selection_changed ()
 {
+       SelectionOrderSorter cmp;
+       selection->tracks.sort (cmp);
+
        switch (selection->tracks.size()) {
        case 0:
                break;
        default:
-               /* last element in selection list is the most recently
-                * selected, because we always append to that list.
-                */
-               cerr << "setting selected mixer strip to "
-                    << selection->tracks.back()->name()
-                    << endl;
                set_selected_mixer_strip (*(selection->tracks.back()));
                if (!_track_selection_change_without_scroll) {
                        ensure_time_axis_view_is_visible (*(selection->tracks.back()), false);
index f197ba34a29332c37436c2900cc1dd10203dfadd..1e39b4bbaa8a6109be12f1195078ac3bfe174f1b 100644 (file)
@@ -928,8 +928,6 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
                                bool accumulate = false;
                                bool found_another = false;
 
-                               tmp.push_back (strip);
-
                                OrderingKeys sorted;
                                const size_t cmp_max = strips.size ();
                                for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
@@ -970,12 +968,16 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
                                        }
                                }
 
+                               tmp.push_back (strip);
+
                                if (found_another) {
+                                       PresentationInfo::ChangeSuspender cs;
                                        for (vector<MixerStrip*>::iterator i = tmp.begin(); i != tmp.end(); ++i) {
                                                _selection.add (*i);
                                        }
-                               } else
+                               } else {
                                        _selection.set (strip);  //user wants to start a range selection, but there aren't any others selected yet
+                               }
                        } else {
                                _selection.set (strip);
                        }