Fix ExportFormatSpecification copy-c'tor
[ardour.git] / gtk2_ardour / selection.cc
index a1ba890e576a179291eb8236d1d1d4f8b0c08c05..df8b359f7294706ba8b7fc2c716e854d91a41464 100644 (file)
@@ -241,8 +241,8 @@ Selection::clear_markers (bool with_signal)
 void
 Selection::toggle (boost::shared_ptr<Playlist> pl)
 {
-       clear_time();  //enforce object/range exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce object/range exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        PlaylistSelection::iterator i;
 
@@ -259,8 +259,8 @@ Selection::toggle (boost::shared_ptr<Playlist> pl)
 void
 Selection::toggle (const MidiNoteSelection& midi_note_list)
 {
-       clear_time();  //enforce object/range exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce object/range exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        for (MidiNoteSelection::const_iterator i = midi_note_list.begin(); i != midi_note_list.end(); ++i) {
                toggle ((*i));
@@ -287,8 +287,8 @@ Selection::toggle (MidiCutBuffer* midi)
 void
 Selection::toggle (RegionView* r)
 {
-       clear_time();  //enforce object/range exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce object/range exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        RegionSelection::iterator i;
 
@@ -304,8 +304,8 @@ Selection::toggle (RegionView* r)
 void
 Selection::toggle (MidiRegionView* mrv)
 {
-       clear_time();   //enforce object/range exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce object/range exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        MidiRegionSelection::iterator i;
 
@@ -321,8 +321,8 @@ Selection::toggle (MidiRegionView* mrv)
 void
 Selection::toggle (vector<RegionView*>& r)
 {
-       clear_time();  //enforce object/range exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce object/range exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        RegionSelection::iterator i;
 
@@ -338,9 +338,9 @@ Selection::toggle (vector<RegionView*>& r)
 }
 
 long
-Selection::toggle (framepos_t start, framepos_t end)
+Selection::toggle (samplepos_t start, samplepos_t end)
 {
-       clear_objects();  //enforce object/range exclusivity
+       clear_objects(); // enforce object/range exclusivity
 
        AudioRangeComparator cmp;
 
@@ -360,8 +360,8 @@ Selection::add (boost::shared_ptr<Playlist> pl)
 {
 
        if (find (playlists.begin(), playlists.end(), pl) == playlists.end()) {
-               clear_time();  //enforce object/range exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce object/range exclusivity
+               clear_tracks(); // enforce object/track exclusivity
                pl->use ();
                playlists.push_back(pl);
                PlaylistsChanged ();
@@ -382,8 +382,8 @@ Selection::add (const list<boost::shared_ptr<Playlist> >& pllist)
        }
 
        if (changed) {
-               clear_time();  //enforce object/range exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce object/range exclusivity
+               clear_tracks(); // enforce object/track exclusivity
                PlaylistsChanged ();
        }
 }
@@ -395,8 +395,8 @@ Selection::add (const MidiNoteSelection& midi_list)
        const MidiNoteSelection::const_iterator e = midi_list.end();
 
        if (!midi_list.empty()) {
-               clear_time();  //enforce object/range exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce object/range exclusivity
+               clear_tracks(); // enforce object/track exclusivity
                midi_notes.insert (midi_notes.end(), b, e);
                MidiNotesChanged ();
        }
@@ -428,8 +428,8 @@ Selection::add (vector<RegionView*>& v)
        }
 
        if (changed) {
-               clear_time();  //enforce object/range exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce object/range exclusivity
+               clear_tracks(); // enforce object/track exclusivity
                RegionsChanged ();
        }
 }
@@ -449,8 +449,8 @@ Selection::add (const RegionSelection& rs)
        }
 
        if (changed) {
-               clear_time();  //enforce object/range exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce object/range exclusivity
+               clear_tracks(); // enforce object/track exclusivity
                RegionsChanged ();
        }
 }
@@ -461,8 +461,8 @@ Selection::add (RegionView* r)
        if (find (regions.begin(), regions.end(), r) == regions.end()) {
                bool changed = regions.add (r);
                if (changed) {
-                       clear_time();  //enforce object/range exclusivity
-                       clear_tracks();  //enforce object/track exclusivity
+                       clear_time(); // enforce object/range exclusivity
+                       clear_tracks(); // enforce object/track exclusivity
                        RegionsChanged ();
                }
        }
@@ -473,8 +473,8 @@ Selection::add (MidiRegionView* mrv)
 {
        DEBUG_TRACE(DEBUG::Selection, string_compose("Selection::add MRV %1\n", mrv));
 
-       clear_time();  //enforce object/range exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce object/range exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        if (find (midi_regions.begin(), midi_regions.end(), mrv) == midi_regions.end()) {
                midi_regions.push_back (mrv);
@@ -484,9 +484,9 @@ Selection::add (MidiRegionView* mrv)
 }
 
 long
-Selection::add (framepos_t start, framepos_t end)
+Selection::add (samplepos_t start, samplepos_t end)
 {
-       clear_objects();  //enforce object/range exclusivity
+       clear_objects(); // enforce object/range exclusivity
 
        AudioRangeComparator cmp;
 
@@ -502,7 +502,7 @@ Selection::add (framepos_t start, framepos_t end)
 }
 
 void
-Selection::move_time (framecnt_t distance)
+Selection::move_time (samplecnt_t distance)
 {
        if (distance == 0) {
                return;
@@ -517,9 +517,9 @@ Selection::move_time (framecnt_t distance)
 }
 
 void
-Selection::replace (uint32_t sid, framepos_t start, framepos_t end)
+Selection::replace (uint32_t sid, samplepos_t start, samplepos_t end)
 {
-       clear_objects();  //enforce object/range exclusivity
+       clear_objects(); // enforce object/range exclusivity
 
        for (list<AudioRange>::iterator i = time.begin(); i != time.end(); ++i) {
                if ((*i).id == sid) {
@@ -549,8 +549,8 @@ Selection::add (boost::shared_ptr<Evoral::ControlList> cl)
        }
 
        if (!cl->empty()) {
-               clear_time();  //enforce object/range exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce object/range exclusivity
+               clear_tracks(); // enforce object/track exclusivity
        }
 
        /* The original may change so we must store a copy (not a pointer) here.
@@ -673,7 +673,7 @@ Selection::remove (uint32_t selection_id)
 }
 
 void
-Selection::remove (framepos_t /*start*/, framepos_t /*end*/)
+Selection::remove (samplepos_t /*start*/, samplepos_t /*end*/)
 {
 }
 
@@ -691,8 +691,8 @@ void
 Selection::set (const MidiNoteSelection& midi_list)
 {
        if (!midi_list.empty()) {
-               clear_time ();  //enforce region/object exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time (); // enforce region/object exclusivity
+               clear_tracks(); // enforce object/track exclusivity
        }
        clear_objects ();
        add (midi_list);
@@ -702,8 +702,8 @@ void
 Selection::set (boost::shared_ptr<Playlist> playlist)
 {
        if (playlist) {
-               clear_time ();  //enforce region/object exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time (); // enforce region/object exclusivity
+               clear_tracks(); // enforce object/track exclusivity
        }
        clear_objects ();
        add (playlist);
@@ -713,7 +713,7 @@ void
 Selection::set (const list<boost::shared_ptr<Playlist> >& pllist)
 {
        if (!pllist.empty()) {
-               clear_time();  //enforce region/object exclusivity
+               clear_time(); // enforce region/object exclusivity
        }
        clear_objects ();
        add (pllist);
@@ -723,8 +723,8 @@ void
 Selection::set (const RegionSelection& rs)
 {
        if (!rs.empty()) {
-               clear_time();  //enforce region/object exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce region/object exclusivity
+               clear_tracks(); // enforce object/track exclusivity
        }
        clear_objects();
        regions = rs;
@@ -735,8 +735,8 @@ void
 Selection::set (MidiRegionView* mrv)
 {
        if (mrv) {
-               clear_time();  //enforce region/object exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce region/object exclusivity
+               clear_tracks(); // enforce object/track exclusivity
        }
        clear_objects ();
        add (mrv);
@@ -746,8 +746,8 @@ void
 Selection::set (RegionView* r, bool /*also_clear_tracks*/)
 {
        if (r) {
-               clear_time();  //enforce region/object exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce region/object exclusivity
+               clear_tracks(); // enforce object/track exclusivity
        }
        clear_objects ();
        add (r);
@@ -757,8 +757,8 @@ void
 Selection::set (vector<RegionView*>& v)
 {
        if (!v.empty()) {
-               clear_time();  //enforce region/object exclusivity
-               clear_tracks();  //enforce object/track exclusivity
+               clear_time(); // enforce region/object exclusivity
+               clear_tracks(); // enforce object/track exclusivity
        }
 
        clear_objects();
@@ -770,9 +770,9 @@ Selection::set (vector<RegionView*>& v)
  *  the list of tracks it applies to.
  */
 long
-Selection::set (framepos_t start, framepos_t end)
+Selection::set (samplepos_t start, samplepos_t end)
 {
-       clear_objects();  //enforce region/object exclusivity
+       clear_objects(); // enforce region/object exclusivity
        clear_time();
 
        if ((start == 0 && end == 0) || end < start) {
@@ -807,9 +807,9 @@ Selection::set (framepos_t start, framepos_t end)
  *  @param end New end time.
  */
 void
-Selection::set_preserving_all_ranges (framepos_t start, framepos_t end)
+Selection::set_preserving_all_ranges (samplepos_t start, samplepos_t end)
 {
-       clear_objects();  //enforce region/object exclusivity
+       clear_objects(); // enforce region/object exclusivity
 
        if ((start == 0 && end == 0) || (end < start)) {
                return;
@@ -831,8 +831,8 @@ Selection::set_preserving_all_ranges (framepos_t start, framepos_t end)
 void
 Selection::set (boost::shared_ptr<Evoral::ControlList> ac)
 {
-       clear_time();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
        clear_objects();
 
        add (ac);
@@ -859,7 +859,7 @@ Selection::selected (ControlPoint* cp) const
 bool
 Selection::empty (bool internal_selection)
 {
-       bool object_level_empty =  regions.empty () &&
+       bool object_level_empty = regions.empty () &&
                tracks.empty () &&
                points.empty () &&
                playlists.empty () &&
@@ -884,8 +884,8 @@ Selection::empty (bool internal_selection)
 void
 Selection::toggle (ControlPoint* cp)
 {
-       clear_time();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        cp->set_selected (!cp->selected ());
        PointSelection::iterator i = find (points.begin(), points.end(), cp);
@@ -901,8 +901,8 @@ Selection::toggle (ControlPoint* cp)
 void
 Selection::toggle (vector<ControlPoint*> const & cps)
 {
-       clear_time();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        for (vector<ControlPoint*>::const_iterator i = cps.begin(); i != cps.end(); ++i) {
                toggle (*i);
@@ -912,8 +912,8 @@ Selection::toggle (vector<ControlPoint*> const & cps)
 void
 Selection::toggle (list<Selectable*> const & selectables)
 {
-       clear_time();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time(); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        RegionView* rv;
        ControlPoint* cp;
@@ -945,8 +945,8 @@ Selection::toggle (list<Selectable*> const & selectables)
 void
 Selection::set (list<Selectable*> const & selectables)
 {
-       clear_time ();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time (); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
        clear_objects ();
 
        add (selectables);
@@ -955,8 +955,8 @@ Selection::set (list<Selectable*> const & selectables)
 void
 Selection::add (PointSelection const & s)
 {
-       clear_time ();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time (); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        for (PointSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
                points.push_back (*i);
@@ -966,8 +966,8 @@ Selection::add (PointSelection const & s)
 void
 Selection::add (list<Selectable*> const & selectables)
 {
-       clear_time ();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time (); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        RegionView* rv;
        ControlPoint* cp;
@@ -1010,8 +1010,8 @@ Selection::clear_points (bool with_signal)
 void
 Selection::add (ControlPoint* cp)
 {
-       clear_time ();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time (); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        cp->set_selected (true);
        points.push_back (cp);
@@ -1021,8 +1021,8 @@ Selection::add (ControlPoint* cp)
 void
 Selection::add (vector<ControlPoint*> const & cps)
 {
-       clear_time ();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time (); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        for (vector<ControlPoint*>::const_iterator i = cps.begin(); i != cps.end(); ++i) {
                (*i)->set_selected (true);
@@ -1034,8 +1034,8 @@ Selection::add (vector<ControlPoint*> const & cps)
 void
 Selection::set (ControlPoint* cp)
 {
-       clear_time ();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time (); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        if (cp->selected () && points.size () == 1) {
                return;
@@ -1052,8 +1052,8 @@ Selection::set (ControlPoint* cp)
 void
 Selection::set (ArdourMarker* m)
 {
-       clear_time ();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time ();  // enforce region/object exclusivity
+       clear_tracks();  // enforce object/track exclusivity
        markers.clear ();
 
        add (m);
@@ -1085,8 +1085,8 @@ Selection::remove (ArdourMarker* m)
 void
 Selection::add (ArdourMarker* m)
 {
-       clear_time ();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time (); //enforce region/object exclusivity
+       clear_tracks(); //enforce object/track exclusivity
 
        if (find (markers.begin(), markers.end(), m) == markers.end()) {
                markers.push_back (m);
@@ -1097,8 +1097,8 @@ Selection::add (ArdourMarker* m)
 void
 Selection::add (const list<ArdourMarker*>& m)
 {
-       clear_time ();  //enforce region/object exclusivity
-       clear_tracks();  //enforce object/track exclusivity
+       clear_time (); // enforce region/object exclusivity
+       clear_tracks(); // enforce object/track exclusivity
 
        markers.insert (markers.end(), m.begin(), m.end());
        markers.sort ();
@@ -1108,9 +1108,9 @@ Selection::add (const list<ArdourMarker*>& m)
 }
 
 void
-MarkerSelection::range (framepos_t& s, framepos_t& e)
+MarkerSelection::range (samplepos_t& s, samplepos_t& e)
 {
-       s = max_framepos;
+       s = max_samplepos;
        e = 0;
 
        for (MarkerSelection::iterator i = begin(); i != end(); ++i) {
@@ -1138,11 +1138,11 @@ Selection::get_state () const
        XMLNode* node = new XMLNode (X_("Selection"));
 
        for (TrackSelection::const_iterator i = tracks.begin(); i != tracks.end(); ++i) {
-               RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
+               StripableTimeAxisView* stv = dynamic_cast<StripableTimeAxisView*> (*i);
                AutomationTimeAxisView* atv = dynamic_cast<AutomationTimeAxisView*> (*i);
-               if (rtv) {
-                       XMLNode* t = node->add_child (X_("RouteView"));
-                       t->set_property (X_("id"), rtv->route()->id ());
+               if (stv) {
+                       XMLNode* t = node->add_child (X_("StripableView"));
+                       t->set_property (X_("id"), stv->stripable()->id ());
                } else if (atv) {
                        XMLNode* t = node->add_child (X_("AutomationView"));
                        t->set_property (X_("id"), atv->parent_stripable()->id ());
@@ -1150,21 +1150,24 @@ Selection::get_state () const
                }
        }
 
-       for (RegionSelection::const_iterator i = regions.begin(); i != regions.end(); ++i) {
-               XMLNode* r = node->add_child (X_("Region"));
-               r->set_property (X_("id"), (*i)->region ()->id ());
+       if (!regions.empty()) {
+               XMLNode* parent = node->add_child (X_("Regions"));
+               for (RegionSelection::const_iterator i = regions.begin(); i != regions.end(); ++i) {
+                       XMLNode* r = parent->add_child (X_("Region"));
+                       r->set_property (X_("id"), (*i)->region ()->id ());
+               }
        }
 
        /* midi region views have thir own internal selection. */
-       list<pair<PBD::ID, std::set<boost::shared_ptr<Evoral::Note<Evoral::Beats> > > > > rid_notes;
+       list<pair<PBD::ID, std::set<boost::shared_ptr<Evoral::Note<Temporal::Beats> > > > > rid_notes;
        editor->get_per_region_note_selection (rid_notes);
 
-       list<pair<PBD::ID, std::set<boost::shared_ptr<Evoral::Note<Evoral::Beats> > > > >::iterator rn_it;
+       list<pair<PBD::ID, std::set<boost::shared_ptr<Evoral::Note<Temporal::Beats> > > > >::iterator rn_it;
        for (rn_it = rid_notes.begin(); rn_it != rid_notes.end(); ++rn_it) {
                XMLNode* n = node->add_child (X_("MIDINotes"));
                n->set_property (X_("region-id"), (*rn_it).first);
 
-               for (std::set<boost::shared_ptr<Evoral::Note<Evoral::Beats> > >::iterator i = (*rn_it).second.begin(); i != (*rn_it).second.end(); ++i) {
+               for (std::set<boost::shared_ptr<Evoral::Note<Temporal::Beats> > >::iterator i = (*rn_it).second.begin(); i != (*rn_it).second.end(); ++i) {
                        XMLNode* nc = n->add_child(X_("note"));
                        nc->set_property(X_("note-id"), (*i)->id());
                }
@@ -1225,8 +1228,6 @@ Selection::set_state (XMLNode const & node, int)
        clear_time ();
        clear_markers ();
 
-       RegionSelection selected_regions;
-
        /* NOTE: stripable/time-axis-view selection is saved/restored by
         * ARDOUR::CoreSelection, not this Selection object
         */
@@ -1235,23 +1236,34 @@ Selection::set_state (XMLNode const & node, int)
        XMLNodeList children = node.children ();
 
        for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
-               if ((*i)->name() == X_("Region")) {
+               if ((*i)->name() == X_("Regions")) {
+                       RegionSelection selected_regions;
+                       XMLNodeList children = (*i)->children ();
+                       for (XMLNodeList::const_iterator ci = children.begin(); ci != children.end(); ++ci) {
+                               PBD::ID id;
 
-                       if (!(*i)->get_property (X_("id"), id)) {
-                               assert(false);
+                               if (!(*ci)->get_property (X_("id"), id)) {
+                                       continue;
+                               }
+
+                               RegionSelection rs;
+                               editor->get_regionviews_by_id (id, rs);
+
+                               if (!rs.empty ()) {
+                                       for (RegionSelection::const_iterator i = rs.begin(); i != rs.end(); ++i) {
+                                               selected_regions.push_back (*i);
+                                       }
+                               } else {
+                                       /*
+                                         regionviews haven't been constructed - stash the region IDs
+                                         so we can identify them in Editor::region_view_added ()
+                                       */
+                                       regions.pending.push_back (id);
+                               }
                        }
 
-                       RegionSelection rs;
-                       editor->get_regionviews_by_id (id, rs);
-
-                       if (!rs.empty ()) {
-                               selected_regions.insert (selected_regions.end(), rs.begin(), rs.end());
-                       } else {
-                               /*
-                                 regionviews haven't been constructed - stash the region IDs
-                                 so we can identify them in Editor::region_view_added ()
-                               */
-                               regions.pending.push_back (id);
+                       if (!selected_regions.empty()) {
+                               add (selected_regions);
                        }
 
                } else if ((*i)->name() == X_("MIDINotes")) {
@@ -1286,7 +1298,7 @@ Selection::set_state (XMLNode const & node, int)
                                pending_midi_note_selection.push_back (make_pair (id, notes));
                        }
 
-               } else if  ((*i)->name() == X_("ControlPoint")) {
+               } else if ((*i)->name() == X_("ControlPoint")) {
                        XMLProperty const * prop_type = (*i)->property (X_("type"));
 
                        assert(prop_type);
@@ -1305,11 +1317,11 @@ Selection::set_state (XMLNode const & node, int)
                                        assert(false);
                                }
 
-                               RouteTimeAxisView* rtv = editor->get_route_view_by_route_id (route_id); // XXX may also be VCA
+                               StripableTimeAxisView* stv = editor->get_stripable_time_axis_by_id (route_id);
                                vector <ControlPoint *> cps;
 
-                               if (rtv) {
-                                       boost::shared_ptr<AutomationTimeAxisView> atv = rtv->automation_child (EventTypeMap::instance().from_symbol (param));
+                               if (stv) {
+                                       boost::shared_ptr<AutomationTimeAxisView> atv = stv->automation_child (EventTypeMap::instance().from_symbol (param));
                                        if (atv) {
                                                list<boost::shared_ptr<AutomationLine> > lines = atv->lines();
                                                for (list<boost::shared_ptr<AutomationLine> > ::iterator li = lines.begin(); li != lines.end(); ++li) {
@@ -1357,14 +1369,15 @@ Selection::set_state (XMLNode const & node, int)
                                }
                        }
 
-               } else if  ((*i)->name() == X_("AudioRange")) {
-                       framepos_t start;
-                       framepos_t end;
+               } else if ((*i)->name() == X_("AudioRange")) {
+                       samplepos_t start;
+                       samplepos_t end;
 
                        if (!(*i)->get_property (X_("start"), start) || !(*i)->get_property (X_("end"), end)) {
                                assert(false);
                        }
-                       set_preserving_all_ranges (start, end);
+
+                       add (start, end);
 
                } else if ((*i)->name() == X_("AutomationView")) {
 
@@ -1374,10 +1387,10 @@ Selection::set_state (XMLNode const & node, int)
                                assert (false);
                        }
 
-                       RouteTimeAxisView* rtv = editor->get_route_view_by_route_id (id);
+                       StripableTimeAxisView* stv = editor->get_stripable_time_axis_by_id (id);
 
-                       if (rtv) {
-                               boost::shared_ptr<AutomationTimeAxisView> atv = rtv->automation_child (EventTypeMap::instance().from_symbol (param));
+                       if (stv) {
+                               boost::shared_ptr<AutomationTimeAxisView> atv = stv->automation_child (EventTypeMap::instance().from_symbol (param));
 
                                /* the automation could be for an entity that was never saved
                                   in the session file. Don't freak out if we can't find
@@ -1405,9 +1418,6 @@ Selection::set_state (XMLNode const & node, int)
 
        }
 
-       // now add regions to selection at once
-       add (selected_regions);
-
        return 0;
 }
 
@@ -1452,10 +1462,6 @@ Selection::toggle (const TrackViewList& track_list)
 void
 Selection::toggle (TimeAxisView* track)
 {
-       if (dynamic_cast<VCATimeAxisView*> (track)) {
-               return;
-       }
-
        TrackViewList tr;
        tr.push_back (track);
        toggle (tr);
@@ -1479,10 +1485,6 @@ Selection::add (TrackViewList const & track_list)
 void
 Selection::add (TimeAxisView* track)
 {
-       if (dynamic_cast<VCATimeAxisView*> (track)) {
-               return;
-       }
-
        TrackViewList tr;
        tr.push_back (track);
        add (tr);
@@ -1491,10 +1493,6 @@ Selection::add (TimeAxisView* track)
 void
 Selection::remove (TimeAxisView* track)
 {
-       if (dynamic_cast<VCATimeAxisView*> (track)) {
-               return;
-       }
-
        TrackViewList tvl;
        tvl.push_back (track);
        remove (tvl);
@@ -1516,10 +1514,6 @@ Selection::remove (const TrackViewList& t)
 void
 Selection::set (TimeAxisView* track)
 {
-       if (dynamic_cast<VCATimeAxisView*> (track)) {
-               return;
-       }
-
        TrackViewList tvl;
        tvl.push_back (track);
        set (tvl);
@@ -1677,7 +1671,7 @@ Selection::core_selection_changed (PropertyChange const & what_changed)
        CoreSelection& selection (editor->session()->selection());
 
        if (selection.selected()) {
-               clear_objects();  // enforce object/range exclusivity
+               clear_objects(); // enforce object/range exclusivity
        }
 
        tracks.clear (); // clear stage for whatever tracks are now selected (maybe none)
@@ -1699,4 +1693,6 @@ Selection::core_selection_changed (PropertyChange const & what_changed)
                        tracks.push_back (tav);
                }
        }
+
+       TracksChanged();
 }