summaryrefslogtreecommitdiff
path: root/libs/surfaces/control_protocol
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-07-06 13:36:55 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-07-06 13:39:10 -0400
commit2047ee527c688ed2c2bedea79a7e01088da58d72 (patch)
treea9326585d3bfeb12c87e2879b7280e5368b18013 /libs/surfaces/control_protocol
parenteed3ea5047ae50484542cacece0df1fd9db2e4d0 (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.cc50
-rw-r--r--libs/surfaces/control_protocol/control_protocol/control_protocol.h19
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" {