diff options
author | nick_m <mainsbridge@gmail.com> | 2017-06-21 23:51:12 +1000 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2017-07-22 02:15:20 +1000 |
commit | 515cdb6b32d2e7dbddeaf7b72105a1eb0aef9634 (patch) | |
tree | 52624d2c14edb9c2edd66b5f95feb8294bf3ea40 /gtk2_ardour | |
parent | 1d8548306be536e6c82a179bc38c8f8dbd12a700 (diff) |
Rework region selection XML
Ensures that selection is restored in the same object type order
it was created in, which may some day make a difference.
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/selection.cc | 53 |
2 files changed, 32 insertions, 23 deletions
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index c8a778f5ad..e23396eb89 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -3342,7 +3342,7 @@ Editor::separate_under_selected_regions () PlaylistState before; before.playlist = playlist; before.before = &playlist->get_state(); - + playlist->clear_changes (); playlist->freeze (); playlists.push_back(before); } diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index f47dd3ee57..7a9e0e3ad8 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -1150,9 +1150,12 @@ 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. */ @@ -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")) { @@ -1406,9 +1418,6 @@ Selection::set_state (XMLNode const & node, int) } - // now add regions to selection at once - add (selected_regions); - return 0; } |