Add regions at once rather than individually when restoring Selection state
authorTim Mayberry <mojofunk@gmail.com>
Sun, 23 Apr 2017 11:32:09 +0000 (21:32 +1000)
committerTim Mayberry <mojofunk@gmail.com>
Sun, 23 Apr 2017 22:41:30 +0000 (08:41 +1000)
This is a workaround for performance issues with the current implementation
when adding many regions to the selection one at a time.

If the Selection implementation was to change at some point and adding regions
to the selection only takes a small constant amount of time, then this
optimization may no longer be necessary.

Related to: #7274

gtk2_ardour/selection.cc

index b7230ad7e1cac1a5bd8bf5a5e82f24f0d5bd1663..1114222248f1f008be12432d688abae27bde80aa 100644 (file)
@@ -1387,6 +1387,8 @@ Selection::set_state (XMLNode const & node, int)
        clear_tracks ();
        clear_markers ();
 
+       RegionSelection selected_regions;
+
        PBD::ID id;
        XMLNodeList children = node.children ();
        for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
@@ -1411,7 +1413,7 @@ Selection::set_state (XMLNode const & node, int)
                        editor->get_regionviews_by_id (id, rs);
 
                        if (!rs.empty ()) {
-                               add (rs);
+                               selected_regions.insert (selected_regions.end(), rs.begin(), rs.end());
                        } else {
                                /*
                                  regionviews haven't been constructed - stash the region IDs
@@ -1571,6 +1573,9 @@ Selection::set_state (XMLNode const & node, int)
 
        }
 
+       // now add regions to selection at once
+       add (selected_regions);
+
        return 0;
 }