Emit SelectionChange when VCA is removed
authorRobin Gareus <robin@gareus.org>
Sun, 6 Aug 2017 20:12:20 +0000 (22:12 +0200)
committerRobin Gareus <robin@gareus.org>
Sun, 6 Aug 2017 20:17:05 +0000 (22:17 +0200)
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.

libs/ardour/ardour/selection.h
libs/ardour/vca_manager.cc

index 08c2d1eda1a1a0e2c9e8ab299808977d28010484..8da0692761c451fb8a7ef2e853a9775db60f940b 100644 (file)
@@ -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:
index 32ff461f1fc30bcc9289e6460ab8a00012fb2fb3..f8b566ecaf32c0bac6d777b96206c7c52394f319 100644 (file)
@@ -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 ();
 }