+
+/** Component which provides the UI to handle an numeric option using a GTK SpinButton */
+template <class T>
+class SpinOption : public Option
+{
+public:
+ /** Construct an SpinOption.
+ * @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.
+ * @param min Variable minimum value.
+ * @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,
+ std::string const & n,
+ sigc::slot<T> g,
+ sigc::slot<bool, T> s,
+ T min,
+ T max,
+ T step,
+ T page,
+ std::string const & unit = "",
+ float scale = 1
+ )
+ : Option (i, n),
+ _get (g),
+ _set (s),
+ _scale (scale)
+ {
+ _label = manage (new Gtk::Label (n + ":"));
+ _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 () / _scale);
+ }
+
+ void add_to_page (OptionEditorPage* p)
+ {
+ add_widgets_to_page (p, _label, _box);
+ }
+
+ void changed ()
+ {
+ _set (static_cast<T> (_spin->get_value ()) * _scale);
+ }
+
+ Gtk::Widget& tip_widget() { return *_spin; }
+
+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 *);
+
+ 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;
+ Gtk::VBox _fader_centering_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<std::string>, sigc::slot<bool, std::string>);
+ void set_state_from_config ();
+ void add_to_page (OptionEditorPage *);
+ void set_session (ARDOUR::Session *);
+
+ Gtk::Widget& tip_widget() { return _clock; }
+ AudioClock& clock() { return _clock; }
+
+private:
+ void save_clock_time ();
+ Gtk::Label _label;
+ AudioClock _clock;
+ sigc::slot<std::string> _get;
+ sigc::slot<bool, std::string> _set;
+ ARDOUR::Session *_session;
+};
+
+class DirectoryOption : public Option
+{
+public:
+ DirectoryOption (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 *);
+
+ Gtk::Widget& tip_widget() { return _file_chooser; }
+
+private:
+ void file_set ();
+ void current_folder_set ();