tweak transport bar spacing
[ardour.git] / libs / pbd / pbd / controllable.h
index c88eb298bcca4193dc57a5408d3a35d3fc2dcd31..9c059e9401c81ce7f077990c040f627cab8bfd04 100644 (file)
@@ -1,12 +1,33 @@
+/*
+    Copyright (C) 2000-2007 Paul Davis 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
 #ifndef __pbd_controllable_h__
 #define __pbd_controllable_h__
 
 #include <string>
+#include <set>
+#include <map>
 
-#include <sigc++/trackable.h>
-#include <sigc++/signal.h>
+#include "pbd/signals.h"
+#include <glibmm/thread.h>
 
-#include <pbd/statefuldestructible.h>
+#include "pbd/statefuldestructible.h"
 
 class XMLNode;
 
@@ -14,30 +35,85 @@ namespace PBD {
 
 class Controllable : public PBD::StatefulDestructible {
   public:
-       Controllable (std::string name);
-       virtual ~Controllable() { Destroyed (this); }
+       enum Flag {
+               Toggle = 0x1,
+               GainLike = 0x2,
+       };
 
-       virtual void set_value (float) = 0;
-       virtual float get_value (void) const = 0;
+       Controllable (const std::string& name, Flag f = Flag (0));
+       virtual ~Controllable() { Destroyed (this); }
 
-       virtual bool can_send_feedback() const { return true; }
+       /* We express Controllable values in one of three ways:
+        * 1. `user' --- as presented to the user (e.g. dB, Hz etc.)
+        * 2. `UI' --- as used in some cases for the internal representation
+        *    of the UI.  This may be the same as `user', or may be something
+        *    like the natural log of frequency in order that sliders operate
+        *    in a logarithmic fashion.
+        * 3. `plugin' --- as passed to a plugin.
+        */
 
-       sigc::signal<void> LearningFinished;
+       /** Set `user' value */
+       virtual void set_value (double) = 0;
+       /** @return `user' value */
+       virtual double get_value (void) const = 0;
 
-       static sigc::signal<bool,PBD::Controllable*> StartLearning;
-       static sigc::signal<void,PBD::Controllable*> StopLearning;
+       PBD::Signal0<void> LearningFinished;
+       static PBD::Signal3<void,PBD::Controllable*,int,int> CreateBinding;
+       static PBD::Signal1<void,PBD::Controllable*> DeleteBinding;
 
-       static sigc::signal<void,Controllable*> Destroyed;
+       static PBD::Signal1<bool,PBD::Controllable*> StartLearning;
+       static PBD::Signal1<void,PBD::Controllable*> StopLearning;
 
-       sigc::signal<void> Changed;
+       static PBD::Signal1<void,Controllable*> Destroyed;
+       
+       PBD::Signal0<void> Changed;
 
-       int set_state (const XMLNode&);
+       int set_state (const XMLNode&, int version);
        XMLNode& get_state ();
 
-       std::string name() const { return _name; }
+       std::string name()      const { return _name; }
+
+       bool touching () const { return _touching; }
+       void set_touching (bool yn) { _touching = yn; }
 
+       bool is_toggle() const { return _flags & Toggle; }
+       bool is_gain_like() const { return _flags & GainLike; }
+
+        virtual double lower() const { return 0.0; }
+        virtual double upper() const { return 1.0; }
+
+       Flag flags() const { return _flags; }
+       void set_flags (Flag f);
+
+       static Controllable* by_id (const PBD::ID&);
+       static Controllable* by_name (const std::string&);
+        static const std::string xml_node_name;
   private:
        std::string _name;
+
+       Flag        _flags;
+       bool        _touching;
+
+       static void add (Controllable&);
+       static void remove (Controllable*);
+
+       typedef std::set<PBD::Controllable*> Controllables;
+       static Glib::StaticRWLock registry_lock;
+       static Controllables registry;
+};
+
+/* a utility class for the occasions when you need but do not have
+   a Controllable
+*/
+
+class IgnorableControllable : public Controllable 
+{
+  public: 
+       IgnorableControllable () : PBD::Controllable ("ignoreMe") {}
+       ~IgnorableControllable () {}
+    
+       void set_value (double /*v*/) {}
+       double get_value () const { return 0.0; }
 };
 
 }