diff options
Diffstat (limited to 'gtk2_ardour/option_editor.h')
-rw-r--r-- | gtk2_ardour/option_editor.h | 468 |
1 files changed, 277 insertions, 191 deletions
diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h index 802a088e20..5b22cf4cc5 100644 --- a/gtk2_ardour/option_editor.h +++ b/gtk2_ardour/option_editor.h @@ -1,8 +1,5 @@ -#ifndef __gtk_ardour_option_editor_h__ -#define __gtk_ardour_option_editor_h__ - /* - Copyright (C) 2001 Paul Davis + Copyright (C) 2009 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,218 +17,307 @@ */ -#include <vector> +#ifndef __gtk_ardour_option_editor_h__ +#define __gtk_ardour_option_editor_h__ #include <gtkmm/notebook.h> #include <gtkmm/checkbutton.h> -#include <gtkmm/table.h> -#include <gtkmm/entry.h> -#include <gtkmm/box.h> -#include <gtkmm/label.h> -#include <gtkmm/adjustment.h> -#include <gtkmm/scale.h> -#include <gtkmm/spinbutton.h> -#include <gtkmm/radiobutton.h> #include <gtkmm/comboboxtext.h> - -#include "ardour/session.h" - +#include <gtkmm/spinbutton.h> +#include <gtkmm/table.h> #include "ardour_dialog.h" -#include "editing.h" -#include "audio_clock.h" - -class ARDOUR_UI; -class PublicEditor; -class Mixer_UI; -class IOSelector; -class GainMeter; -class PannerUI; -class OptionEditor : public ArdourDialog +/** @file option_editor.h + * @brief Base class for option editing dialog boxes. + * + * Code to provided the basis for dialogs which allow the user to edit options + * from an ARDOUR::Configuration class. + * + * The idea is that we have an OptionEditor class which is the dialog box. + * This is essentially a GTK Notebook. OptionEditorComponent objects can + * then be added to the OptionEditor, and these components are arranged on + * the pages of the Notebook. There is also an OptionEditorComponent hierarchy + * here, providing things like boolean and combobox option components. + * + * It is intended that OptionEditor be subclassed to implement a particular + * options dialog. + */ + +namespace ARDOUR { + class Configuration; +} + +class OptionEditorPage; + +/** Base class for components of an OptionEditor dialog */ +class OptionEditorComponent { - public: - OptionEditor (ARDOUR_UI&, PublicEditor&, Mixer_UI&); - ~OptionEditor (); - - void set_session (ARDOUR::Session *); - void save (); - - private: - ARDOUR::Session *session; - ARDOUR_UI& ui; - PublicEditor& editor; - Mixer_UI& mixer; - - Gtk::Notebook notebook; - - /* Generic */ - - gint wm_close (GdkEventAny *); - bool focus_out_event_handler (GdkEventFocus*, void (OptionEditor::*pmf)()); - void parameter_changed (const char* name); - - /* paths */ - - Gtk::Table path_table; - Gtk::Entry session_raid_entry; - - void setup_path_options(); - void add_session_paths (); - void remove_session_paths (); - void raid_path_changed (); - - /* misc */ +public: + /** Called when a configuration parameter's value has changed. + * @param p parameter name + */ + virtual void parameter_changed (std::string const & p) = 0; - Gtk::VBox misc_packer; + /** Called to instruct the object to set its UI state from the configuration */ + virtual void set_state_from_config () = 0; - Gtk::Adjustment short_xfade_adjustment; - Gtk::HScale short_xfade_slider; - Gtk::Adjustment destructo_xfade_adjustment; - Gtk::HScale destructo_xfade_slider; + /** Called to instruct the object to add itself to an OptionEditorPage */ + virtual void add_to_page (OptionEditorPage *) = 0; - void setup_misc_options(); - - void short_xfade_adjustment_changed (); - void destructo_xfade_adjustment_changed (); - - Gtk::Adjustment history_depth; - Gtk::Adjustment saved_history_depth; - Gtk::SpinButton history_depth_spinner; - Gtk::SpinButton saved_history_depth_spinner; - Gtk::CheckButton limit_history_button; - Gtk::CheckButton save_history_button; - - void history_depth_changed(); - void saved_history_depth_changed(); - void save_history_toggled (); - void limit_history_toggled (); - - /* Sync */ - - Gtk::VBox sync_packer; - - Gtk::ComboBoxText slave_type_combo; - AudioClock smpte_offset_clock; - Gtk::CheckButton smpte_offset_negative_button; - Gtk::CheckButton synced_timecode_button; - - void setup_sync_options (); - - void smpte_offset_chosen (); - void smpte_offset_negative_clicked (); - void synced_timecode_toggled (); + void add_widget_to_page (OptionEditorPage*, Gtk::Widget*); + void add_widgets_to_page (OptionEditorPage*, Gtk::Widget*, Gtk::Widget*); +}; - /* MIDI */ +/** A component which provides a subheading within the dialog */ +class OptionEditorHeading : public OptionEditorComponent +{ +public: + OptionEditorHeading (std::string const &); - Gtk::VBox midi_packer; + void parameter_changed (std::string const &) {} + void set_state_from_config () {} + void add_to_page (OptionEditorPage *); - Gtk::RadioButton::Group mtc_button_group; - Gtk::RadioButton::Group mmc_button_group; - Gtk::RadioButton::Group midi_button_group; - Gtk::RadioButton::Group midi_clock_button_group; +private: + Gtk::Label* _label; ///< the label used for the heading +}; - Gtk::Table midi_port_table; - std::vector<Gtk::Widget*> midi_port_table_widgets; - Gtk::Adjustment mmc_receive_device_id_adjustment; - Gtk::SpinButton mmc_receive_device_id_spinner; - Gtk::Adjustment mmc_send_device_id_adjustment; - Gtk::SpinButton mmc_send_device_id_spinner; - Gtk::Button add_midi_port_button; - Gtk::Adjustment initial_program_change_adjustment; - Gtk::SpinButton initial_program_change_spinner; +/** A component which provides a box into which a subclass can put arbitrary widgets */ +class OptionEditorBox : public OptionEditorComponent +{ +public: + + /** 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 add_to_page (OptionEditorPage *); + +protected: + + Gtk::VBox* _box; ///< constituent box for subclasses to add widgets to +}; - void add_midi_port (); - void remove_midi_port (MIDI::Port*); - void redisplay_midi_ports (); +/** Base class for components which provide UI to change an option */ +class Option : public OptionEditorComponent { + +public: + /** Construct an Option. + * @param i Option id (e.g. "plugins-stop-with-transport") + * @param n User-visible name (e.g. "Stop plugins when the transport is stopped") + */ + Option (std::string const & i, + std::string const & n + ) + : _id (i), + _name (n) + {} + + void parameter_changed (std::string const & p) + { + if (p == _id) { + set_state_from_config (); + } + } + + virtual void set_state_from_config () = 0; + virtual void add_to_page (OptionEditorPage*) = 0; + + std::string id () const { + return _id; + } + +private: + + std::string _id; + std::string _name; +}; - void port_online_toggled (MIDI::Port*,Gtk::ToggleButton*); - void port_trace_in_toggled (MIDI::Port*,Gtk::ToggleButton*); - void port_trace_out_toggled (MIDI::Port*,Gtk::ToggleButton*); +/** 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<bool>, sigc::slot<bool, bool>); + void set_state_from_config (); + void toggled (); + void add_to_page (OptionEditorPage*); + +private: + + sigc::slot<bool> _get; ///< slot to get the configuration variable's value + sigc::slot<bool, bool> _set; ///< slot to set the configuration variable's value + Gtk::CheckButton* _button; ///< UI button +}; - 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 enumerated option using a GTK CheckButton. + * The template parameter is the enumeration. + */ +template <class T> +class ComboOption : 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. + */ + ComboOption ( + std::string const & i, + std::string const & n, + sigc::slot<T> g, + sigc::slot<bool, T> s + ) + : Option (i, n), + _get (g), + _set (s) + { + _label = manage (new Gtk::Label (n + ":")); + _label->set_alignment (1, 0.5); + _combo = manage (new Gtk::ComboBoxText); + _combo->signal_changed().connect (sigc::mem_fun (*this, &ComboOption::changed)); + } + + void set_state_from_config () { + uint32_t r = 0; + while (r < _options.size() && _get () != _options[r]) { + ++r; + } + + if (r < _options.size()) { + _combo->set_active (r); + } + } + + void add_to_page (OptionEditorPage* p) + { + add_widgets_to_page (p, _label, _combo); + } + + /** Add an allowed value for this option. + * @param e Enumeration. + * @param o User-visible name for this value. + */ + void add (T e, std::string const & o) { + _options.push_back (e); + _combo->append_text (o); + } + + void changed () { + uint32_t const r = _combo->get_active_row_number (); + if (r < _options.size()) { + _set (_options[r]); + } + } + +private: + + sigc::slot<T> _get; + sigc::slot<bool, T> _set; + Gtk::Label* _label; + Gtk::ComboBoxText* _combo; + std::vector<T> _options; +}; - void mmc_receive_device_id_adjusted (); - void mmc_send_device_id_adjusted (); - void initial_program_change_adjusted (); +/** 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. + */ + 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 + ) + : Option (i, n), + _get (g), + _set (s) + { + _label = manage (new Gtk::Label (n + ":")); + _label->set_alignment (1, 0.5); + _spin = manage (new Gtk::SpinButton); + _spin->set_range (min, max); + _spin->set_increments (step, page); + _spin->signal_value_changed().connect (sigc::mem_fun (*this, &SpinOption::changed)); + } + + void set_state_from_config () + { + _spin->set_value (_get ()); + } + + void add_to_page (OptionEditorPage* p) + { + add_widgets_to_page (p, _label, _spin); + } + + void changed () + { + _set (static_cast<T> (_spin->get_value ())); + } + +private: + sigc::slot<T> _get; + sigc::slot<bool, T> _set; + Gtk::Label* _label; + Gtk::SpinButton* _spin; +}; - void map_port_online (MIDI::Port*, Gtk::ToggleButton*); +/** Class to represent a single page in an OptionEditor's notebook. + * Pages are laid out using a 3-column table; the 1st column is used + * to indent non-headings, and the 2nd and 3rd for actual content. + */ +class OptionEditorPage +{ +public: + OptionEditorPage (Gtk::Notebook&, std::string const &); - void setup_midi_options(); + Gtk::VBox box; + Gtk::Table table; + std::list<OptionEditorComponent*> components; +}; - enum PortIndex { - MtcIndex = 0, - MmcIndex = 1, - MidiIndex = 2, - MidiClockIndex = 3 - }; +/** The OptionEditor dialog base class */ +class OptionEditor : public ArdourDialog +{ +public: + OptionEditor (ARDOUR::Configuration *, std::string const &); + ~OptionEditor (); - std::map<MIDI::Port*,std::vector<Gtk::RadioButton*> > port_toggle_buttons; + void add (std::string const &, OptionEditorComponent *); - /* Click */ +protected: + + ARDOUR::Configuration* _config; + +private: + void parameter_changed (std::string const &); - IOSelector* click_io_selector; - GainMeter* click_gpm; - PannerUI* click_panner; - bool first_click_setup; - Gtk::HBox click_hpacker; - Gtk::VBox click_packer; - Gtk::Table click_table; - Gtk::Entry click_path_entry; - Gtk::Entry click_emphasis_path_entry; - Gtk::Button click_browse_button; - Gtk::Button click_emphasis_browse_button; - - void setup_click_editor (); - void clear_click_editor (); - - void click_chosen (const std::string & paths); - void click_emphasis_chosen (const std::string & paths); - - void click_browse_clicked (); - void click_emphasis_browse_clicked (); - - void click_sound_changed (); - void click_emphasis_sound_changed (); - - /* Auditioner */ - - Gtk::VBox audition_packer; - Gtk::HBox audition_hpacker; - Gtk::Label audition_label; - IOSelector* auditioner_io_selector; - GainMeter* auditioner_gpm; - PannerUI* auditioner_panner; - - void setup_auditioner_editor (); - void clear_auditioner_editor (); - void connect_audition_editor (); - - /* keyboard/mouse */ - - Gtk::Table keyboard_mouse_table; - Gtk::ComboBoxText keyboard_layout_selector; - Gtk::ComboBoxText edit_modifier_combo; - Gtk::ComboBoxText delete_modifier_combo; - Gtk::ComboBoxText snap_modifier_combo; - Gtk::Adjustment delete_button_adjustment; - Gtk::SpinButton delete_button_spin; - Gtk::Adjustment edit_button_adjustment; - Gtk::SpinButton edit_button_spin; - - std::map<std::string,std::string> bindings_files; - - void setup_keyboard_options (); - void delete_modifier_chosen (); - void edit_modifier_chosen (); - void snap_modifier_chosen (); - void edit_button_changed (); - void delete_button_changed (); - void bindings_changed (); + Gtk::Notebook _notebook; + std::map<std::string, OptionEditorPage*> _pages; }; #endif /* __gtk_ardour_option_editor_h__ */ |