- void mmc_port_chosen (MIDI::Port*,Gtk::RadioButton*, Gtk::Button*);
- void mtc_port_chosen (MIDI::Port*,Gtk::RadioButton*, Gtk::Button*);
- void midi_port_chosen (MIDI::Port*,Gtk::RadioButton*, Gtk::Button*);
- void midi_clock_port_chosen (MIDI::Port*,Gtk::RadioButton*, Gtk::Button*);
- bool port_removable (MIDI::Port*);
+/** 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)
+ * @param digits Number of decimal digits to show.
+ */
+ 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,
+ unsigned digits = 0
+ )
+ : Option (i, n)
+ , _get (g)
+ , _set (s)
+ , _scale (scale)
+ {
+ _label = Gtk::manage (new Gtk::Label (n + ":"));
+ _label->set_alignment (0, 0.5);
+
+ _spin = Gtk::manage (new Gtk::SpinButton);
+ _spin->set_range (min, max);
+ _spin->set_increments (step, page);
+ _spin->set_digits(digits);
+
+ _box = Gtk::manage (new Gtk::HBox);
+ _box->pack_start (*_spin, true, true);
+ _box->set_spacing (4);
+ if (unit.length()) {
+ _box->pack_start (*Gtk::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, false);
+ }
+
+ 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;
+};