Use LV2_SUPPORT define instead of HAVE_SLV2.
[ardour.git] / gtk2_ardour / option_editor.h
index 5b22cf4cc51fe239590c5f202cdcd286651ecfec..b81672e094035b6651062ca7a5b4dd7695c74c0c 100644 (file)
 #include <gtkmm/comboboxtext.h>
 #include <gtkmm/spinbutton.h>
 #include <gtkmm/table.h>
+#include "gtkmm2ext/slider_controller.h"
 #include "ardour_dialog.h"
+#include "audio_clock.h"
+#include "ardour/types.h"
 
 /** @file option_editor.h
  *  @brief Base class for option editing dialog boxes.
@@ -53,6 +56,8 @@ class OptionEditorPage;
 class OptionEditorComponent
 {
 public:
+       virtual ~OptionEditorComponent() {}
+
        /** Called when a configuration parameter's value has changed.
         *  @param p parameter name
         */
@@ -99,13 +104,13 @@ public:
        void add_to_page (OptionEditorPage *);
 
 protected:
-       
+
        Gtk::VBox* _box; ///< constituent box for subclasses to add widgets to
 };
 
 /** Base class for components which provide UI to change an option */
-class Option : public OptionEditorComponent {
-       
+class Option : public OptionEditorComponent
+{
 public:
        /** Construct an Option.
         *  @param i Option id (e.g. "plugins-stop-with-transport")
@@ -124,43 +129,68 @@ public:
                        set_state_from_config ();
                }
        }
-       
+
        virtual void set_state_from_config () = 0;
        virtual void add_to_page (OptionEditorPage*) = 0;
 
        std::string id () const {
                return _id;
        }
-       
-private:
-       
+
+protected:
+
        std::string _id;
        std::string _name;
 };
 
 /** Component which provides the UI to handle a boolean option using a GTK CheckButton */
-class BoolOption : public Option {
-
+class BoolOption : public Option
+{
 public:
-       
+
        BoolOption (std::string const &, std::string const &, sigc::slot<bool>, sigc::slot<bool, bool>);
        void set_state_from_config ();
-       void toggled ();
        void add_to_page (OptionEditorPage*);
+
+       void set_sensitive (bool yn) {
+               _button->set_sensitive (yn);
+       }
        
 private:
-       
+
+       void toggled ();
+
        sigc::slot<bool> _get; ///< slot to get the configuration variable's value
        sigc::slot<bool, bool> _set;  ///< slot to set the configuration variable's value
        Gtk::CheckButton* _button; ///< UI button
 };
 
+/** Component which provides the UI to handle a string option using a GTK Entry */
+class EntryOption : public Option
+{
+public:
+
+       EntryOption (std::string const &, std::string const &, sigc::slot<std::string>, sigc::slot<bool, std::string>);
+       void set_state_from_config ();
+       void add_to_page (OptionEditorPage*);
+
+private:
+
+       void activated ();
+
+       sigc::slot<std::string> _get; ///< slot to get the configuration variable's value
+       sigc::slot<bool, std::string> _set;  ///< slot to set the configuration variable's value
+       Gtk::Label* _label; ///< UI label
+       Gtk::Entry* _entry; ///< UI entry
+};
+
+
 /** Component which provides the UI to handle an enumerated option using a GTK CheckButton.
  *  The template parameter is the enumeration.
  */
 template <class T>
-class ComboOption : public Option {
-       
+class ComboOption : public Option
+{
 public:
 
        /** Construct an ComboOption.
@@ -180,7 +210,7 @@ public:
                  _set (s)
        {
                _label = manage (new Gtk::Label (n + ":"));
-               _label->set_alignment (1, 0.5);
+               _label->set_alignment (0, 0.5);
                _combo = manage (new Gtk::ComboBoxText);
                _combo->signal_changed().connect (sigc::mem_fun (*this, &ComboOption::changed));
        }
@@ -190,7 +220,7 @@ public:
                while (r < _options.size() && _get () != _options[r]) {
                        ++r;
                }
-               
+
                if (r < _options.size()) {
                        _combo->set_active (r);
                }
@@ -209,7 +239,12 @@ public:
                _options.push_back (e);
                _combo->append_text (o);
        }
-       
+
+       void clear () {
+               _combo->clear_items();
+               _options.clear ();
+       }
+
        void changed () {
                uint32_t const r = _combo->get_active_row_number ();
                if (r < _options.size()) {
@@ -217,8 +252,12 @@ public:
                }
        }
 
+       void set_sensitive (bool yn) {
+               _combo->set_sensitive (yn);
+       }
+
 private:
-       
+
        sigc::slot<T> _get;
        sigc::slot<bool, T> _set;
        Gtk::Label* _label;
@@ -241,6 +280,8 @@ public:
         *  @param max Variable maximum value.
         *  @param step Step for the spin button.
         *  @param page Page step for the spin button.
+        *  @param unit Unit name.
+        *  @param scale Scaling factor (such that for a value x in the spinbutton, x * scale is written to the config)
         */
        SpinOption (
                std::string const & i,
@@ -250,42 +291,92 @@ public:
                T min,
                T max,
                T step,
-               T page
+               T page,
+               std::string const & unit = "",
+               float scale = 1
                )
                : Option (i, n),
                  _get (g),
-                 _set (s)
+                 _set (s),
+                 _scale (scale)
        {
                _label = manage (new Gtk::Label (n + ":"));
-               _label->set_alignment (1, 0.5);
+               _label->set_alignment (0, 0.5);
+
                _spin = manage (new Gtk::SpinButton);
                _spin->set_range (min, max);
                _spin->set_increments (step, page);
+
+               _box = manage (new Gtk::HBox);
+               _box->pack_start (*_spin, true, true);
+               _box->set_spacing (4);
+               if (unit.length()) {
+                       _box->pack_start (*manage (new Gtk::Label (unit)), false, false);
+               }
+
                _spin->signal_value_changed().connect (sigc::mem_fun (*this, &SpinOption::changed));
        }
 
        void set_state_from_config ()
        {
-               _spin->set_value (_get ());
+               _spin->set_value (_get () / _scale);
        }
 
        void add_to_page (OptionEditorPage* p)
        {
-               add_widgets_to_page (p, _label, _spin);
+               add_widgets_to_page (p, _label, _box);
        }
-       
+
        void changed ()
        {
-               _set (static_cast<T> (_spin->get_value ()));
+               _set (static_cast<T> (_spin->get_value ()) * _scale);
        }
-       
+
 private:
        sigc::slot<T> _get;
        sigc::slot<bool, T> _set;
+       float _scale;
        Gtk::Label* _label;
+       Gtk::HBox* _box;
        Gtk::SpinButton* _spin;
 };
 
+class FaderOption : public Option
+{
+public:
+
+       FaderOption (std::string const &, std::string const &, sigc::slot<ARDOUR::gain_t> g, sigc::slot<bool, ARDOUR::gain_t> s);
+       void set_state_from_config ();
+       void add_to_page (OptionEditorPage *);
+
+private:
+       void db_changed ();
+       
+       Gtk::Adjustment _db_adjustment;
+       Gtkmm2ext::HSliderController* _db_slider;
+       Glib::RefPtr<Gdk::Pixbuf> _pix;
+       Gtk::Entry _db_display;
+       Gtk::Label _label;
+       Gtk::HBox _box;
+       sigc::slot<ARDOUR::gain_t> _get;
+       sigc::slot<bool, ARDOUR::gain_t> _set;
+};
+
+class ClockOption : public Option
+{
+public:
+       ClockOption (std::string const &, std::string const &, sigc::slot<ARDOUR::framecnt_t>, sigc::slot<bool, ARDOUR::framecnt_t>);
+       void set_state_from_config ();
+       void add_to_page (OptionEditorPage *);
+       void set_session (ARDOUR::Session *);
+
+private:
+       Gtk::Label _label;
+       AudioClock _clock;
+       sigc::slot<ARDOUR::framecnt_t> _get;
+       sigc::slot<bool, ARDOUR::framecnt_t> _set;
+};
+
 /** Class to represent a single page in an OptionEditor's notebook.
  *  Pages are laid out using a 3-column table; the 1st column is used
  *  to indent non-headings, and the 2nd and 3rd for actual content.
@@ -307,14 +398,19 @@ public:
        OptionEditor (ARDOUR::Configuration *, std::string const &);
        ~OptionEditor ();
 
-       void add (std::string const &, OptionEditorComponent *);
+       void add_option (std::string const &, OptionEditorComponent *);
+
+       void set_current_page (std::string const &);
 
 protected:
+
+       virtual void parameter_changed (std::string const &);
        
        ARDOUR::Configuration* _config;
-       
+
 private:
-       void parameter_changed (std::string const &);
+
+       PBD::ScopedConnection config_connection;
 
        Gtk::Notebook _notebook;
        std::map<std::string, OptionEditorPage*> _pages;