13
0

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.
This commit is contained in:
Robin Gareus 2017-08-06 22:12:20 +02:00
parent 0301326656
commit d18a43422c
2 changed files with 26 additions and 4 deletions

View File

@ -36,6 +36,7 @@ namespace ARDOUR {
class AutomationControl; class AutomationControl;
class Session; class Session;
class Stripable; class Stripable;
class VCAManager;
class PresentationInfo; class PresentationInfo;
class LIBARDOUR_API CoreSelection : public PBD::Stateful { class LIBARDOUR_API CoreSelection : public PBD::Stateful {
@ -76,6 +77,7 @@ class LIBARDOUR_API CoreSelection : public PBD::Stateful {
protected: protected:
friend class Stripable; friend class Stripable;
friend class Session; friend class Session;
friend class VCAManager;
void remove_stripable_by_id (PBD::ID const &); void remove_stripable_by_id (PBD::ID const &);
private: private:

View File

@ -22,6 +22,7 @@
#include "pbd/string_convert.h" #include "pbd/string_convert.h"
#include "ardour/boost_debug.h" #include "ardour/boost_debug.h"
#include "ardour/selection.h"
#include "ardour/session.h" #include "ardour/session.h"
#include "ardour/slavable.h" #include "ardour/slavable.h"
#include "ardour/vca.h" #include "ardour/vca.h"
@ -49,14 +50,27 @@ VCAManager::~VCAManager ()
void void
VCAManager::clear () VCAManager::clear ()
{
bool send = false;
{ {
Mutex::Lock lm (lock); Mutex::Lock lm (lock);
for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) { 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 (); (*i)->DropReferences ();
} }
_vcas.clear (); _vcas.clear ();
} }
if (send && !_session.deletion_in_progress ()) {
PropertyChange pc;
pc.add (Properties::selected);
PresentationInfo::Change (pc);
}
}
VCAList VCAList
VCAManager::vcas () const VCAManager::vcas () const
{ {
@ -115,6 +129,12 @@ VCAManager::remove_vca (boost::shared_ptr<VCA> vca)
vca->DropReferences (); 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 (); _session.set_dirty ();
} }