LTC generator config
[ardour.git] / gtk2_ardour / option_editor.h
index c70e6c6bab76a330c7ad48d96291bf6d79cc8ab8..07c11ac8b457d36a96624665baecfef3c62bb61c 100644 (file)
@@ -74,6 +74,8 @@ public:
 
        void set_note (std::string const &);
 
+        virtual Gtk::Widget& tip_widget() = 0;
+
 private:
        void maybe_add_note (OptionEditorPage *, int);
        
@@ -90,6 +92,8 @@ public:
        void set_state_from_config () {}
        void add_to_page (OptionEditorPage *);
 
+        Gtk::Widget& tip_widget() { return *_label; }
+
 private:
        Gtk::Label* _label; ///< the label used for the heading
 };
@@ -110,6 +114,8 @@ public:
        void set_state_from_config () = 0;
        void add_to_page (OptionEditorPage *);
 
+        Gtk::Widget& tip_widget() { return *_box->children().front().get_widget(); }
+
 protected:
 
        Gtk::VBox* _box; ///< constituent box for subclasses to add widgets to
@@ -163,6 +169,8 @@ public:
                _button->set_sensitive (yn);
        }
 
+        Gtk::Widget& tip_widget() { return *_button; }
+
 private:
 
        void toggled ();
@@ -181,6 +189,8 @@ public:
        void set_state_from_config ();
        void add_to_page (OptionEditorPage*);
 
+        Gtk::Widget& tip_widget() { return *_entry; }
+
 private:
 
        void activated ();
@@ -192,7 +202,7 @@ private:
 };
 
 
-/** Component which provides the UI to handle an enumerated option using a GTK CheckButton.
+/** Component which provides the UI to handle an enumerated option using a GTK ComboBox.
  *  The template parameter is the enumeration.
  */
 template <class T>
@@ -263,6 +273,8 @@ public:
                _combo->set_sensitive (yn);
        }
 
+        Gtk::Widget& tip_widget() { return *_combo; }
+
 private:
 
        sigc::slot<T> _get;
@@ -273,6 +285,151 @@ private:
 };
 
 
+/** Component which provides the UI for a GTK HScale.
+ */
+class HSliderOption : public Option
+{
+public:
+
+       /** Construct an ComboOption.
+        *  @param i id
+        *  @param n User-visible name.
+        *  @param g Slot to get the variable's value.
+        *  @param s Slot to set the variable's value.
+        */
+       HSliderOption (
+               std::string const & i,
+               std::string const & n,
+               Gtk::Adjustment &adj
+               )
+               : Option (i, n)
+       {
+               _label = manage (new Gtk::Label (n + ":"));
+               _label->set_alignment (0, 0.5);
+               _hscale = manage (new Gtk::HScale(adj));
+       }
+
+       void set_state_from_config () { }
+
+       void add_to_page (OptionEditorPage* p)
+       {
+               add_widgets_to_page (p, _label, _hscale);
+       }
+
+       void set_sensitive (bool yn) {
+               _hscale->set_sensitive (yn);
+       }
+
+       Gtk::Widget& tip_widget() { return *_hscale; }
+
+private:
+       Gtk::Label* _label;
+       Gtk::HScale* _hscale;
+};
+
+/** Component which provides the UI to handle an enumerated option using a GTK ComboBox.
+ *  The template parameter is the enumeration.
+ */
+class ComboStringOption : public Option
+{
+public:
+
+       /** Construct an ComboOption.
+        *  @param i id
+        *  @param n User-visible name.
+        *  @param g Slot to get the variable's value.
+        *  @param s Slot to set the variable's value.
+        */
+       ComboStringOption (
+               std::string const & i,
+               std::string const & n,
+               sigc::slot<std::string> g,
+               sigc::slot<bool, std::string> s
+               )
+               : Option (i, n),
+                 _get (g),
+                 _set (s)
+       {
+               _label = manage (new Gtk::Label (n + ":"));
+               _label->set_alignment (0, 0.5);
+               _combo = manage (new Gtk::ComboBoxText);
+               _combo->signal_changed().connect (sigc::mem_fun (*this, &ComboStringOption::changed));
+       }
+
+       void set_state_from_config () {
+               _combo->set_active_text (_get());
+       }
+
+       void add_to_page (OptionEditorPage* p)
+       {
+               add_widgets_to_page (p, _label, _combo);
+       }
+
+       /** Set the allowed strings for this option
+        *  @param strings a vector of allowed strings
+        */
+        void set_popdown_strings (const std::vector<std::string>& strings) {
+               _combo->clear_items ();
+               for (std::vector<std::string>::const_iterator i = strings.begin(); i != strings.end(); ++i) {
+                       _combo->append_text (*i);
+               }
+       }
+
+       void clear () {
+               _combo->clear_items();
+       }
+
+       void changed () {
+               _set (_combo->get_active_text ());
+       }
+
+       void set_sensitive (bool yn) {
+               _combo->set_sensitive (yn);
+       }
+
+        Gtk::Widget& tip_widget() { return *_combo; }
+
+private:
+        sigc::slot<std::string> _get;
+        sigc::slot<bool, std::string> _set;
+       Gtk::Label* _label;
+       Gtk::ComboBoxText* _combo;
+};
+
+
+/** Component which provides the UI to handle a boolean option which needs
+ *  to be represented as a ComboBox to be clear to the user.
+ */
+class BoolComboOption : public Option
+{
+public:
+
+       BoolComboOption (
+               std::string const &,
+               std::string const &,
+               std::string const &,
+               std::string const &,
+               sigc::slot<bool>,
+               sigc::slot<bool, bool>
+               );
+
+       void set_state_from_config ();
+       void add_to_page (OptionEditorPage *);
+       void changed ();
+       void set_sensitive (bool);
+
+        Gtk::Widget& tip_widget() { return *_combo; }
+
+private:
+
+       sigc::slot<bool> _get;
+       sigc::slot<bool, bool> _set;
+       Gtk::Label* _label;
+       Gtk::ComboBoxText* _combo;
+};
+
+
+
 /** Component which provides the UI to handle an numeric option using a GTK SpinButton */
 template <class T>
 class SpinOption : public Option
@@ -339,6 +496,8 @@ public:
                _set (static_cast<T> (_spin->get_value ()) * _scale);
        }
 
+        Gtk::Widget& tip_widget() { return *_spin; }
+
 private:
        sigc::slot<T> _get;
        sigc::slot<bool, T> _set;
@@ -356,12 +515,15 @@ public:
        void set_state_from_config ();
        void add_to_page (OptionEditorPage *);
 
+        Gtk::Widget& tip_widget() { return *_db_slider; }
+
 private:
        void db_changed ();
 
        Gtk::Adjustment _db_adjustment;
        Gtkmm2ext::HSliderController* _db_slider;
        Glib::RefPtr<Gdk::Pixbuf> _pix;
+       Glib::RefPtr<Gdk::Pixbuf> _pix_desensitised;
        Gtk::Entry _db_display;
        Gtk::Label _label;
        Gtk::HBox _box;
@@ -378,6 +540,8 @@ public:
        void add_to_page (OptionEditorPage *);
        void set_session (ARDOUR::Session *);
 
+        Gtk::Widget& tip_widget() { return _clock; }
+
 private:
        Gtk::Label _label;
        AudioClock _clock;
@@ -393,6 +557,8 @@ public:
        void set_state_from_config ();
        void add_to_page (OptionEditorPage *);
 
+        Gtk::Widget& tip_widget() { return _file_chooser; }
+
 private:
        void file_set ();
        void current_folder_set ();