diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-07-06 13:36:55 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-07-06 13:39:10 -0400 |
commit | 2047ee527c688ed2c2bedea79a7e01088da58d72 (patch) | |
tree | a9326585d3bfeb12c87e2879b7280e5368b18013 /libs/surfaces/control_protocol | |
parent | eed3ea5047ae50484542cacece0df1fd9db2e4d0 (diff) |
restore/extend/simplify ControlProtocol API to allow tracking of selection
Diffstat (limited to 'libs/surfaces/control_protocol')
-rw-r--r-- | libs/surfaces/control_protocol/control_protocol.cc | 50 | ||||
-rw-r--r-- | libs/surfaces/control_protocol/control_protocol/control_protocol.h | 19 |
2 files changed, 69 insertions, 0 deletions
diff --git a/libs/surfaces/control_protocol/control_protocol.cc b/libs/surfaces/control_protocol/control_protocol.cc index f1b2f9f112..4d578409c3 100644 --- a/libs/surfaces/control_protocol/control_protocol.cc +++ b/libs/surfaces/control_protocol/control_protocol.cc @@ -49,8 +49,20 @@ PBD::Signal0<void> ControlProtocol::VerticalZoomOutSelected; PBD::Signal0<void> ControlProtocol::StepTracksDown; PBD::Signal0<void> ControlProtocol::StepTracksUp; +PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::AddStripableToSelection; +PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::SetStripableSelection; +PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::ToggleStripableSelection; +PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::RemoveStripableFromSelection; +PBD::Signal0<void> ControlProtocol::ClearStripableSelection; + PBD::Signal1<void,StripableNotificationListPtr> ControlProtocol::StripableSelectionChanged; +Glib::Threads::Mutex ControlProtocol::first_selected_mutex; +boost::weak_ptr<Stripable> ControlProtocol::_first_selected_stripable; +StripableNotificationList ControlProtocol::_last_selected; +bool ControlProtocol::selection_connected = false; +PBD::ScopedConnection ControlProtocol::selection_connection; + const std::string ControlProtocol::state_node_name ("Protocol"); ControlProtocol::ControlProtocol (Session& s, string str) @@ -58,6 +70,12 @@ ControlProtocol::ControlProtocol (Session& s, string str) , _name (str) , _active (false) { + if (!selection_connected) { + /* this is all static, connect it only once (and early), for all ControlProtocols */ + + StripableSelectionChanged.connect_same_thread (selection_connection, boost::bind (&ControlProtocol::stripable_selection_changed, _1)); + selection_connected = true; + } } ControlProtocol::~ControlProtocol () @@ -324,3 +342,35 @@ ControlProtocol::set_state (XMLNode const & node, int /* version */) return 0; } + +boost::shared_ptr<Stripable> +ControlProtocol::first_selected_stripable () +{ + Glib::Threads::Mutex::Lock lm (first_selected_mutex); + return _first_selected_stripable.lock(); +} + +void +ControlProtocol::set_first_selected_stripable (boost::shared_ptr<Stripable> s) +{ + Glib::Threads::Mutex::Lock lm (first_selected_mutex); + _first_selected_stripable = s; +} + +void +ControlProtocol::stripable_selection_changed (StripableNotificationListPtr sp) +{ + _last_selected = *sp; + + { + Glib::Threads::Mutex::Lock lm (first_selected_mutex); + + if (!_last_selected.empty()) { + _first_selected_stripable = _last_selected.front().lock(); + } else { + _first_selected_stripable = boost::weak_ptr<Stripable>(); + } + } + + cerr << "CP: selection now " << _last_selected.size() << endl; +} diff --git a/libs/surfaces/control_protocol/control_protocol/control_protocol.h b/libs/surfaces/control_protocol/control_protocol/control_protocol.h index 496ba99083..2485ca84ac 100644 --- a/libs/surfaces/control_protocol/control_protocol/control_protocol.h +++ b/libs/surfaces/control_protocol/control_protocol/control_protocol.h @@ -39,6 +39,7 @@ namespace ARDOUR { class Route; class Session; class Bundle; +class Stripable; class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::ScopedConnectionList, public BasicUI { @@ -78,6 +79,12 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope static PBD::Signal0<void> StepTracksDown; static PBD::Signal0<void> StepTracksUp; + static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > AddStripableToSelection; + static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > SetStripableSelection; + static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ToggleStripableSelection; + static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > RemoveStripableFromSelection; + static PBD::Signal0<void> ClearStripableSelection; + /* signals that one UI (e.g. the GUI) can emit to get all other UI's to respond. Typically this will always be GUI->"others" - the GUI pays no attention to these signals. @@ -85,6 +92,9 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope static PBD::Signal1<void,StripableNotificationListPtr> StripableSelectionChanged; + static boost::shared_ptr<ARDOUR::Stripable> first_selected_stripable (); + static void set_first_selected_stripable (boost::shared_ptr<ARDOUR::Stripable>); + /* the model here is as follows: we imagine most control surfaces being able to control @@ -132,6 +142,7 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope int set_state (XMLNode const &, int version); static const std::string state_node_name; + static StripableNotificationList const & last_selected() { return _last_selected; } protected: std::vector<boost::shared_ptr<ARDOUR::Route> > route_table; @@ -143,6 +154,14 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope private: LIBCONTROLCP_LOCAL ControlProtocol (const ControlProtocol&); /* noncopyable */ bool _active; + + + static Glib::Threads::Mutex first_selected_mutex; + static boost::weak_ptr<ARDOUR::Stripable> _first_selected_stripable; + static StripableNotificationList _last_selected; + static void stripable_selection_changed (StripableNotificationListPtr); + static bool selection_connected; + static PBD::ScopedConnection selection_connection; }; extern "C" { |