diff options
author | Robin Gareus <robin@gareus.org> | 2017-08-06 22:12:20 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-08-06 22:17:05 +0200 |
commit | d18a43422c531c7c4ecc19cf480890192f90aa9e (patch) | |
tree | d4ab08489f8644d90b171bd10a73ac8902bc239b /libs | |
parent | 0301326656b838ee7d11f6c1b068ab5bd15a99ee (diff) |
Emit SelectionChange when VCA is removed
chicken/egg:
Stripable d'tor which calls remove_stripable_by_id() will only be called
when the Stripable is destroyed. But as long as the GUI selection holds a
shared-ptr reference to the Stripable, it won't be destroyed.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/selection.h | 2 | ||||
-rw-r--r-- | libs/ardour/vca_manager.cc | 28 |
2 files changed, 26 insertions, 4 deletions
diff --git a/libs/ardour/ardour/selection.h b/libs/ardour/ardour/selection.h index 08c2d1eda1..8da0692761 100644 --- a/libs/ardour/ardour/selection.h +++ b/libs/ardour/ardour/selection.h @@ -36,6 +36,7 @@ namespace ARDOUR { class AutomationControl; class Session; class Stripable; +class VCAManager; class PresentationInfo; class LIBARDOUR_API CoreSelection : public PBD::Stateful { @@ -76,6 +77,7 @@ class LIBARDOUR_API CoreSelection : public PBD::Stateful { protected: friend class Stripable; friend class Session; + friend class VCAManager; void remove_stripable_by_id (PBD::ID const &); private: diff --git a/libs/ardour/vca_manager.cc b/libs/ardour/vca_manager.cc index 32ff461f1f..f8b566ecaf 100644 --- a/libs/ardour/vca_manager.cc +++ b/libs/ardour/vca_manager.cc @@ -22,6 +22,7 @@ #include "pbd/string_convert.h" #include "ardour/boost_debug.h" +#include "ardour/selection.h" #include "ardour/session.h" #include "ardour/slavable.h" #include "ardour/vca.h" @@ -50,11 +51,24 @@ VCAManager::~VCAManager () void VCAManager::clear () { - Mutex::Lock lm (lock); - for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) { - (*i)->DropReferences (); + bool send = false; + { + Mutex::Lock lm (lock); + for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) { + if ((*i)->is_selected ()) { + _session.selection().remove_stripable_by_id ((*i)->id()); + send = true; + } + (*i)->DropReferences (); + } + _vcas.clear (); + } + + if (send && !_session.deletion_in_progress ()) { + PropertyChange pc; + pc.add (Properties::selected); + PresentationInfo::Change (pc); } - _vcas.clear (); } VCAList @@ -115,6 +129,12 @@ VCAManager::remove_vca (boost::shared_ptr<VCA> vca) vca->DropReferences (); + if (vca->is_selected () && !_session.deletion_in_progress ()) { + _session.selection().remove_stripable_by_id (vca->id()); + PropertyChange pc; + pc.add (Properties::selected); + PresentationInfo::Change (pc); + } _session.set_dirty (); } |