derive TriggerUI from sigc::trackable so that it can be automically disconnected from signals

The explicit disconnect in the destructor prevents any more signal->connection firing, but the invalidator
is required to remove existing queued slot calls in the receiving thread
This commit is contained in:
Paul Davis 2022-02-21 15:01:36 -07:00
parent 87bcd4d83b
commit 11fd0b84b1
2 changed files with 9 additions and 6 deletions

View File

@ -77,6 +77,8 @@ TriggerUI::TriggerUI ()
, _context_menu (0)
, _ignore_menu_action (false)
{
std::cerr << "CONSTRUCT TUI " << this << std::endl;
if (follow_strings.empty()) {
follow_strings.push_back (follow_action_to_string (FollowAction (FollowAction::None)));
follow_strings.push_back (follow_action_to_string (FollowAction (FollowAction::Stop)));
@ -119,6 +121,7 @@ TriggerUI::TriggerUI ()
TriggerUI::~TriggerUI()
{
std::cerr << "DESTROY TUI " << this << std::endl;
trigger_swap_connection.disconnect ();
trigger_connections.drop_connections ();
}
@ -132,8 +135,8 @@ TriggerUI::trigger_swap (uint32_t n)
}
trigger_connections.drop_connections ();
trigger()->PropertyChanged.connect (trigger_connections, MISSING_INVALIDATOR, boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context ());
tref.box->PropertyChanged.connect (trigger_connections, MISSING_INVALIDATOR, boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context ());
trigger()->PropertyChanged.connect (trigger_connections, invalidator (*this), boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context ());
tref.box->PropertyChanged.connect (trigger_connections, invalidator (*this), boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context ());
trigger_changed (Properties::name);
}
@ -846,10 +849,10 @@ TriggerUI::set_trigger (ARDOUR::TriggerReference tr)
trigger_changed (pc);
trigger()->PropertyChanged.connect (trigger_connections, MISSING_INVALIDATOR, boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context());
tref.box->PropertyChanged.connect (trigger_connections, MISSING_INVALIDATOR, boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context ());
trigger()->PropertyChanged.connect (trigger_connections, invalidator (*this), boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context());
tref.box->PropertyChanged.connect (trigger_connections, invalidator (*this), boost::bind (&TriggerUI::trigger_changed, this, _1), gui_context ());
tref.box->TriggerSwapped.connect (trigger_swap_connection, MISSING_INVALIDATOR, boost::bind (&TriggerUI::trigger_swap, this, _1), gui_context ());
tref.box->TriggerSwapped.connect (trigger_swap_connection, invalidator (*this), boost::bind (&TriggerUI::trigger_swap, this, _1), gui_context ());
on_trigger_set(); //derived classes can do initialization here
}

View File

@ -37,7 +37,7 @@ namespace Gtk
class TriggerJumpDialog;
class TriggerUI
class TriggerUI : virtual public sigc::trackable
{
public:
TriggerUI ();