Re-order route group editor list columns to match up with the order in the route...
[ardour.git] / gtk2_ardour / option_editor.h
index f5509c760cc6f5e3d24de557772f4bdbdfe5ebdc..f43f71342bb98a8efb605472d46e05fe0a405945 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
         */
@@ -104,8 +109,8 @@ protected:
 };
 
 /** 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")
@@ -132,21 +137,25 @@ public:
                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 add_to_page (OptionEditorPage*);
 
+       void set_sensitive (bool yn) {
+               _button->set_sensitive (yn);
+       }
+
 private:
 
        void toggled ();
@@ -157,8 +166,8 @@ private:
 };
 
 /** Component which provides the UI to handle a string option using a GTK Entry */
-class EntryOption : public Option {
-
+class EntryOption : public Option
+{
 public:
 
        EntryOption (std::string const &, std::string const &, sigc::slot<std::string>, sigc::slot<bool, std::string>);
@@ -180,8 +189,8 @@ private:
  *  The template parameter is the enumeration.
  */
 template <class T>
-class ComboOption : public Option {
-
+class ComboOption : public Option
+{
 public:
 
        /** Construct an ComboOption.
@@ -201,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));
        }
@@ -231,6 +240,11 @@ public:
                _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()) {
@@ -238,6 +252,10 @@ public:
                }
        }
 
+       void set_sensitive (bool yn) {
+               _combo->set_sensitive (yn);
+       }
+
 private:
 
        sigc::slot<T> _get;
@@ -283,7 +301,7 @@ public:
                  _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);
@@ -323,6 +341,42 @@ private:
        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.
@@ -346,13 +400,17 @@ public:
 
        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;