X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Foption_editor.h;h=b5d44d577ca048d3b94fb44cc8ddda13bb0c1fdd;hb=f66f7ba136c8588e47b3381ab07353e85f4100bf;hp=b896411a710226bb5ee7a00bf1ed371a25e0ae7c;hpb=1173bae7c20e1d7763ae092b1b98c92835b1562f;p=ardour.git diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h index b896411a71..b5d44d577c 100644 --- a/gtk2_ardour/option_editor.h +++ b/gtk2_ardour/option_editor.h @@ -25,7 +25,10 @@ #include #include #include +#include + #include "gtkmm2ext/slider_controller.h" + #include "ardour_window.h" #include "audio_clock.h" #include "ardour/types.h" @@ -46,7 +49,7 @@ * options dialog. */ -namespace ARDOUR { +namespace PBD { class Configuration; } @@ -74,9 +77,11 @@ public: void set_note (std::string const &); + virtual Gtk::Widget& tip_widget() = 0; + private: void maybe_add_note (OptionEditorPage *, int); - + std::string _note; }; @@ -90,6 +95,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,11 +117,45 @@ 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 }; +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; +}; + +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 */ class Option : public OptionEditorComponent { @@ -163,13 +204,41 @@ public: _button->set_sensitive (yn); } -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 _get; ///< slot to get the configuration variable's value sigc::slot _set; ///< slot to set the configuration variable's value - Gtk::CheckButton* _button; ///< UI button + Gtk::CheckButton* _button; ///< UI button + 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 */ @@ -180,15 +249,22 @@ 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; } 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; }; @@ -216,9 +292,9 @@ public: _get (g), _set (s) { - _label = manage (new Gtk::Label (n + ":")); + _label = Gtk::manage (new Gtk::Label (n + ":")); _label->set_alignment (0, 0.5); - _combo = manage (new Gtk::ComboBoxText); + _combo = Gtk::manage (new Gtk::ComboBoxText); _combo->signal_changed().connect (sigc::mem_fun (*this, &ComboOption::changed)); } @@ -263,6 +339,8 @@ public: _combo->set_sensitive (yn); } + Gtk::Widget& tip_widget() { return *_combo; } + private: sigc::slot _get; @@ -273,6 +351,147 @@ 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 = 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); + } + + void set_sensitive (bool yn) { + _hscale->set_sensitive (yn); + } + + Gtk::Widget& tip_widget() { return *_hscale; } + Gtk::HScale& scale() { return *_hscale; } + +private: + sigc::slot _get; + sigc::slot _set; + Gtk::Label* _label; + Gtk::HScale* _hscale; + Gtk::Adjustment* _adj; +}; + +/** 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 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); + } + + /** 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_sensitive (bool yn) { + _combo->set_sensitive (yn); + } + + Gtk::Widget& tip_widget() { return *_combo; } + +private: + sigc::slot _get; + sigc::slot _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. */ @@ -294,6 +513,8 @@ public: void changed (); void set_sensitive (bool); + Gtk::Widget& tip_widget() { return *_combo; } + private: sigc::slot _get; @@ -320,6 +541,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, @@ -331,25 +553,27 @@ 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) { - _label = manage (new Gtk::Label (n + ":")); + _label = Gtk::manage (new Gtk::Label (n + ":")); _label->set_alignment (0, 0.5); - _spin = manage (new Gtk::SpinButton); + _spin = Gtk::manage (new Gtk::SpinButton); _spin->set_range (min, max); _spin->set_increments (step, page); + _spin->set_digits(digits); - _box = manage (new Gtk::HBox); + _box = Gtk::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); + _box->pack_start (*Gtk::manage (new Gtk::Label (unit)), false, false); } _spin->signal_value_changed().connect (sigc::mem_fun (*this, &SpinOption::changed)); @@ -370,6 +594,8 @@ public: _set (static_cast (_spin->get_value ()) * _scale); } + Gtk::Widget& tip_widget() { return *_spin; } + private: sigc::slot _get; sigc::slot _set; @@ -387,13 +613,15 @@ public: void set_state_from_config (); void add_to_page (OptionEditorPage *); + 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; - Glib::RefPtr _pix; - Glib::RefPtr _pix_desensitised; Gtk::Entry _db_display; Gtk::Label _label; Gtk::HBox _box; @@ -405,16 +633,21 @@ private: class ClockOption : public Option { public: - ClockOption (std::string const &, std::string const &, sigc::slot, sigc::slot); + ClockOption (std::string const &, std::string const &, sigc::slot, sigc::slot); 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 _get; - sigc::slot _set; + sigc::slot _get; + sigc::slot _set; + ARDOUR::Session *_session; }; class DirectoryOption : public Option @@ -425,10 +658,11 @@ 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 (); - + 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; @@ -449,30 +683,70 @@ public: }; /** 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__ */