X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Foption_editor.h;h=749df8f90c70e5631770da0e315b19fa44c71ca2;hb=9ccc56e162554c292b25408246e3680b8f14eea7;hp=47afa77868f6186be211db07894235c8992619e0;hpb=8f930477be9e2c88859a8ea30b213fba3f7fc443;p=ardour.git diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h index 47afa77868..749df8f90c 100644 --- a/gtk2_ardour/option_editor.h +++ b/gtk2_ardour/option_editor.h @@ -14,18 +14,26 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ #ifndef __gtk_ardour_option_editor_h__ #define __gtk_ardour_option_editor_h__ -#include #include #include +#include +#include +#include +#include #include #include -#include "gtkmm2ext/slider_controller.h" +#include +#include +#include + +#include "widgets/slider_controller.h" + +#include "actions.h" #include "ardour_window.h" #include "audio_clock.h" #include "ardour/types.h" @@ -46,7 +54,7 @@ * options dialog. */ -namespace ARDOUR { +namespace PBD { class Configuration; } @@ -70,15 +78,15 @@ public: virtual void add_to_page (OptionEditorPage *) = 0; void add_widget_to_page (OptionEditorPage*, Gtk::Widget*); - void add_widgets_to_page (OptionEditorPage*, Gtk::Widget*, Gtk::Widget*); + void add_widgets_to_page (OptionEditorPage*, Gtk::Widget*, Gtk::Widget*, bool expand = true); void set_note (std::string const &); - virtual Gtk::Widget& tip_widget() = 0; + virtual Gtk::Widget& tip_widget() = 0; -private: +protected: void maybe_add_note (OptionEditorPage *, int); - + std::string _note; }; @@ -92,33 +100,58 @@ public: void set_state_from_config () {} void add_to_page (OptionEditorPage *); - Gtk::Widget& tip_widget() { return *_label; } + Gtk::Widget& tip_widget() { return *_label; } private: Gtk::Label* _label; ///< the label used for the heading }; -/** A component which provides a box into which a subclass can put arbitrary widgets */ -class OptionEditorBox : public OptionEditorComponent +/** Expanding layout helper to push elements to the left on a single column page */ +class OptionEditorBlank : public OptionEditorComponent { public: + OptionEditorBlank () {} - /** Construct an OpenEditorBox */ - OptionEditorBox () - { - _box = Gtk::manage (new Gtk::VBox); - _box->set_spacing (4); - } - - void parameter_changed (std::string const &) = 0; - void set_state_from_config () = 0; + void parameter_changed (std::string const &) {} + void set_state_from_config () {} void add_to_page (OptionEditorPage *); - Gtk::Widget& tip_widget() { return *_box->children().front().get_widget(); } + Gtk::Widget& tip_widget() { return _dummy; } +private: + Gtk::EventBox _dummy; +}; + +class RcConfigDisplay : public OptionEditorComponent +{ +public: + RcConfigDisplay (std::string const &, std::string const &, sigc::slot, char s = '\0'); + void add_to_page (OptionEditorPage *); + void parameter_changed (std::string const & p); + void set_state_from_config (); + Gtk::Widget& tip_widget() { return *_info; } protected: + sigc::slot _get; + Gtk::Label* _label; + Gtk::Label* _info; + std::string _id; + char _sep; +}; - Gtk::VBox* _box; ///< constituent box for subclasses to add widgets to +class RcActionButton : public OptionEditorComponent +{ +public: + RcActionButton (std::string const & t, const Glib::SignalProxy0< void >::SlotType & slot, std::string const & l = ""); + void add_to_page (OptionEditorPage *); + + void parameter_changed (std::string const & p) {} + void set_state_from_config () {} + Gtk::Widget& tip_widget() { return *_button; } + +protected: + Gtk::Button* _button; + Gtk::Label* _label; + std::string _name; }; /** Base class for components which provide UI to change an option */ @@ -151,16 +184,44 @@ public: } protected: - std::string _id; std::string _name; }; +/** Just a Gtk Checkbutton, masquerading as an option component */ +class CheckOption : public OptionEditorComponent , public Gtkmm2ext::Activatable +{ +public: + CheckOption (std::string const &, std::string const &, Glib::RefPtr act ); + virtual ~CheckOption (); + void set_state_from_config () {} + void parameter_changed (std::string const &) {} + void add_to_page (OptionEditorPage*); + + void set_sensitive (bool yn) { + _button->set_sensitive (yn); + } + + Gtk::Widget& tip_widget() { return *_button; } + +protected: + void action_toggled (); + void action_sensitivity_changed () {} + void action_visibility_changed () {} + + virtual void toggled (); + + Gtk::CheckButton* _button; ///< UI button + Gtk::Label* _label; ///< label for button, so we can use markup + +private: + sigc::connection _callback_connection; +}; + /** Component which provides the UI to handle a boolean option using a GTK CheckButton */ class BoolOption : public Option { public: - BoolOption (std::string const &, std::string const &, sigc::slot, sigc::slot); void set_state_from_config (); void add_to_page (OptionEditorPage*); @@ -169,11 +230,10 @@ public: _button->set_sensitive (yn); } - Gtk::Widget& tip_widget() { return *_button; } - -private: + Gtk::Widget& tip_widget() { return *_button; } - void toggled (); +protected: + virtual void toggled (); sigc::slot _get; ///< slot to get the configuration variable's value sigc::slot _set; ///< slot to set the configuration variable's value @@ -181,25 +241,54 @@ private: Gtk::Label* _label; ///< label for button, so we can use markup }; +class RouteDisplayBoolOption : public BoolOption +{ +public: + RouteDisplayBoolOption (std::string const &, std::string const &, sigc::slot, sigc::slot); + +protected: + virtual void toggled (); +}; + +/** Component which allows to add any GTK Widget - intended for single buttons and custom stateless objects */ +class FooOption : public OptionEditorComponent +{ +public: + FooOption (Gtk::Widget *w) : _w (w) {} + + void add_to_page (OptionEditorPage* p) { + add_widget_to_page (p, _w); + } + + Gtk::Widget& tip_widget() { return *_w; } + void set_state_from_config () {} + void parameter_changed (std::string const &) {} +private: + Gtk::Widget *_w; +}; + /** 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, sigc::slot); void set_state_from_config (); void add_to_page (OptionEditorPage*); + void set_sensitive (bool); + void set_invalid_chars (std::string i) { _invalid = i; } - Gtk::Widget& tip_widget() { return *_entry; } + Gtk::Widget& tip_widget() { return *_entry; } private: - void activated (); + bool focus_out (GdkEventFocus*); + void filter_text (const Glib::ustring&, int*); sigc::slot _get; ///< slot to get the configuration variable's value sigc::slot _set; ///< slot to set the configuration variable's value Gtk::Label* _label; ///< UI label Gtk::Entry* _entry; ///< UI entry + std::string _invalid; }; @@ -210,7 +299,6 @@ template class ComboOption : public Option { public: - /** Construct an ComboOption. * @param i id * @param n User-visible name. @@ -223,9 +311,9 @@ public: sigc::slot g, sigc::slot s ) - : Option (i, n), - _get (g), - _set (s) + : Option (i, n) + , _get (g) + , _set (s) { _label = Gtk::manage (new Gtk::Label (n + ":")); _label->set_alignment (0, 0.5); @@ -233,7 +321,8 @@ public: _combo->signal_changed().connect (sigc::mem_fun (*this, &ComboOption::changed)); } - void set_state_from_config () { + void set_state_from_config () + { uint32_t r = 0; while (r < _options.size() && _get () != _options[r]) { ++r; @@ -253,31 +342,33 @@ public: * @param e Enumeration. * @param o User-visible name for this value. */ - void add (T e, std::string const & o) { + void add (T e, std::string const & o) + { _options.push_back (e); _combo->append_text (o); } - void clear () { + void clear () + { _combo->clear_items(); _options.clear (); } - void changed () { + void changed () + { uint32_t const r = _combo->get_active_row_number (); if (r < _options.size()) { _set (_options[r]); } } - - void set_sensitive (bool yn) { + void set_sensitive (bool yn) + { _combo->set_sensitive (yn); } - Gtk::Widget& tip_widget() { return *_combo; } + Gtk::Widget& tip_widget() { return *_combo; } private: - sigc::slot _get; sigc::slot _set; Gtk::Label* _label; @@ -291,78 +382,43 @@ private: 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 = Gtk::manage (new Gtk::Label (n + ":")); - _label->set_alignment (0, 0.5); - _hscale = Gtk::manage (new Gtk::HScale(adj)); - _adj = NULL; - } - HSliderOption ( - std::string const & i, - std::string const & n, - Gtk::Adjustment *adj, - sigc::slot g, - sigc::slot s - ) - : Option (i, n) - , _get (g) - , _set (s) - , _adj (adj) - { - _label = Gtk::manage (new Gtk::Label (n + ":")); - _label->set_alignment (0, 0.5); - _hscale = Gtk::manage (new Gtk::HScale(*_adj)); - _adj->signal_value_changed().connect (sigc::mem_fun (*this, &HSliderOption::changed)); - } - - void set_state_from_config () { - if (_adj) _adj->set_value (_get()); - } - - void changed () { - if (_adj) _set (_adj->get_value ()); - } - - void add_to_page (OptionEditorPage* p) - { - add_widgets_to_page (p, _label, _hscale); - } + std::string const& i, + std::string const& n, + sigc::slot g, + sigc::slot s, + double lower, double upper, + double step_increment = 1, + double page_increment = 10, + double mult = 1.0, + bool logarithmic = false + ); - void set_sensitive (bool yn) { - _hscale->set_sensitive (yn); - } + void set_state_from_config (); + virtual void changed (); + void add_to_page (OptionEditorPage* p); + void set_sensitive (bool yn); - Gtk::Widget& tip_widget() { return *_hscale; } + Gtk::Widget& tip_widget() { return _hscale; } + Gtk::HScale& scale() { return _hscale; } -private: +protected: sigc::slot _get; sigc::slot _set; - Gtk::Label* _label; - Gtk::HScale* _hscale; - Gtk::Adjustment* _adj; + Gtk::Adjustment _adj; + Gtk::HScale _hscale; + Gtk::Label _label; + double _mult; + bool _log; }; + /** 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. @@ -374,53 +430,25 @@ public: std::string const & n, sigc::slot g, sigc::slot s - ) - : Option (i, n), - _get (g), - _set (s) - { - _label = Gtk::manage (new Gtk::Label (n + ":")); - _label->set_alignment (0, 0.5); - _combo = Gtk::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); - } + void set_state_from_config (); + void add_to_page (OptionEditorPage* p); /** Set the allowed strings for this option * @param strings a vector of allowed strings */ - void set_popdown_strings (const std::vector& strings) { - _combo->clear_items (); - for (std::vector::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_popdown_strings (const std::vector& strings); - void set_sensitive (bool yn) { - _combo->set_sensitive (yn); - } + void clear (); + void changed (); + void set_sensitive (bool yn); - Gtk::Widget& tip_widget() { return *_combo; } + Gtk::Widget& tip_widget() { return *_combo; } private: - sigc::slot _get; - sigc::slot _set; + sigc::slot _get; + sigc::slot _set; Gtk::Label* _label; Gtk::ComboBoxText* _combo; }; @@ -432,7 +460,6 @@ private: class BoolComboOption : public Option { public: - BoolComboOption ( std::string const &, std::string const &, @@ -447,10 +474,9 @@ public: void changed (); void set_sensitive (bool); - Gtk::Widget& tip_widget() { return *_combo; } + Gtk::Widget& tip_widget() { return *_combo; } private: - sigc::slot _get; sigc::slot _set; Gtk::Label* _label; @@ -458,7 +484,6 @@ private: }; - /** Component which provides the UI to handle an numeric option using a GTK SpinButton */ template class SpinOption : public Option @@ -475,6 +500,7 @@ public: * @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, @@ -486,12 +512,13 @@ public: T step, T page, std::string const & unit = "", - float scale = 1 + float scale = 1, + unsigned digits = 0 ) - : Option (i, n), - _get (g), - _set (s), - _scale (scale) + : Option (i, n) + , _get (g) + , _set (s) + , _scale (scale) { _label = Gtk::manage (new Gtk::Label (n + ":")); _label->set_alignment (0, 0.5); @@ -499,6 +526,7 @@ public: _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); @@ -517,7 +545,7 @@ public: void add_to_page (OptionEditorPage* p) { - add_widgets_to_page (p, _label, _box); + add_widgets_to_page (p, _label, _box, false); } void changed () @@ -525,7 +553,7 @@ public: _set (static_cast (_spin->get_value ()) * _scale); } - Gtk::Widget& tip_widget() { return *_spin; } + Gtk::Widget& tip_widget() { return *_spin; } private: sigc::slot _get; @@ -544,13 +572,15 @@ public: void set_state_from_config (); void add_to_page (OptionEditorPage *); - Gtk::Widget& tip_widget() { return *_db_slider; } + Gtk::Widget& tip_widget() { return *_db_slider; } private: void db_changed (); + void on_activate (); + bool on_key_press (GdkEventKey* ev); Gtk::Adjustment _db_adjustment; - Gtkmm2ext::HSliderController* _db_slider; + ArdourWidgets::HSliderController* _db_slider; Gtk::Entry _db_display; Gtk::Label _label; Gtk::HBox _box; @@ -559,6 +589,21 @@ private: sigc::slot _set; }; +class WidgetOption : public Option +{ + public: + WidgetOption (std::string const & i, std::string const & n, Gtk::Widget& w); + + void add_to_page (OptionEditorPage*); + void parameter_changed (std::string const &) {} + void set_state_from_config () {} + + Gtk::Widget& tip_widget() { return *_widget; } + + private: + Gtk::Widget* _widget; +}; + class ClockOption : public Option { public: @@ -567,8 +612,8 @@ public: void add_to_page (OptionEditorPage *); void set_session (ARDOUR::Session *); - Gtk::Widget& tip_widget() { return _clock; } - AudioClock& clock() { return _clock; } + Gtk::Widget& tip_widget() { return _clock; } + AudioClock& clock() { return _clock; } private: void save_clock_time (); @@ -587,12 +632,11 @@ public: void set_state_from_config (); void add_to_page (OptionEditorPage *); - Gtk::Widget& tip_widget() { return _file_chooser; } + Gtk::Widget& tip_widget() { return _file_chooser; } private: - void file_set (); - void current_folder_set (); - + void selection_changed (); + sigc::slot _get; ///< slot to get the configuration variable's value sigc::slot _set; ///< slot to set the configuration variable's value Gtk::FileChooserButton _file_chooser; @@ -606,37 +650,97 @@ class OptionEditorPage { public: OptionEditorPage (Gtk::Notebook&, std::string const &); + OptionEditorPage (); Gtk::VBox box; Gtk::Table table; std::list components; + +private: + void init (); +}; + +class OptionEditorMiniPage : public OptionEditorComponent, public OptionEditorPage +{ +public: + OptionEditorMiniPage () + { + box.pack_start (table, false, false); + box.set_border_width (0); + } + + void parameter_changed (std::string const &) = 0; + void set_state_from_config () = 0; + virtual void add_to_page (OptionEditorPage*); + + Gtk::Widget& tip_widget() { return *table.children().front().get_widget(); } }; /** The OptionEditor dialog base class */ -class OptionEditor : public ArdourWindow +class OptionEditor : virtual public sigc::trackable { public: - OptionEditor (ARDOUR::Configuration *, std::string const &); - ~OptionEditor (); + OptionEditor (PBD::Configuration *); + virtual ~OptionEditor (); void add_option (std::string const &, OptionEditorComponent *); + void add_page (std::string const &, Gtk::Widget& page_widget); void set_current_page (std::string const &); protected: - virtual void parameter_changed (std::string const &); - ARDOUR::Configuration* _config; + PBD::Configuration* _config; + Gtk::Notebook& notebook() { return _notebook; } + Gtk::TreeView& treeview() { return option_treeview; } -private: + class OptionColumns : public Gtk::TreeModel::ColumnRecord + { + public: + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn widget; - PBD::ScopedConnection config_connection; + OptionColumns() { + add (name); + add (widget); + } + }; + + OptionColumns option_columns; + Glib::RefPtr option_tree; +private: + PBD::ScopedConnection config_connection; Gtk::Notebook _notebook; + Gtk::TreeView option_treeview; std::map _pages; + + void add_path_to_treeview (std::string const &, Gtk::Widget&); + Gtk::TreeModel::iterator find_path_in_treemodel (std::string const & pn, + bool create_missing = false); + void treeview_row_selected (); }; -#endif /* __gtk_ardour_option_editor_h__ */ +/** The OptionEditor dialog-as-container base class */ +class OptionEditorContainer : public OptionEditor, public Gtk::VBox +{ +public: + OptionEditorContainer (PBD::Configuration *, std::string const &); + ~OptionEditorContainer() {} +private: + Gtk::HBox hpacker; +}; +/** The OptionEditor dialog-as-container base class */ +class OptionEditorWindow : public OptionEditor, public ArdourWindow +{ +public: + OptionEditorWindow (PBD::Configuration *, std::string const &); + ~OptionEditorWindow() {} +private: + Gtk::VBox container; + Gtk::HBox hpacker; +}; +#endif /* __gtk_ardour_option_editor_h__ */