X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Frc_option_editor.cc;h=7596c6fb530f5f95ba8acafa878bc87e30a62619;hb=0444ce1d5efb523fa5f9bf1e793c5123b3b5f4d3;hp=877ad6a517e351f69252c48d9042f0c6ef5a36af;hpb=4d0be2ee2efbfbd8508385d833503e6fa59fa309;p=ardour.git diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 877ad6a517..7596c6fb53 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -21,9 +21,13 @@ #include "gtk2ardour-config.h" #endif +#if !defined USE_CAIRO_IMAGE_SURFACE && !defined NDEBUG +#define OPTIONAL_CAIRO_IMAGE_SURFACE +#endif + #include -#include +#include #include #include @@ -33,11 +37,13 @@ #include #include #include +#include #include "pbd/fpu.h" #include "pbd/cpus.h" #include "ardour/audioengine.h" +#include "ardour/profile.h" #include "ardour/dB.h" #include "ardour/rc_configuration.h" #include "ardour/control_protocol_manager.h" @@ -46,9 +52,10 @@ #include "canvas/wave_view.h" -#include "ardour_ui.h" #include "ardour_window.h" #include "ardour_dialog.h" +#include "ardour_ui.h" +#include "color_theme_manager.h" #include "gui_thread.h" #include "meter_patterns.h" #include "midi_tracer.h" @@ -59,7 +66,7 @@ #include "keyboard.h" #include "theme_manager.h" #include "ui_config.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace Gtk; @@ -68,149 +75,58 @@ using namespace PBD; using namespace ARDOUR; using namespace ARDOUR_UI_UTILS; -class AutoReturnTargetOptions : public OptionEditorBox +class ClickOptions : public OptionEditorBox { - public: - AutoReturnTargetOptions (RCConfiguration* c, Gtk::Window* p) +public: + ClickOptions (RCConfiguration* c) : _rc_config (c) - , range_selection_button (_("Play Range Selection")) - , last_roll_button (_("Play from Last Roll")) - , loop_button (_("Play Loop")) - , region_selection_button (_("Play Region Selection")) - , toggle_button (_("Enable/Disable all options")) + , _click_browse_button (_("Browse...")) + , _click_emphasis_browse_button (_("Browse...")) { - _box->pack_start (range_selection_button, false, false); - range_selection_button.signal_toggled().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::range_selection_toggled)); - - _box->pack_start (loop_button, false, false); - loop_button.signal_toggled().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::loop_toggled)); - - _box->pack_start (region_selection_button, false, false); - region_selection_button.signal_toggled().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::region_selection_toggled)); + Table* t = manage (new Table (4, 3)); + t->set_spacings (4); - _box->pack_start (last_roll_button, false, false); - last_roll_button.signal_toggled().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::last_roll_toggled)); + Label* l = manage (left_aligned_label (_("Emphasis on first beat:"))); + t->attach (*l, 0, 1, 1, 2, FILL); + t->attach (_use_emphasis_on_click_check_button, 1, 2, 1, 2, FILL); + _use_emphasis_on_click_check_button.signal_toggled().connect ( + sigc::mem_fun (*this, &ClickOptions::use_emphasis_on_click_toggled)); - HBox* hbox = manage (new HBox); - /* keep the toggle button small */ - hbox->pack_start (toggle_button, false, false); - _box->pack_start (*hbox, false, false); + l = manage (left_aligned_label (_("Use default Click:"))); + t->attach (*l, 0, 1, 0, 1, FILL); + t->attach (_use_default_click_check_button, 1, 2, 0, 1, FILL); + _use_default_click_check_button.signal_toggled().connect ( + sigc::mem_fun (*this, &ClickOptions::use_default_click_toggled)); - toggle_button.signal_clicked().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::toggle)); + l = manage (left_aligned_label (_("Click audio file:"))); + t->attach (*l, 0, 1, 2, 3, FILL); + t->attach (_click_path_entry, 1, 2, 2, 3, FILL); + _click_browse_button.signal_clicked ().connect ( + sigc::mem_fun (*this, &ClickOptions::click_browse_clicked)); + t->attach (_click_browse_button, 2, 3, 2, 3, FILL); - Gtkmm2ext::UI::instance()->set_tip (range_selection_button, - _("If enabled, playhead will always start from the beginning of the current range selection.\n\nIf disabled or no range selection, see the next choice in this list")); - Gtkmm2ext::UI::instance()->set_tip (loop_button, - _("If enabled, playhead will always start from the beginning of the loop range.\n\nIf disabled or no loop range, see the next choice in this list")); - Gtkmm2ext::UI::instance()->set_tip (region_selection_button, - _("If enabled, playhead will always start from the beginning of the first selected region.\n\nIf disabled or no region selection, see the next choice in this list")); - Gtkmm2ext::UI::instance()->set_tip (last_roll_button, - _("If enabled, playhead will always start from the last position where it was started.\n\nIf disabled it will start from wherever it is currently located")); + l = manage (left_aligned_label (_("Click emphasis audio file:"))); + t->attach (*l, 0, 1, 3, 4, FILL); + t->attach (_click_emphasis_path_entry, 1, 2, 3, 4, FILL); + _click_emphasis_browse_button.signal_clicked ().connect ( + sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked)); + t->attach (_click_emphasis_browse_button, 2, 3, 3, 4, FILL); - Gtkmm2ext::UI::instance()->set_tip (toggle_button, - _("Change status of all buttons above to all enabled or all disabled")); - } - - void parameter_changed (string const & p) - { - if (p == "auto-return-target-list") { - AutoReturnTarget art = _rc_config->get_auto_return_target_list(); - range_selection_button.set_active (art & RangeSelectionStart); - loop_button.set_active (art & Loop); - region_selection_button.set_active (art & RegionSelectionStart); - last_roll_button.set_active (art & LastLocate); - } - } - - void set_state_from_config () - { - parameter_changed ("auto-return-target-list"); - } + _box->pack_start (*t, true, false); - private: + _click_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_changed)); + _click_emphasis_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_changed)); - void range_selection_toggled () { - AutoReturnTarget art = _rc_config->get_auto_return_target_list (); - if (range_selection_button.get_active ()) { - _rc_config->set_auto_return_target_list (AutoReturnTarget (art | RangeSelectionStart)); - } else { - _rc_config->set_auto_return_target_list (AutoReturnTarget (art & ~RangeSelectionStart)); - } - } - void last_roll_toggled () { - AutoReturnTarget art = _rc_config->get_auto_return_target_list (); - if (last_roll_button.get_active ()) { - _rc_config->set_auto_return_target_list (AutoReturnTarget (art | LastLocate)); - } else { - _rc_config->set_auto_return_target_list (AutoReturnTarget (art & ~LastLocate)); - } - } - void region_selection_toggled () { - AutoReturnTarget art = _rc_config->get_auto_return_target_list (); - if (region_selection_button.get_active ()) { - _rc_config->set_auto_return_target_list (AutoReturnTarget (art | RegionSelectionStart)); - } else { - _rc_config->set_auto_return_target_list (AutoReturnTarget (art & ~RegionSelectionStart)); - } - } - void loop_toggled () { - AutoReturnTarget art = _rc_config->get_auto_return_target_list (); - if (loop_button.get_active ()) { - _rc_config->set_auto_return_target_list (AutoReturnTarget (art | Loop)); - } else { - _rc_config->set_auto_return_target_list (AutoReturnTarget (art & ~Loop)); - } - } + if (_rc_config->get_click_sound ().empty() && + _rc_config->get_click_emphasis_sound().empty()) { + _use_default_click_check_button.set_active (true); + _use_emphasis_on_click_check_button.set_active (true); - void toggle () { - AutoReturnTarget art = _rc_config->get_auto_return_target_list (); - if (art) { - _rc_config->set_auto_return_target_list (AutoReturnTarget (0)); } else { - _rc_config->set_auto_return_target_list (AutoReturnTarget (RangeSelectionStart| - RegionSelectionStart| - Loop| - LastLocate)); + _use_default_click_check_button.set_active (false); + _use_emphasis_on_click_check_button.set_active (false); } } - - RCConfiguration* _rc_config; - - Gtk::CheckButton range_selection_button; - Gtk::CheckButton last_roll_button; - Gtk::CheckButton loop_button; - Gtk::CheckButton region_selection_button; - Gtk::Button toggle_button; -}; - -class ClickOptions : public OptionEditorBox -{ -public: - ClickOptions (RCConfiguration* c, Gtk::Window* p) - : _rc_config (c) - { - Table* t = manage (new Table (2, 3)); - t->set_spacings (4); - - Label* l = manage (left_aligned_label (_("Click audio file:"))); - t->attach (*l, 0, 1, 0, 1, FILL); - t->attach (_click_path_entry, 1, 2, 0, 1, FILL); - Button* b = manage (new Button (_("Browse..."))); - b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_browse_clicked)); - t->attach (*b, 2, 3, 0, 1, FILL); - - l = manage (left_aligned_label (_("Click emphasis audio file:"))); - t->attach (*l, 0, 1, 1, 2, FILL); - t->attach (_click_emphasis_path_entry, 1, 2, 1, 2, FILL); - b = manage (new Button (_("Browse..."))); - b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked)); - t->attach (*b, 2, 3, 1, 2, FILL); - - _box->pack_start (*t, false, false); - - _click_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_changed)); - _click_emphasis_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_changed)); - } void parameter_changed (string const & p) { @@ -218,6 +134,9 @@ public: _click_path_entry.set_text (_rc_config->get_click_sound()); } else if (p == "click-emphasis-sound") { _click_emphasis_path_entry.set_text (_rc_config->get_click_emphasis_sound()); + } else if (p == "use-click-emphasis") { + bool x = _rc_config->get_use_click_emphasis (); + _use_emphasis_on_click_check_button.set_active (x); } } @@ -225,6 +144,7 @@ public: { parameter_changed ("click-sound"); parameter_changed ("click-emphasis-sound"); + parameter_changed ("use-click-emphasis"); } private: @@ -251,7 +171,7 @@ private: { click_chosen (_click_path_entry.get_text ()); } - + void click_emphasis_browse_clicked () { SoundFileChooser sfdb (_("Choose Click Emphasis")); @@ -275,9 +195,39 @@ private: click_emphasis_chosen (_click_emphasis_path_entry.get_text ()); } + void use_default_click_toggled () + { + if (_use_default_click_check_button.get_active ()) { + _rc_config->set_click_sound (""); + _rc_config->set_click_emphasis_sound (""); + _click_path_entry.set_sensitive (false); + _click_emphasis_path_entry.set_sensitive (false); + _click_browse_button.set_sensitive (false); + _click_emphasis_browse_button.set_sensitive (false); + } else { + _click_path_entry.set_sensitive (true); + _click_emphasis_path_entry.set_sensitive (true); + _click_browse_button.set_sensitive (true); + _click_emphasis_browse_button.set_sensitive (true); + } + } + + void use_emphasis_on_click_toggled () + { + if (_use_emphasis_on_click_check_button.get_active ()) { + _rc_config->set_use_click_emphasis(true); + } else { + _rc_config->set_use_click_emphasis(false); + } + } + RCConfiguration* _rc_config; + CheckButton _use_default_click_check_button; + CheckButton _use_emphasis_on_click_check_button; Entry _click_path_entry; Entry _click_emphasis_path_entry; + Button _click_browse_button; + Button _click_emphasis_browse_button; }; class UndoOptions : public OptionEditorBox @@ -378,20 +328,23 @@ static const struct { { "Unmodified", 0 }, -#ifdef GTKOSX +#ifdef __APPLE__ /* Command = Meta Option/Alt = Mod1 */ { "Key|Shift", GDK_SHIFT_MASK }, - { "Command", GDK_META_MASK }, + { "Command", GDK_MOD2_MASK }, { "Control", GDK_CONTROL_MASK }, { "Option", GDK_MOD1_MASK }, - { "Command-Shift", GDK_META_MASK|GDK_SHIFT_MASK }, - { "Command-Option", GDK_MOD1_MASK|GDK_META_MASK }, + { "Command-Shift", GDK_MOD2_MASK|GDK_SHIFT_MASK }, + { "Command-Option", GDK_MOD2_MASK|GDK_MOD1_MASK }, + { "Command-Control", GDK_MOD2_MASK|GDK_CONTROL_MASK }, + { "Command-Option-Control", GDK_MOD2_MASK|GDK_MOD1_MASK|GDK_CONTROL_MASK }, + { "Option-Control", GDK_MOD1_MASK|GDK_CONTROL_MASK }, { "Option-Shift", GDK_MOD1_MASK|GDK_SHIFT_MASK }, { "Control-Shift", GDK_CONTROL_MASK|GDK_SHIFT_MASK }, - { "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|GDK_META_MASK }, + { "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|GDK_MOD2_MASK }, #else { "Key|Shift", GDK_SHIFT_MASK }, @@ -399,9 +352,11 @@ static const struct { { "Alt", GDK_MOD1_MASK }, { "Control-Shift", GDK_CONTROL_MASK|GDK_SHIFT_MASK }, { "Control-Alt", GDK_CONTROL_MASK|GDK_MOD1_MASK }, - { "Shift-Alt", GDK_SHIFT_MASK|GDK_MOD1_MASK }, + { "Control-Windows", GDK_CONTROL_MASK|GDK_MOD4_MASK }, { "Control-Shift-Alt", GDK_CONTROL_MASK|GDK_SHIFT_MASK|GDK_MOD1_MASK }, { "Alt-Windows", GDK_MOD1_MASK|GDK_MOD4_MASK }, + { "Alt-Shift", GDK_MOD1_MASK|GDK_SHIFT_MASK }, + { "Alt-Shift-Windows", GDK_MOD1_MASK|GDK_SHIFT_MASK|GDK_MOD4_MASK }, { "Mod2", GDK_MOD2_MASK }, { "Mod3", GDK_MOD3_MASK }, { "Windows", GDK_MOD4_MASK }, @@ -422,6 +377,7 @@ public: _insert_note_button_adjustment (3, 1, 5), _insert_note_button_spin (_insert_note_button_adjustment) { + const std::string restart_msg = _("\nChanges to this setting will only persist after your project has been saved."); /* internationalize and prepare for use with combos */ vector dumb; @@ -431,7 +387,8 @@ public: set_popdown_strings (_edit_modifier_combo, dumb); _edit_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::edit_modifier_chosen)); - + Gtkmm2ext::UI::instance()->set_tip (_edit_modifier_combo, + (string_compose (_("Recommended Setting: %1 + button 3 (right mouse button)%2"), Keyboard::primary_modifier_name (), restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == Keyboard::edit_modifier ()) { _edit_modifier_combo.set_active_text (S_(modifiers[x].name)); @@ -492,7 +449,8 @@ public: set_popdown_strings (_delete_modifier_combo, dumb); _delete_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_modifier_chosen)); - + Gtkmm2ext::UI::instance()->set_tip (_delete_modifier_combo, + (string_compose (_("Recommended Setting: %1 + button 3 (right mouse button)%2"), Keyboard::tertiary_modifier_name (), restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == Keyboard::delete_modifier ()) { _delete_modifier_combo.set_active_text (S_(modifiers[x].name)); @@ -521,7 +479,8 @@ public: set_popdown_strings (_insert_note_modifier_combo, dumb); _insert_note_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::insert_note_modifier_chosen)); - + Gtkmm2ext::UI::instance()->set_tip (_insert_note_modifier_combo, + (string_compose (_("Recommended Setting: %1 + button 1 (left mouse button)%2"), Keyboard::primary_modifier_name (), restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == Keyboard::insert_note_modifier ()) { _insert_note_modifier_combo.set_active_text (S_(modifiers[x].name)); @@ -557,7 +516,14 @@ public: /* copy modifier */ set_popdown_strings (_copy_modifier_combo, dumb); _copy_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::copy_modifier_chosen)); - + Gtkmm2ext::UI::instance()->set_tip (_copy_modifier_combo, + (string_compose (_("Recommended Setting: %1%2"), +#ifdef __APPLE__ + Keyboard::secondary_modifier_name (), +#else + Keyboard::primary_modifier_name (), +#endif + restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) Keyboard::CopyModifier) { _copy_modifier_combo.set_active_text (S_(modifiers[x].name)); @@ -577,7 +543,15 @@ public: /* constraint modifier */ set_popdown_strings (_constraint_modifier_combo, dumb); _constraint_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::constraint_modifier_chosen)); - + std::string mod_str = string_compose (X_("%1-%2"), Keyboard::primary_modifier_name (), Keyboard::level4_modifier_name ()); + Gtkmm2ext::UI::instance()->set_tip (_constraint_modifier_combo, + (string_compose (_("Recommended Setting: %1%2"), +#ifdef __APPLE__ + Keyboard::primary_modifier_name (), +#else + Keyboard::tertiary_modifier_name (), +#endif + restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) ArdourKeyboard::constraint_modifier ()) { _constraint_modifier_combo.set_active_text (S_(modifiers[x].name)); @@ -591,6 +565,29 @@ public: t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL); t->attach (_constraint_modifier_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL); + ++row; + col = 1; + + /* push points */ + set_popdown_strings (_push_points_combo, dumb); + _push_points_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::push_points_modifier_chosen)); + + mod_str = string_compose (X_("%1-%2"), Keyboard::primary_modifier_name (), Keyboard::level4_modifier_name ()); + Gtkmm2ext::UI::instance()->set_tip (_push_points_combo, + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); + for (int x = 0; modifiers[x].name; ++x) { + if (modifiers[x].modifier == (guint) ArdourKeyboard::push_points_modifier ()) { + _push_points_combo.set_active_text (S_(modifiers[x].name)); + break; + } + } + + l = manage (left_aligned_label (_("Push points using:"))); + l->set_name ("OptionsLabel"); + + t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL); + t->attach (_push_points_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL); + ++row; l = manage (left_aligned_label (_("When Beginning a Trim:"))); @@ -603,7 +600,8 @@ public: /* trim_contents */ set_popdown_strings (_trim_contents_combo, dumb); _trim_contents_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::trim_contents_modifier_chosen)); - + Gtkmm2ext::UI::instance()->set_tip (_trim_contents_combo, + (string_compose (_("Recommended Setting: %1%2"), Keyboard::primary_modifier_name (), restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) ArdourKeyboard::trim_contents_modifier ()) { _trim_contents_combo.set_active_text (S_(modifiers[x].name)); @@ -624,6 +622,9 @@ public: set_popdown_strings (_trim_anchored_combo, dumb); _trim_anchored_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::trim_anchored_modifier_chosen)); + mod_str = string_compose (X_("%1-%2"), Keyboard::primary_modifier_name (), Keyboard::tertiary_modifier_name ()); + Gtkmm2ext::UI::instance()->set_tip (_trim_anchored_combo, + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) ArdourKeyboard::trim_anchored_modifier ()) { _trim_anchored_combo.set_active_text (S_(modifiers[x].name)); @@ -666,7 +667,8 @@ public: /* note resize relative */ set_popdown_strings (_note_size_relative_combo, dumb); _note_size_relative_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::note_size_relative_modifier_chosen)); - + Gtkmm2ext::UI::instance()->set_tip (_note_size_relative_combo, + (string_compose (_("Recommended Setting: %1%2"), Keyboard::tertiary_modifier_name (), restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) ArdourKeyboard::note_size_relative_modifier ()) { _note_size_relative_combo.set_active_text (S_(modifiers[x].name)); @@ -693,7 +695,13 @@ public: /* ignore snap */ set_popdown_strings (_snap_modifier_combo, dumb); _snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen)); - +#ifdef __APPLE__ + mod_str = string_compose (X_("%1-%2"), Keyboard::level4_modifier_name (), Keyboard::tertiary_modifier_name ()); +#else + mod_str = Keyboard::secondary_modifier_name(); +#endif + Gtkmm2ext::UI::instance()->set_tip (_snap_modifier_combo, + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) Keyboard::snap_modifier ()) { _snap_modifier_combo.set_active_text (S_(modifiers[x].name)); @@ -713,7 +721,13 @@ public: /* snap delta */ set_popdown_strings (_snap_delta_combo, dumb); _snap_delta_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_delta_modifier_chosen)); - +#ifdef __APPLE__ + mod_str = Keyboard::level4_modifier_name (); +#else + mod_str = string_compose (X_("%1-%2"), Keyboard::secondary_modifier_name (), Keyboard::level4_modifier_name ()); +#endif + Gtkmm2ext::UI::instance()->set_tip (_snap_delta_combo, + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) Keyboard::snap_delta_modifier ()) { _snap_delta_combo.set_active_text (S_(modifiers[x].name)); @@ -740,6 +754,8 @@ public: set_popdown_strings (_trim_overlap_combo, dumb); _trim_overlap_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::trim_overlap_modifier_chosen)); + Gtkmm2ext::UI::instance()->set_tip (_trim_overlap_combo, + (string_compose (_("Recommended Setting: %1%2"), Keyboard::tertiary_modifier_name (), restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) ArdourKeyboard::trim_overlap_modifier ()) { _trim_overlap_combo.set_active_text (S_(modifiers[x].name)); @@ -747,7 +763,7 @@ public: } } - l = manage (left_aligned_label (_("Resize overlaped regions using:"))); + l = manage (left_aligned_label (_("Resize overlapped regions using:"))); l->set_name ("OptionsLabel"); t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL); @@ -766,6 +782,9 @@ public: set_popdown_strings (_fine_adjust_combo, dumb); _fine_adjust_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::fine_adjust_modifier_chosen)); + mod_str = string_compose (X_("%1-%2"), Keyboard::primary_modifier_name (), Keyboard::secondary_modifier_name ()); + Gtkmm2ext::UI::instance()->set_tip (_fine_adjust_combo, + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == (guint) ArdourKeyboard::fine_adjust_modifier ()) { _fine_adjust_combo.set_active_text (S_(modifiers[x].name)); @@ -779,26 +798,6 @@ public: t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL); t->attach (_fine_adjust_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL); - ++row; - col = 1; - - /* push points */ - set_popdown_strings (_push_points_combo, dumb); - _push_points_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::push_points_modifier_chosen)); - - for (int x = 0; modifiers[x].name; ++x) { - if (modifiers[x].modifier == (guint) ArdourKeyboard::push_points_modifier ()) { - _push_points_combo.set_active_text (S_(modifiers[x].name)); - break; - } - } - - l = manage (left_aligned_label (_("Push points using:"))); - l->set_name ("OptionsLabel"); - - t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL); - t->attach (_push_points_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL); - _box->pack_start (*t, false, false); } @@ -834,7 +833,7 @@ private: string const txt = _edit_modifier_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { Keyboard::set_edit_modifier (modifiers[i].modifier); break; } @@ -846,7 +845,7 @@ private: string const txt = _delete_modifier_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { Keyboard::set_delete_modifier (modifiers[i].modifier); break; } @@ -858,7 +857,7 @@ private: string const txt = _copy_modifier_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { Keyboard::set_copy_modifier (modifiers[i].modifier); break; } @@ -870,7 +869,7 @@ private: string const txt = _insert_note_modifier_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { Keyboard::set_insert_note_modifier (modifiers[i].modifier); break; } @@ -882,7 +881,7 @@ private: string const txt = _snap_modifier_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { Keyboard::set_snap_modifier (modifiers[i].modifier); break; } @@ -894,7 +893,7 @@ private: string const txt = _snap_delta_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { Keyboard::set_snap_delta_modifier (modifiers[i].modifier); break; } @@ -906,7 +905,7 @@ private: string const txt = _constraint_modifier_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { ArdourKeyboard::set_constraint_modifier (modifiers[i].modifier); break; } @@ -918,7 +917,7 @@ private: string const txt = _trim_contents_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { ArdourKeyboard::set_trim_contents_modifier (modifiers[i].modifier); break; } @@ -930,7 +929,7 @@ private: string const txt = _trim_overlap_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { ArdourKeyboard::set_trim_overlap_modifier (modifiers[i].modifier); break; } @@ -942,7 +941,7 @@ private: string const txt = _trim_anchored_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { ArdourKeyboard::set_trim_anchored_modifier (modifiers[i].modifier); break; } @@ -954,7 +953,7 @@ private: string const txt = _fine_adjust_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { ArdourKeyboard::set_fine_adjust_modifier (modifiers[i].modifier); break; } @@ -966,7 +965,7 @@ private: string const txt = _push_points_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { ArdourKeyboard::set_push_points_modifier (modifiers[i].modifier); break; } @@ -978,7 +977,7 @@ private: string const txt = _note_size_relative_combo.get_active_text(); for (int i = 0; modifiers[i].name; ++i) { - if (txt == _(modifiers[i].name)) { + if (txt == S_(modifiers[i].name)) { ArdourKeyboard::set_note_size_relative_modifier (modifiers[i].modifier); break; } @@ -1027,18 +1026,17 @@ private: class FontScalingOptions : public OptionEditorBox { public: - FontScalingOptions (UIConfiguration* uic) : - _ui_config (uic), + FontScalingOptions () : _dpi_adjustment (100, 50, 250, 1, 5), _dpi_slider (_dpi_adjustment) { - _dpi_adjustment.set_value (_ui_config->get_font_scale() / 1024.); + _dpi_adjustment.set_value (UIConfiguration::instance().get_font_scale() / 1024.); Label* l = manage (new Label (_("GUI and Font scaling:"))); l->set_name ("OptionsLabel"); - const Glib::ustring dflt = _("Default"); - const Glib::ustring empty = X_(""); // despite gtk-doc saying so, NULL does not work as reference + const std::string dflt = _("Default"); + const std::string empty = X_(""); // despite gtk-doc saying so, NULL does not work as reference _dpi_slider.set_name("FontScaleSlider"); _dpi_slider.set_update_policy (UPDATE_DISCONTINUOUS); @@ -1063,7 +1061,7 @@ public: _box->pack_start (*h, false, false); - set_note (_("Adjusting the scale require an application restart to re-layout.")); + set_note (_("Adjusting the scale requires an application restart to re-layout.")); _dpi_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &FontScalingOptions::dpi_changed)); } @@ -1071,7 +1069,7 @@ public: void parameter_changed (string const & p) { if (p == "font-scale") { - _dpi_adjustment.set_value (_ui_config->get_font_scale() / 1024.); + _dpi_adjustment.set_value (UIConfiguration::instance().get_font_scale() / 1024.); } } @@ -1084,25 +1082,85 @@ private: void dpi_changed () { - _ui_config->set_font_scale ((long) floor (_dpi_adjustment.get_value() * 1024.)); + UIConfiguration::instance().set_font_scale ((long) floor (_dpi_adjustment.get_value() * 1024.)); /* XXX: should be triggered from the parameter changed signal */ - reset_dpi (); + UIConfiguration::instance().reset_dpi (); } - UIConfiguration* _ui_config; Adjustment _dpi_adjustment; HScale _dpi_slider; }; +class VstTimeOutSliderOption : public OptionEditorBox +{ +public: + VstTimeOutSliderOption (RCConfiguration* c) + : _rc_config (c) + , _timeout_adjustment (0, 0, 3000, 50, 50) + , _timeout_slider (_timeout_adjustment) + { + _timeout_slider.set_digits (0); + _timeout_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &VstTimeOutSliderOption::timeout_changed)); + + _timeout_slider.set_draw_value(false); + _timeout_slider.add_mark( 0, Gtk::POS_TOP, _("\u221e")); // infinity + _timeout_slider.add_mark( 300, Gtk::POS_TOP, _("30 sec")); + _timeout_slider.add_mark( 600, Gtk::POS_TOP, _("1 min")); + _timeout_slider.add_mark(1200, Gtk::POS_TOP, _("2 mins")); + _timeout_slider.add_mark(1800, Gtk::POS_TOP, _("3 mins")); + _timeout_slider.add_mark(2400, Gtk::POS_TOP, _("4 mins")); + _timeout_slider.add_mark(3000, Gtk::POS_TOP, _("5 mins")); + + Gtkmm2ext::UI::instance()->set_tip(_timeout_slider, + _("Specify the default timeout for plugin instantiation. Plugins that require more time to load will be blacklisted. A value of 0 disables the timeout.")); + + Label* l = manage (left_aligned_label (_("Scan Time Out:"))); + HBox* h = manage (new HBox); + h->set_spacing (4); + h->pack_start (*l, false, false); + h->pack_start (_timeout_slider, true, true); + + _box->pack_start (*h, false, false); + } + + void parameter_changed (string const & p) + { + if (p == "vst-scan-timeout") { + int const x = _rc_config->get_vst_scan_timeout(); + _timeout_adjustment.set_value (x); + } + } + + void set_state_from_config () + { + parameter_changed ("vst-scan-timeout"); + } + +private: + + void timeout_changed () + { + int x = floor(_timeout_adjustment.get_value()); + _rc_config->set_vst_scan_timeout(x); + } + + RCConfiguration* _rc_config; + Adjustment _timeout_adjustment; + HScale _timeout_slider; +}; + + + + + class ClipLevelOptions : public OptionEditorBox { public: - ClipLevelOptions (UIConfiguration* c) - : _ui_config (c) - , _clip_level_adjustment (-.5, -50.0, 0.0, 0.1, 1.0) /* units of dB */ + ClipLevelOptions () + : _clip_level_adjustment (-.5, -50.0, 0.0, 0.1, 1.0) /* units of dB */ , _clip_level_slider (_clip_level_adjustment) { - _clip_level_adjustment.set_value (_ui_config->get_waveform_clip_level ()); + _clip_level_adjustment.set_value (UIConfiguration::instance().get_waveform_clip_level ()); Label* l = manage (new Label (_("Waveform Clip Level (dBFS):"))); l->set_name ("OptionsLabel"); @@ -1121,7 +1179,7 @@ public: void parameter_changed (string const & p) { if (p == "waveform-clip-level") { - _clip_level_adjustment.set_value (_ui_config->get_waveform_clip_level()); + _clip_level_adjustment.set_value (UIConfiguration::instance().get_waveform_clip_level()); } } @@ -1134,12 +1192,11 @@ private: void clip_level_changed () { - _ui_config->set_waveform_clip_level (_clip_level_adjustment.get_value()); + UIConfiguration::instance().set_waveform_clip_level (_clip_level_adjustment.get_value()); /* XXX: should be triggered from the parameter changed signal */ ArdourCanvas::WaveView::set_clip_level (_clip_level_adjustment.get_value()); } - UIConfiguration* _ui_config; Adjustment _clip_level_adjustment; HScale _clip_level_slider; }; @@ -1154,13 +1211,34 @@ public: , _playback_slider (_playback_adjustment) , _capture_slider (_capture_adjustment) { + vector presets; + + /* these must match the order of the enums for BufferingPreset */ + + presets.push_back (_("Small sessions (4-16 tracks)")); + presets.push_back (_("Medium sessions (16-64 tracks)")); + presets.push_back (_("Large sessions (64+ tracks)")); + presets.push_back (_("Custom (set by sliders below)")); + + set_popdown_strings (_buffering_presets_combo, presets); + + Label* l = manage (new Label (_("Preset:"))); + l->set_name ("OptionsLabel"); + HBox* h = manage (new HBox); + h->set_spacing (12); + h->pack_start (*l, false, false); + h->pack_start (_buffering_presets_combo, true, true); + _box->pack_start (*h, false, false); + + _buffering_presets_combo.signal_changed().connect (sigc::mem_fun (*this, &BufferingOptions::preset_changed)); + _playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds()); - Label* l = manage (new Label (_("Playback (seconds of buffering):"))); + l = manage (new Label (_("Playback (seconds of buffering):"))); l->set_name ("OptionsLabel"); _playback_slider.set_update_policy (UPDATE_DISCONTINUOUS); - HBox* h = manage (new HBox); + h = manage (new HBox); h->set_spacing (4); h->pack_start (*l, false, false); h->pack_start (_playback_slider, true, true); @@ -1186,6 +1264,31 @@ public: void parameter_changed (string const & p) { + if (p == "buffering-preset") { + switch (_rc_config->get_buffering_preset()) { + case Small: + _playback_slider.set_sensitive (false); + _capture_slider.set_sensitive (false); + _buffering_presets_combo.set_active (0); + break; + case Medium: + _playback_slider.set_sensitive (false); + _capture_slider.set_sensitive (false); + _buffering_presets_combo.set_active (1); + break; + case Large: + _playback_slider.set_sensitive (false); + _capture_slider.set_sensitive (false); + _buffering_presets_combo.set_active (2); + break; + case Custom: + _playback_slider.set_sensitive (true); + _capture_slider.set_sensitive (true); + _buffering_presets_combo.set_active (3); + break; + } + } + if (p == "playback-buffer-seconds") { _playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds()); } else if (p == "capture-buffer-seconds") { @@ -1195,12 +1298,38 @@ public: void set_state_from_config () { + parameter_changed ("buffering-preset"); parameter_changed ("playback-buffer-seconds"); parameter_changed ("capture-buffer-seconds"); } private: + void preset_changed () + { + int index = _buffering_presets_combo.get_active_row_number (); + if (index < 0) { + return; + } + switch (index) { + case 0: + _rc_config->set_buffering_preset (Small); + break; + case 1: + _rc_config->set_buffering_preset (Medium); + break; + case 2: + _rc_config->set_buffering_preset (Large); + break; + case 3: + _rc_config->set_buffering_preset (Custom); + break; + default: + error << string_compose (_("programming error: unknown buffering preset string, index = %1"), index) << endmsg; + break; + } + } + void playback_changed () { _rc_config->set_audio_playback_buffer_seconds ((long) _playback_adjustment.get_value()); @@ -1216,14 +1345,14 @@ private: Adjustment _capture_adjustment; HScale _playback_slider; HScale _capture_slider; + ComboBoxText _buffering_presets_combo; }; class ControlSurfacesOptions : public OptionEditorBox { public: - ControlSurfacesOptions (Gtk::Window& parent) - : _parent (parent) - , _ignore_view_change (0) + ControlSurfacesOptions () + : _ignore_view_change (0) { _store = ListStore::create (_model); _view.set_model (_store); @@ -1235,18 +1364,29 @@ public: _box->pack_start (_view, false, false); - Label* label = manage (new Label); - label->set_markup (string_compose (X_("%1"), _("Double-click on a name to edit settings for an enabled protocol"))); + Gtk::HBox* edit_box = manage (new Gtk::HBox); + edit_box->set_spacing(3); + _box->pack_start (*edit_box, false, false); + edit_box->show (); - _box->pack_start (*label, false, false); + Label* label = manage (new Label); + label->set_text (_("Click to edit the settings for selected protocol ( it must be ENABLED first ):")); + edit_box->pack_start (*label, false, false); label->show (); + edit_button = manage (new Button(_("Show Protocol Settings"))); + edit_button->signal_clicked().connect (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_btn_clicked)); + edit_box->pack_start (*edit_button, true, true); + edit_button->set_sensitive (false); + edit_button->show (); + ControlProtocolManager& m = ControlProtocolManager::instance (); m.ProtocolStatusChange.connect (protocol_status_connection, MISSING_INVALIDATOR, boost::bind (&ControlSurfacesOptions::protocol_status_changed, this, _1), gui_context()); _store->signal_row_changed().connect (sigc::mem_fun (*this, &ControlSurfacesOptions::view_changed)); _view.signal_button_press_event().connect_notify (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_clicked)); + _view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ControlSurfacesOptions::selection_changed)); } void parameter_changed (std::string const &) @@ -1276,7 +1416,7 @@ private: void protocol_status_changed (ControlProtocolInfo* cpi) { /* find the row */ TreeModel::Children rows = _store->children(); - + for (TreeModel::Children::iterator x = rows.begin(); x != rows.end(); ++x) { string n = ((*x)[_model.name]); @@ -1289,6 +1429,16 @@ private: } } + void selection_changed () + { + //enable the Edit button when a row is selected for editing + TreeModel::Row row = *(_view.get_selection()->get_selected()); + if (row && row[_model.enabled]) + edit_button->set_sensitive (true); + else + edit_button->set_sensitive (false); + } + void view_changed (TreeModel::Path const &, TreeModel::iterator const & i) { TreeModel::Row r = *i; @@ -1323,12 +1473,8 @@ private: } } - void edit_clicked (GdkEventButton* ev) + void edit_btn_clicked () { - if (ev->type != GDK_2BUTTON_PRESS) { - return; - } - std::string name; ControlProtocolInfo* cpi; TreeModel::Row row; @@ -1349,19 +1495,30 @@ private: static_cast(box->get_parent())->present(); return; } - string title = row[_model.name]; + WindowTitle title (Glib::get_application_name()); + title += row[_model.name]; + title += _("Configuration"); /* once created, the window is managed by the surface itself (as ->get_parent()) * Surface's tear_down_gui() is called on session close, when de-activating * or re-initializing a surface. * tear_down_gui() hides an deletes the Window if it exists. */ - ArdourWindow* win = new ArdourWindow (_parent, title); + ArdourWindow* win = new ArdourWindow (*((Gtk::Window*) _view.get_toplevel()), title.get_string()); win->set_title ("Control Protocol Options"); win->add (*box); box->show (); win->present (); } + void edit_clicked (GdkEventButton* ev) + { + if (ev->type != GDK_2BUTTON_PRESS) { + return; + } + + edit_btn_clicked(); + } + class ControlSurfacesModelColumns : public TreeModelColumnRecord { public: @@ -1383,9 +1540,9 @@ private: Glib::RefPtr _store; ControlSurfacesModelColumns _model; TreeView _view; - Gtk::Window& _parent; PBD::ScopedConnection protocol_status_connection; uint32_t _ignore_view_change; + Gtk::Button* edit_button; }; class VideoTimelineOptions : public OptionEditorBox @@ -1396,45 +1553,78 @@ public: , _show_video_export_info_button (_("Show Video Export Info before export")) , _show_video_server_dialog_button (_("Show Video Server Startup Dialog")) , _video_advanced_setup_button (_("Advanced Setup (remote video server)")) + , _xjadeo_browse_button (_("Browse...")) { - Table* t = manage (new Table (2, 6)); + Table* t = manage (new Table (8, 4)); t->set_spacings (4); - t->attach (_video_advanced_setup_button, 0, 2, 0, 1); + std::stringstream s; + s << "" << _("Video Server") << ""; + Label* l = manage (new Label (s.str())); + l->set_use_markup (true); + l->set_alignment (0, 0.5); + t->attach (*l, 0, 4, 0, 1, EXPAND | FILL, FILL | EXPAND, 0, 8); + + t->attach (_video_advanced_setup_button, 1, 4, 1, 2); _video_advanced_setup_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::video_advanced_setup_toggled)); Gtkmm2ext::UI::instance()->set_tip (_video_advanced_setup_button, _("When enabled you can speficify a custom video-server URL and docroot. - Do not enable this option unless you know what you are doing.")); - Label* l = manage (new Label (_("Video Server URL:"))); + l = manage (new Label (_("Video Server URL:"))); l->set_alignment (0, 0.5); - t->attach (*l, 0, 1, 1, 2, FILL); - t->attach (_video_server_url_entry, 1, 2, 1, 2, FILL); + t->attach (*l, 1, 2, 2, 3, FILL); + t->attach (_video_server_url_entry, 2, 4, 2, 3, FILL); Gtkmm2ext::UI::instance()->set_tip (_video_server_url_entry, _("Base URL of the video-server including http prefix. This is usually 'http://hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the video-server is running locally")); l = manage (new Label (_("Video Folder:"))); l->set_alignment (0, 0.5); - t->attach (*l, 0, 1, 2, 3, FILL); - t->attach (_video_server_docroot_entry, 1, 2, 2, 3); + t->attach (*l, 1, 2, 3, 4, FILL); + t->attach (_video_server_docroot_entry, 2, 4, 3, 4); Gtkmm2ext::UI::instance()->set_tip (_video_server_docroot_entry, _("Local path to the video-server document-root. Only files below this directory will be accessible by the video-server. If the server run on a remote host, it should point to a network mounted folder of the server's docroot or be left empty if it is unvailable. It is used for the local video-monitor and file-browsing when opening/adding a video file.")); - /* small vspace y=3..4 */ - - t->attach (_show_video_export_info_button, 0, 2, 4, 5); + t->attach (_show_video_export_info_button, 1, 4, 4, 5); _show_video_export_info_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_export_info_toggled)); Gtkmm2ext::UI::instance()->set_tip (_show_video_export_info_button, _("When enabled an information window with details is displayed before the video-export dialog.")); - t->attach (_show_video_server_dialog_button, 0, 2, 5, 6); + t->attach (_show_video_server_dialog_button, 1, 4, 5, 6); _show_video_server_dialog_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_server_dialog_toggled)); Gtkmm2ext::UI::instance()->set_tip (_show_video_server_dialog_button, _("When enabled the video server is never launched automatically without confirmation")); + s.str (std::string ()); + s << "" << _("Video Monitor") << ""; + l = manage (new Label (s.str())); + l->set_use_markup (true); + l->set_alignment (0, 0.5); + t->attach (*l, 0, 4, 6, 7, EXPAND | FILL, FILL | EXPAND, 0, 8); + + l = manage (new Label (string_compose (_("Custom Path to Video Monitor (%1) - leave empty for default:"), +#ifdef __APPLE__ + "Jadeo.app" +#elif defined PLATFORM_WINDOWS + "xjadeo.exe" +#else + "xjadeo" +#endif + ))); + l->set_alignment (0, 0.5); + t->attach (*l, 1, 4, 7, 8, FILL); + t->attach (_custom_xjadeo_path, 2, 3, 8, 9); + Gtkmm2ext::UI::instance()->set_tip (_custom_xjadeo_path, _("Set a custom path to the Video Monitor Executable, changing this requires a restart.")); + t->attach (_xjadeo_browse_button, 3, 4, 8, 9, FILL); + _video_server_url_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed)); _video_server_url_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed)); _video_server_docroot_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed)); _video_server_docroot_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed)); + _custom_xjadeo_path.signal_changed().connect (sigc::mem_fun (*this, &VideoTimelineOptions::custom_xjadeo_path_changed)); + _xjadeo_browse_button.signal_clicked ().connect (sigc::mem_fun (*this, &VideoTimelineOptions::xjadeo_browse_clicked)); + + // xjadeo-path is a UIConfig parameter + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &VideoTimelineOptions::parameter_changed)); _box->pack_start (*t,true,true); } @@ -1467,6 +1657,30 @@ public: _rc_config->set_video_advanced_setup(x); } + void custom_xjadeo_path_changed () + { + UIConfiguration::instance().set_xjadeo_binary (_custom_xjadeo_path.get_text()); + } + + void xjadeo_browse_clicked () + { + Gtk::FileChooserDialog dialog(_("Set Video Monitor Executable"), Gtk::FILE_CHOOSER_ACTION_OPEN); + dialog.set_filename (UIConfiguration::instance().get_xjadeo_binary()); + dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); + dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); + if (dialog.run () == Gtk::RESPONSE_OK) { + const std::string& filename = dialog.get_filename(); + if (!filename.empty() && ( +#ifdef __APPLE__ + Glib::file_test (filename + "/Contents/MacOS/xjadeo", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE) || +#endif + Glib::file_test (filename, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE) + )) { + UIConfiguration::instance().set_xjadeo_binary (filename); + } + } + } + void parameter_changed (string const & p) { if (p == "video-server-url") { @@ -1484,6 +1698,8 @@ public: _video_advanced_setup_button.set_active(x); _video_server_docroot_entry.set_sensitive(x); _video_server_url_entry.set_sensitive(x); + } else if (p == "xjadeo-binary") { + _custom_xjadeo_path.set_text (UIConfiguration::instance().get_xjadeo_binary()); } } @@ -1495,250 +1711,84 @@ public: parameter_changed ("show-video-export-info"); parameter_changed ("show-video-server-dialog"); parameter_changed ("video-advanced-setup"); + parameter_changed ("xjadeo-binary"); } private: RCConfiguration* _rc_config; Entry _video_server_url_entry; Entry _video_server_docroot_entry; + Entry _custom_xjadeo_path; CheckButton _show_video_export_info_button; CheckButton _show_video_server_dialog_button; CheckButton _video_advanced_setup_button; + Button _xjadeo_browse_button; }; -class PluginOptions : public OptionEditorBox +class ColumVisibilityOption : public Option { -public: - PluginOptions (RCConfiguration* c, UIConfiguration* uic) - : _rc_config (c) - , _ui_config (uic) - , _display_plugin_scan_progress (_("Always Display Plugin Scan Progress")) - , _discover_vst_on_start (_("Scan for [new] VST Plugins on Application Start")) - , _discover_au_on_start (_("Scan for AudioUnit Plugins on Application Start")) - , _verbose_plugin_scan (_("Verbose Plugin Scan")) - , _timeout_adjustment (0, 0, 3000, 50, 50) - , _timeout_slider (_timeout_adjustment) + public: + ColumVisibilityOption (string id, string name, uint32_t n_col, sigc::slot get, sigc::slot set) + : Option (id, name) + , _heading (name) + , _n_col (n_col) + , _get (get) + , _set (set) { - Label *l; - std::stringstream ss; - Table* t = manage (new Table (2, 6)); - t->set_spacings (4); - Button* b; - int n = 0; - - ss << "" << _("General") << ""; - l = manage (left_aligned_label (ss.str())); - l->set_use_markup (true); - t->attach (*manage (new Label ("")), 0, 3, n, n+1, FILL | EXPAND); ++n; - t->attach (*l, 0, 2, n, n+1, FILL | EXPAND); ++n; + cb = (CheckButton**) malloc (sizeof (CheckButton*) * n_col); + for (uint32_t i = 0; i < n_col; ++i) { + CheckButton* col = manage (new CheckButton (string_compose (_("Column %1"), i + 1))); + col->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &ColumVisibilityOption::column_toggled), i)); + _hbox.pack_start (*col); + cb[i] = col; + } + parameter_changed (id); + } - b = manage (new Button (_("Scan for Plugins"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::refresh_clicked)); - t->attach (*b, 0, 2, n, n+1, FILL); ++n; + ~ColumVisibilityOption () { + free (cb); + } - t->attach (_display_plugin_scan_progress, 0, 2, n, n+1); ++n; - _display_plugin_scan_progress.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::display_plugin_scan_progress_toggled)); - Gtkmm2ext::UI::instance()->set_tip (_display_plugin_scan_progress, - _("When enabled a popup window showing plugin scan progress is displayed for indexing (cache load) and discovery (detect new plugins)")); + Gtk::Widget& tip_widget() { return _hbox; } -#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT) - _timeout_slider.set_digits (0); - _timeout_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &PluginOptions::timeout_changed)); - - Gtkmm2ext::UI::instance()->set_tip(_timeout_slider, - _("Specify the default timeout for plugin instantiation in 1/10 seconds. Plugins that require more time to load will be blacklisted. A value of 0 disables the timeout.")); - - l = manage (left_aligned_label (_("Scan Time Out [deciseconds]")));; - HBox* h = manage (new HBox); - h->set_spacing (4); - h->pack_start (*l, false, false); - h->pack_start (_timeout_slider, true, true); - t->attach (*h, 0, 2, n, n+1); ++n; - - ss.str(""); - ss << "" << _("VST") << ""; - l = manage (left_aligned_label (ss.str())); - l->set_use_markup (true); - t->attach (*manage (new Label ("")), 0, 3, n, n+1, FILL | EXPAND); ++n; - t->attach (*l, 0, 2, n, n+1, FILL | EXPAND); ++n; - - b = manage (new Button (_("Clear VST Cache"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_vst_cache_clicked)); - t->attach (*b, 0, 1, n, n+1, FILL); - - b = manage (new Button (_("Clear VST Blacklist"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_vst_blacklist_clicked)); - t->attach (*b, 1, 2, n, n+1, FILL); - ++n; - - t->attach (_discover_vst_on_start, 0, 2, n, n+1); ++n; - _discover_vst_on_start.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::discover_vst_on_start_toggled)); - Gtkmm2ext::UI::instance()->set_tip (_discover_vst_on_start, - _("When enabled new VST plugins are searched, tested and added to the cache index on application start. When disabled new plugins will only be available after triggering a 'Scan' manually")); - -#ifdef LXVST_SUPPORT - t->attach (*manage (left_aligned_label (_("Linux VST Path:"))), 0, 1, n, n+1); - b = manage (new Button (_("Edit"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_lxvst_path_clicked)); - t->attach (*b, 1, 2, n, n+1, FILL); ++n; -#endif - -#ifdef WINDOWS_VST_SUPPORT - t->attach (*manage (left_aligned_label (_("Windows VST Path:"))), 0, 1, n, n+1); - b = manage (new Button (_("Edit"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_vst_path_clicked)); - t->attach (*b, 1, 2, n, n+1, FILL); ++n; - - // currently verbose logging is only implemented for Windows VST. - t->attach (_verbose_plugin_scan, 0, 2, n, n+1); ++n; - _verbose_plugin_scan.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::verbose_plugin_scan_toggled)); - Gtkmm2ext::UI::instance()->set_tip (_verbose_plugin_scan, - _("When enabled additional information for every plugin is added to the Log Window.")); -#endif -#endif // any VST - -#ifdef AUDIOUNIT_SUPPORT - ss.str(""); - ss << "" << _("Audio Unit") << ""; - l = manage (left_aligned_label (ss.str())); - l->set_use_markup (true); - t->attach (*manage (new Label ("")), 0, 3, n, n+1, FILL | EXPAND); ++n; - t->attach (*l, 0, 2, n, n+1, FILL | EXPAND); ++n; - - t->attach (_discover_au_on_start, 0, 2, n, n+1); ++n; - _discover_au_on_start.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::discover_au_on_start_toggled)); - Gtkmm2ext::UI::instance()->set_tip (_discover_au_on_start, - _("When enabled Audio Unit Plugins are discovered on application start. When disabled AU plugins will only be available after triggering a 'Scan' manually. The first successful scan will enable AU auto-scan, Any crash during plugin discovery will disable it.")); - - ++n; - b = manage (new Button (_("Clear AU Cache"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_au_cache_clicked)); - t->attach (*b, 0, 1, n, n+1, FILL); - - b = manage (new Button (_("Clear AU Blacklist"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_au_blacklist_clicked)); - t->attach (*b, 1, 2, n, n+1, FILL); - ++n; -#endif - - _box->pack_start (*t,true,true); - } - - void parameter_changed (string const & p) { - if (p == "show-plugin-scan-window") { - bool const x = _ui_config->get_show_plugin_scan_window(); - _display_plugin_scan_progress.set_active (x); - } - else if (p == "discover-vst-on-start") { - bool const x = _rc_config->get_discover_vst_on_start(); - _discover_vst_on_start.set_active (x); - } - else if (p == "vst-scan-timeout") { - int const x = _rc_config->get_vst_scan_timeout(); - _timeout_adjustment.set_value (x); - } - else if (p == "discover-audio-units") { - bool const x = _rc_config->get_discover_audio_units(); - _discover_au_on_start.set_active (x); - } - else if (p == "verbose-plugin-scan") { - bool const x = _rc_config->get_verbose_plugin_scan(); - _verbose_plugin_scan.set_active (x); + void set_state_from_config () + { + uint32_t c = _get(); + for (uint32_t i = 0; i < _n_col; ++i) { + bool en = (c & (1<get_active () != en) { + cb[i]->set_active (en); + } } } - void set_state_from_config () { - parameter_changed ("show-plugin-scan-window"); - parameter_changed ("discover-vst-on-start"); - parameter_changed ("vst-scan-timeout"); - parameter_changed ("discover-audio-units"); - parameter_changed ("verbose-plugin-scan"); - } - -private: - RCConfiguration* _rc_config; - UIConfiguration* _ui_config; - CheckButton _display_plugin_scan_progress; - CheckButton _discover_vst_on_start; - CheckButton _discover_au_on_start; - CheckButton _verbose_plugin_scan; - Adjustment _timeout_adjustment; - HScale _timeout_slider; - - void display_plugin_scan_progress_toggled () { - bool const x = _display_plugin_scan_progress.get_active(); - _ui_config->set_show_plugin_scan_window(x); - } - - void discover_vst_on_start_toggled () { - bool const x = _discover_vst_on_start.get_active(); - _rc_config->set_discover_vst_on_start(x); - } - - void discover_au_on_start_toggled () { - bool const x = _discover_au_on_start.get_active(); - _rc_config->set_discover_audio_units(x); - } - - void verbose_plugin_scan_toggled () { - bool const x = _verbose_plugin_scan.get_active(); - _rc_config->set_verbose_plugin_scan(x); - } - - void timeout_changed () { - int x = floor(_timeout_adjustment.get_value()); - _rc_config->set_vst_scan_timeout(x); - } - - void clear_vst_cache_clicked () { - PluginManager::instance().clear_vst_cache(); - } - - void clear_vst_blacklist_clicked () { - PluginManager::instance().clear_vst_blacklist(); - } - - void clear_au_cache_clicked () { - PluginManager::instance().clear_au_cache(); - } - - void clear_au_blacklist_clicked () { - PluginManager::instance().clear_au_blacklist(); + void add_to_page (OptionEditorPage* p) + { + _heading.add_to_page (p); + add_widget_to_page (p, &_hbox); } + private: - - void edit_vst_path_clicked () { - Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog ( - _("Set Windows VST Search Path"), - _rc_config->get_plugin_path_vst(), - PluginManager::instance().get_default_windows_vst_path() - ); - ResponseType r = (ResponseType) pd->run (); - pd->hide(); - if (r == RESPONSE_ACCEPT) { - _rc_config->set_plugin_path_vst(pd->get_serialized_paths()); + void column_toggled (int b) { + uint32_t c = _get(); + uint32_t cc = c; + if (cb[b]->get_active ()) { + c |= (1<get_plugin_path_lxvst(), - PluginManager::instance().get_default_lxvst_path() - ); - ResponseType r = (ResponseType) pd->run (); - pd->hide(); - if (r == RESPONSE_ACCEPT) { - _rc_config->set_plugin_path_lxvst(pd->get_serialized_paths()); + if (cc != c) { + _set (c); } - delete pd; } - void refresh_clicked () { - PluginManager::instance().refresh(); - } + HBox _hbox; + OptionEditorHeading _heading; + + CheckButton** cb; + uint32_t _n_col; + sigc::slot _get; + sigc::slot _set; }; @@ -1794,7 +1844,7 @@ private: */ _set (_visibility_group->get_state_value ()); } - + OptionEditorHeading _heading; VisibilityGroup* _visibility_group; sigc::slot _get; @@ -1805,11 +1855,21 @@ private: RCOptionEditor::RCOptionEditor () - : OptionEditor (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME)) + : OptionEditorContainer (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME)) + , Tabbable (*this, _("Preferences")) /* pack self-as-vbox into tabbable */ , _rc_config (Config) - , _ui_config (ARDOUR_UI::config()) , _mixer_strip_visibility ("mixer-element-visibility") { + XMLNode* node = ARDOUR_UI::instance()->preferences_settings(); + if (node) { + /* gcc4 complains about ambiguity with Gtk::Widget::set_state + (Gtk::StateType) here !!! + */ + Tabbable::set_state (*node, Stateful::loading_state_version); + } + + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RCOptionEditor::parameter_changed)); + /* MISC */ uint32_t hwcpus = hardware_concurrency (); @@ -1850,6 +1910,8 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_verify_remove_last_capture) )); + add_option (_("Misc"), new OptionEditorHeading (_("Session Management"))); + add_option (_("Misc"), new BoolOption ( "periodic-safety-backups", @@ -1858,14 +1920,12 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_periodic_safety_backups) )); - add_option (_("Misc"), new OptionEditorHeading (_("Session Management"))); - add_option (_("Misc"), new BoolOption ( "only-copy-imported-files", _("Always copy imported files"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_only_copy_imported_files), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_only_copy_imported_files) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_only_copy_imported_files), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_only_copy_imported_files) )); add_option (_("Misc"), new DirectoryOption ( @@ -1884,11 +1944,11 @@ RCOptionEditor::RCOptionEditor () 0, 1000, 1, 20 )); - add_option (_("Misc"), new OptionEditorHeading (_("Click"))); + add_option (_("Misc/Click"), new OptionEditorHeading (_("Click"))); - add_option (_("Misc"), new ClickOptions (_rc_config, this)); + add_option (_("Misc/Click"), new ClickOptions (_rc_config)); - add_option (_("Misc"), + add_option (_("Misc/Click"), new FaderOption ( "click-gain", _("Click gain level"), @@ -1918,8 +1978,6 @@ RCOptionEditor::RCOptionEditor () /* TRANSPORT */ - add_option (_("Transport"), new OptionEditorHeading (S_("Playhead Behaviour"))); - add_option (_("Transport"), new AutoReturnTargetOptions (_rc_config, this)); add_option (_("Transport"), new OptionEditorHeading (S_("Transport Options"))); BoolOption* tsf; @@ -1939,18 +1997,18 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::get_loop_is_mode), sigc::mem_fun (*_rc_config, &RCConfiguration::set_loop_is_mode) ); - Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), + Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), (_("When enabled the loop button does not start playback but forces playback to always play the loop\n\n" "When disabled the loop button starts playing the loop, but stop then cancels loop playback"))); add_option (_("Transport"), tsf); - + tsf = new BoolOption ( "stop-recording-on-xrun", _("Stop recording when an xrun occurs"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_recording_on_xrun), sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_recording_on_xrun) ); - Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), + Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), string_compose (_("When enabled %1 will stop recording if an over- or underrun is detected by the audio engine"), PROGRAM_NAME)); add_option (_("Transport"), tsf); @@ -1970,7 +2028,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_at_session_end), sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_at_session_end) ); - Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), + Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), string_compose (_("When enabled if %1 is not recording, it will stop the transport " "when it reaches the current session end marker\n\n" "When disabled %1 will continue to roll past the session end marker at all times"), @@ -1983,7 +2041,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::get_seamless_loop), sigc::mem_fun (*_rc_config, &RCConfiguration::set_seamless_loop) ); - Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), + Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), string_compose (_("When enabled this will loop by reading ahead and wrapping around at the loop point, " "preventing any need to do a transport locate at the end of the loop\n\n" "When disabled looping is done by locating back to the start of the loop when %1 reaches the end " @@ -2009,7 +2067,24 @@ RCOptionEditor::RCOptionEditor () "that occurs when fast-forwarding or rewinding through some kinds of audio")); add_option (_("Transport"), tsf); - add_option (_("Transport"), new OptionEditorHeading (S_("Sync/Slave"))); + ComboOption* psc = new ComboOption ( + "preroll-seconds", + _("Preroll"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_preroll_seconds), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_preroll_seconds) + ); + Gtkmm2ext::UI::instance()->set_tip (psc->tip_widget(), + (_("The amount of preroll (in seconds) to apply when Play with Preroll is initiated.\n\n" + "If Follow Edits is enabled, the preroll is applied to the playhead position when a region is selected or trimmed."))); + psc->add (0.0, _("0 (no pre-roll)")); + psc->add (0.1, _("0.1 second")); + psc->add (0.25, _("0.25 second")); + psc->add (0.5, _("0.5 second")); + psc->add (1.0, _("1.0 second")); + psc->add (2.0, _("2.0 seconds")); + add_option (_("Transport"), psc); + + add_option (_("Transport/Sync"), new OptionEditorHeading (S_("Synchronization and Slave Options"))); _sync_source = new ComboOption ( "sync-source", @@ -2018,7 +2093,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_source) ); - add_option (_("Transport"), _sync_source); + add_option (_("Transport/Sync"), _sync_source); _sync_framerate = new BoolOption ( "timecode-sync-frame-rate", @@ -2026,7 +2101,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_sync_frame_rate), sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_sync_frame_rate) ); - Gtkmm2ext::UI::instance()->set_tip + Gtkmm2ext::UI::instance()->set_tip (_sync_framerate->tip_widget(), string_compose (_("This option controls the value of the video frame rate while chasing an external timecode source.\n\n" "When enabled the session video frame rate will be changed to match that of the selected external timecode source.\n\n" @@ -2034,7 +2109,7 @@ RCOptionEditor::RCOptionEditor () "Instead the frame rate indication in the main clock will flash red and %1 will convert between the external " "timecode standard and the session standard."), PROGRAM_NAME)); - add_option (_("Transport"), _sync_framerate); + add_option (_("Transport/Sync"), _sync_framerate); _sync_genlock = new BoolOption ( "timecode-source-is-synced", @@ -2042,7 +2117,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_source_is_synced), sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_source_is_synced) ); - Gtkmm2ext::UI::instance()->set_tip + Gtkmm2ext::UI::instance()->set_tip (_sync_genlock->tip_widget(), string_compose (_("When enabled %1 will never varispeed when slaved to external timecode. " "Sync Lock indicates that the selected external timecode source shares clock-sync " @@ -2055,7 +2130,7 @@ RCOptionEditor::RCOptionEditor () ), PROGRAM_NAME)); - add_option (_("Transport"), _sync_genlock); + add_option (_("Transport/Sync"), _sync_genlock); _sync_source_2997 = new BoolOption ( "timecode-source-2997", @@ -2073,9 +2148,9 @@ RCOptionEditor::RCOptionEditor () "because the variant of using exactly 29.97 fps has zero timecode drift.\n" )); - add_option (_("Transport"), _sync_source_2997); + add_option (_("Transport/Sync"), _sync_source_2997); - add_option (_("Transport"), new OptionEditorHeading (S_("LTC Reader"))); + add_option (_("Transport/Sync"), new OptionEditorHeading (S_("LTC Reader"))); _ltc_port = new ComboStringOption ( "ltc-source-port", @@ -2090,13 +2165,14 @@ RCOptionEditor::RCOptionEditor () _ltc_port->set_popdown_strings (physical_inputs); populate_sync_options (); + AudioEngine::instance()->Running.connect (engine_started_connection, MISSING_INVALIDATOR, boost::bind (&RCOptionEditor::populate_sync_options, this), gui_context()); - add_option (_("Transport"), _ltc_port); + add_option (_("Transport/Sync"), _ltc_port); // TODO; rather disable this button than not compile it.. - add_option (_("Transport"), new OptionEditorHeading (S_("LTC Generator"))); + add_option (_("Transport/Sync"), new OptionEditorHeading (S_("LTC Generator"))); - add_option (_("Transport"), + add_option (_("Transport/Sync"), new BoolOption ( "send-ltc", _("Enable LTC generator"), @@ -2122,45 +2198,98 @@ RCOptionEditor::RCOptionEditor () Gtkmm2ext::UI::instance()->set_tip (_ltc_volume_slider->tip_widget(), - _("Specify the Peak Volume of the generated LTC signal in dbFS. A good value is 0dBu ^= -18dbFS in an EBU calibrated system")); - - add_option (_("Transport"), _ltc_volume_slider); - parameter_changed ("send-ltc"); + _("Specify the Peak Volume of the generated LTC signal in dBFS. A good value is 0dBu ^= -18dBFS in an EBU calibrated system")); - parameter_changed ("sync-source"); + add_option (_("Transport/Sync"), _ltc_volume_slider); /* EDITOR */ + add_option (_("Editor"), + new BoolOption ( + "rubberbanding-snaps-to-grid", + _("Make rubberband selection rectangle snap to the grid"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_rubberbanding_snaps_to_grid), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_rubberbanding_snaps_to_grid) + )); + + bo = new BoolOption ( + "name-new-markers", + _("Name new markers"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_name_new_markers), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_name_new_markers) + ); + add_option (_("Editor"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), _("If enabled, popup a dialog when a new marker is created to allow its name to be set as it is created." + "\n\nYou can always rename markers by right-clicking on them")); + add_option (S_("Editor"), new BoolOption ( "draggable-playhead", _("Allow dragging of playhead"), - sigc::mem_fun (*ARDOUR_UI::config(), &UIConfiguration::get_draggable_playhead), - sigc::mem_fun (*ARDOUR_UI::config(), &UIConfiguration::set_draggable_playhead) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_draggable_playhead), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_draggable_playhead) )); add_option (_("Editor"), new BoolOption ( - "automation-follows-regions", - _("Move relevant automation when audio regions are moved"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_follows_regions), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_follows_regions) + "show-editor-meter", + _("Display master-meter in the toolbar"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_editor_meter), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_editor_meter) )); +if (!Profile->get_mixbus()) { add_option (_("Editor"), - new BoolOption ( - "show-track-meters", - _("Show meters on tracks in the editor"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_track_meters), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_track_meters) + new BoolOption ( + "show-zoom-tools", + _("Show zoom toolbar (if torn off)"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_zoom_tools), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_zoom_tools) + )); + + add_option (_("Editor"), + new BoolOption ( + "use-mouse-position-as-zoom-focus-on-scroll", + _("Always use mouse cursor position as zoom focus when zooming using mouse scroll wheel"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_mouse_position_as_zoom_focus_on_scroll), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_mouse_position_as_zoom_focus_on_scroll) + )); +} // !mixbus + + add_option (_("Editor"), + new BoolOption ( + "update-editor-during-summary-drag", + _("Update editor window during drags of the summary"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_update_editor_during_summary_drag), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_update_editor_during_summary_drag) + )); + + add_option (_("Editor"), + new BoolOption ( + "autoscroll-editor", + _("Auto-scroll editor window when dragging near its edges"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_autoscroll_editor), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_autoscroll_editor) + )); + + add_option (_("Editor"), + new BoolComboOption ( + "show-region-gain-envelopes", + _("Show gain envelopes in audio regions"), + _("in all modes"), + _("only in Draw and Internal Edit modes"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_region_gain), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_region_gain) )); + add_option (_("Editor"), new OptionEditorHeading (_("Editor Behavior"))); + add_option (_("Editor"), new BoolOption ( - "show-editor-meter", - _("Display master-meter in the toolbar"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_editor_meter), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_editor_meter) + "automation-follows-regions", + _("Move relevant automation when audio regions are moved"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_automation_follows_regions), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_follows_regions) )); ComboOption* fadeshape = new ComboOption ( @@ -2204,118 +2333,69 @@ RCOptionEditor::RCOptionEditor () lm->add (Manual, _("manual layering")); add_option (_("Editor"), lm); - add_option (_("Editor"), - new BoolOption ( - "rubberbanding-snaps-to-grid", - _("Make rubberband selection rectangle snap to the grid"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_rubberbanding_snaps_to_grid), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_rubberbanding_snaps_to_grid) - )); + ComboOption *rsas = new ComboOption ( + "region-selection-after-split", + _("After splitting selected regions, select"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_region_selection_after_split), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_region_selection_after_split)); - add_option (_("Editor"), + // TODO: decide which of these modes are really useful + rsas->add(None, _("no regions")); + // rsas->add(NewlyCreatedLeft, _("newly-created regions before the split")); + // rsas->add(NewlyCreatedRight, _("newly-created regions after the split")); + rsas->add(NewlyCreatedBoth, _("newly-created regions")); + // rsas->add(Existing, _("unmodified regions in the existing selection")); + // rsas->add(ExistingNewlyCreatedLeft, _("existing selection and newly-created regions before the split")); + // rsas->add(ExistingNewlyCreatedRight, _("existing selection and newly-created regions after the split")); + rsas->add(ExistingNewlyCreatedBoth, _("existing selection and newly-created regions")); + + add_option (_("Editor"), rsas); + + add_option (_("Editor/Waveforms"), new OptionEditorHeading (_("Waveforms"))); + +if (!Profile->get_mixbus()) { + add_option (_("Editor/Waveforms"), new BoolOption ( "show-waveforms", _("Show waveforms in regions"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_waveforms), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_waveforms) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_waveforms), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_waveforms) )); +} // !mixbus - add_option (_("Editor"), - new BoolComboOption ( - "show-region-gain-envelopes", - _("Show gain envelopes in audio regions"), - _("in all modes"), - _("only in Draw and Internal Edit modes"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_region_gain), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_region_gain) + add_option (_("Editor/Waveforms"), + new BoolOption ( + "show-waveforms-while-recording", + _("Show waveforms for audio while it is being recorded"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_waveforms_while_recording), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_waveforms_while_recording) )); ComboOption* wfs = new ComboOption ( "waveform-scale", _("Waveform scale"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_waveform_scale), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_waveform_scale) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_waveform_scale), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_waveform_scale) ); wfs->add (Linear, _("linear")); wfs->add (Logarithmic, _("logarithmic")); - add_option (_("Editor"), wfs); + add_option (_("Editor/Waveforms"), wfs); ComboOption* wfsh = new ComboOption ( "waveform-shape", _("Waveform shape"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_waveform_shape), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_waveform_shape) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_waveform_shape), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_waveform_shape) ); wfsh->add (Traditional, _("traditional")); wfsh->add (Rectified, _("rectified")); - add_option (_("Editor"), wfsh); - - add_option (_("Editor"), new ClipLevelOptions (_ui_config)); - - add_option (_("Editor"), - new BoolOption ( - "show-waveforms-while-recording", - _("Show waveforms for audio while it is being recorded"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_waveforms_while_recording), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_waveforms_while_recording) - )); - - add_option (_("Editor"), - new BoolOption ( - "show-zoom-tools", - _("Show zoom toolbar"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_zoom_tools), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_zoom_tools) - )); - - add_option (_("Editor"), - new BoolOption ( - "update-editor-during-summary-drag", - _("Update editor window during drags of the summary"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_update_editor_during_summary_drag), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_update_editor_during_summary_drag) - )); - - bo = new BoolOption ( - "name-new-markers", - _("Name new markers"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_name_new_markers), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_name_new_markers) - ); - - add_option (_("Editor"), bo); - Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), _("If enabled, popup a dialog when a new marker is created to allow its name to be set as it is created." - "\n\nYou can always rename markers by right-clicking on them")); - - add_option (_("Editor"), - new BoolOption ( - "autoscroll-editor", - _("Auto-scroll editor window when dragging near its edges"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_autoscroll_editor), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_autoscroll_editor) - )); - - ComboOption *rsas = new ComboOption ( - "region-selection-after-split", - _("After splitting selected regions, select"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_region_selection_after_split), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_region_selection_after_split)); - - // TODO: decide which of these modes are really useful - rsas->add(None, _("no regions")); - // rsas->add(NewlyCreatedLeft, _("newly-created regions before the split")); - // rsas->add(NewlyCreatedRight, _("newly-created regions after the split")); - rsas->add(NewlyCreatedBoth, _("newly-created regions")); - // rsas->add(Existing, _("unmodified regions in the existing selection")); - // rsas->add(ExistingNewlyCreatedLeft, _("existing selection and newly-created regions before the split")); - // rsas->add(ExistingNewlyCreatedRight, _("existing selection and newly-created regions after the split")); - rsas->add(ExistingNewlyCreatedBoth, _("existing selection and newly-created regions")); + add_option (_("Editor/Waveforms"), wfsh); - add_option (_("Editor"), rsas); + add_option (_("Editor/Waveforms"), new ClipLevelOptions ()); /* AUDIO */ @@ -2353,6 +2433,7 @@ RCOptionEditor::RCOptionEditor () )); add_option (_("Audio"), new OptionEditorHeading (_("Connection of tracks and busses"))); +if (!Profile->get_mixbus()) { add_option (_("Audio"), new BoolOption ( @@ -2387,6 +2468,19 @@ RCOptionEditor::RCOptionEditor () add_option (_("Audio"), oac); + bo = new BoolOption ( + "strict-io", + _("Use 'Strict-I/O' for new tracks or Busses"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_strict_io), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_strict_io) + ); + + add_option (_("Audio"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("With strict-i/o enabled, Effect Processors will not modify the number of channels on a track. The number of output channels will always match the number of input channels.")); + +} // !mixbus + add_option (_("Audio"), new OptionEditorHeading (_("Denormals"))); add_option (_("Audio"), @@ -2436,24 +2530,6 @@ RCOptionEditor::RCOptionEditor () add_option (_("Audio"), dm); - add_option (_("Audio"), new OptionEditorHeading (_("Plugins"))); - - add_option (_("Audio"), - new BoolOption ( - "plugins-stop-with-transport", - _("Silence plugins when the transport is stopped"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport) - )); - - add_option (_("Audio"), - new BoolOption ( - "new-plugins-active", - _("Make new plugins active"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active) - )); - add_option (_("Audio"), new OptionEditorHeading (_("Regions"))); add_option (_("Audio"), @@ -2474,15 +2550,7 @@ RCOptionEditor::RCOptionEditor () /* SOLO AND MUTE */ - add_option (_("Solo / mute"), new OptionEditorHeading (_("Solo"))); - - add_option (_("Solo / mute"), - new FaderOption ( - "solo-mute-gain", - _("Solo-in-place mute cut (dB)"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_gain), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_gain) - )); + add_option (_("Solo & mute"), new OptionEditorHeading (_("Solo"))); _solo_control_is_listen_control = new BoolOption ( "solo-control-is-listen-control", @@ -2491,7 +2559,39 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control) ); - add_option (_("Solo / mute"), _solo_control_is_listen_control); + add_option (_("Solo & mute"), _solo_control_is_listen_control); + + add_option (_("Solo & mute"), + new BoolOption ( + "exclusive-solo", + _("Exclusive solo"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_exclusive_solo), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_exclusive_solo) + )); + + add_option (_("Solo & mute"), + new BoolOption ( + "show-solo-mutes", + _("Show solo muting"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_solo_mutes), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes) + )); + + add_option (_("Solo & mute"), + new BoolOption ( + "solo-mute-override", + _("Soloing overrides muting"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_override), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_override) + )); + + add_option (_("Solo & mute"), + new FaderOption ( + "solo-mute-gain", + _("Solo-in-place mute cut (dB)"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_gain), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_gain) + )); _listen_position = new ComboOption ( "listen-position", @@ -2503,7 +2603,7 @@ RCOptionEditor::RCOptionEditor () _listen_position->add (AfterFaderListen, _("after-fader (AFL)")); _listen_position->add (PreFaderListen, _("pre-fader (PFL)")); - add_option (_("Solo / mute"), _listen_position); + add_option (_("Solo & mute"), _listen_position); ComboOption* pp = new ComboOption ( "pfl-position", @@ -2515,7 +2615,7 @@ RCOptionEditor::RCOptionEditor () pp->add (PFLFromBeforeProcessors, _("before pre-fader processors")); pp->add (PFLFromAfterProcessors, _("pre-fader but after pre-fader processors")); - add_option (_("Solo / mute"), pp); + add_option (_("Solo & mute"), pp); ComboOption* pa = new ComboOption ( "afl-position", @@ -2527,37 +2627,11 @@ RCOptionEditor::RCOptionEditor () pa->add (AFLFromBeforeProcessors, _("immediately post-fader")); pa->add (AFLFromAfterProcessors, _("after post-fader processors (before pan)")); - add_option (_("Solo / mute"), pa); + add_option (_("Solo & mute"), pa); - parameter_changed ("use-monitor-bus"); + add_option (_("Solo & mute"), new OptionEditorHeading (_("Default track / bus muting options"))); - add_option (_("Solo / mute"), - new BoolOption ( - "exclusive-solo", - _("Exclusive solo"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_exclusive_solo), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_exclusive_solo) - )); - - add_option (_("Solo / mute"), - new BoolOption ( - "show-solo-mutes", - _("Show solo muting"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_solo_mutes), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes) - )); - - add_option (_("Solo / mute"), - new BoolOption ( - "solo-mute-override", - _("Soloing overrides muting"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_override), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_override) - )); - - add_option (_("Solo / mute"), new OptionEditorHeading (_("Default track / bus muting options"))); - - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "mute-affects-pre-fader", _("Mute affects pre-fader sends"), @@ -2565,7 +2639,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_pre_fader) )); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "mute-affects-post-fader", _("Mute affects post-fader sends"), @@ -2573,7 +2647,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_post_fader) )); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "mute-affects-control-outs", _("Mute affects control outputs"), @@ -2581,7 +2655,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_control_outs) )); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "mute-affects-main-outs", _("Mute affects main outputs"), @@ -2589,15 +2663,19 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs) )); - add_option (_("Solo / mute"), new OptionEditorHeading (_("Send Routing"))); - add_option (_("Solo / mute"), +if (!ARDOUR::Profile->get_mixbus()) { + add_option (_("Solo & mute"), new OptionEditorHeading (_("Send Routing"))); + add_option (_("Solo & mute"), new BoolOption ( "link-send-and-route-panner", _("Link panners of Aux and External Sends with main panner by default"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_send_and_route_panner), sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_send_and_route_panner) )); +} + + add_option (_("MIDI"), new OptionEditorHeading (_("MIDI Preferences"))); add_option (_("MIDI"), new SpinOption ( @@ -2609,7 +2687,50 @@ RCOptionEditor::RCOptionEditor () "", 1.0, 1 )); + add_option (_("MIDI"), + new SpinOption ( + "initial-program-change", + _("Initial program change"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_initial_program_change), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_initial_program_change), + -1, 65536, 1, 10 + )); + add_option (_("MIDI"), + new BoolOption ( + "display-first-midi-bank-as-zero", + _("Display first MIDI bank/program as 0"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_first_midi_bank_is_zero), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_first_midi_bank_is_zero) + )); + + add_option (_("MIDI"), + new BoolOption ( + "never-display-periodic-midi", + _("Never display periodic MIDI messages (MTC, MIDI Clock)"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_never_display_periodic_midi), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_never_display_periodic_midi) + )); + + add_option (_("MIDI"), + new BoolOption ( + "sound-midi-notes", + _("Sound MIDI notes as they are selected in the editor"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_sound_midi_notes), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_sound_midi_notes) + )); + + add_option (_("MIDI"), + new BoolOption ( + "midi-feedback", + _("Send MIDI control feedback"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_feedback), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback) + )); + + add_option (_("MIDI/Sync"), new OptionEditorHeading (_("MIDI Clock"))); + + add_option (_("MIDI/Sync"), new BoolOption ( "send-midi-clock", _("Send MIDI Clock"), @@ -2617,7 +2738,9 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_midi_clock) )); - add_option (_("MIDI"), + add_option (_("MIDI/Sync"), new OptionEditorHeading (_("MIDI Time Code (MTC)"))); + + add_option (_("MIDI/Sync"), new BoolOption ( "send-mtc", _("Send MIDI Time Code"), @@ -2625,7 +2748,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mtc) )); - add_option (_("MIDI"), + add_option (_("MIDI/Sync"), new SpinOption ( "mtc-qf-speed-tolerance", _("Percentage either side of normal transport speed to transmit MTC"), @@ -2634,7 +2757,9 @@ RCOptionEditor::RCOptionEditor () 0, 20, 1, 5 )); - add_option (_("MIDI"), + add_option (_("MIDI/Sync"), new OptionEditorHeading (_("Midi Machine Control (MMC)"))); + + add_option (_("MIDI/Sync"), new BoolOption ( "mmc-control", _("Obey MIDI Machine Control commands"), @@ -2642,7 +2767,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_control) )); - add_option (_("MIDI"), + add_option (_("MIDI/Sync"), new BoolOption ( "send-mmc", _("Send MIDI Machine Control commands"), @@ -2650,15 +2775,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mmc) )); - add_option (_("MIDI"), - new BoolOption ( - "midi-feedback", - _("Send MIDI control feedback"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_feedback), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback) - )); - - add_option (_("MIDI"), + add_option (_("MIDI/Sync"), new SpinOption ( "mmc-receive-device-id", _("Inbound MMC device ID"), @@ -2667,7 +2784,7 @@ RCOptionEditor::RCOptionEditor () 0, 128, 1, 10 )); - add_option (_("MIDI"), + add_option (_("MIDI/Sync"), new SpinOption ( "mmc-send-device-id", _("Outbound MMC device ID"), @@ -2676,39 +2793,6 @@ RCOptionEditor::RCOptionEditor () 0, 128, 1, 10 )); - add_option (_("MIDI"), - new SpinOption ( - "initial-program-change", - _("Initial program change"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_initial_program_change), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_initial_program_change), - -1, 65536, 1, 10 - )); - - add_option (_("MIDI"), - new BoolOption ( - "display-first-midi-bank-as-zero", - _("Display first MIDI bank/program as 0"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_first_midi_bank_is_zero), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_first_midi_bank_is_zero) - )); - - add_option (_("MIDI"), - new BoolOption ( - "never-display-periodic-midi", - _("Never display periodic MIDI messages (MTC, MIDI Clock)"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_never_display_periodic_midi), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_never_display_periodic_midi) - )); - - add_option (_("MIDI"), - new BoolOption ( - "sound-midi-notes", - _("Sound MIDI notes as they are selected"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_sound_midi_notes), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_sound_midi_notes) - )); - add_option (_("MIDI"), new OptionEditorHeading (_("Midi Audition"))); ComboOption* audition_synth = new ComboOption ( @@ -2744,7 +2828,7 @@ RCOptionEditor::RCOptionEditor () #endif ) { - add_option (_("User interaction"), + add_option (_("User interaction"), new BoolOption ( "enable-translation", string_compose (_("Use translations of %1 messages\n" @@ -2760,111 +2844,303 @@ RCOptionEditor::RCOptionEditor () /* Control Surfaces */ - add_option (_("Control Surfaces"), new ControlSurfacesOptions (*this)); + add_option (_("Control Surfaces"), new ControlSurfacesOptions); - ComboOption* rm = new ComboOption ( - "remote-model", - _("Control surface remote ID"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_remote_model), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_remote_model) - ); + /* VIDEO Timeline */ + add_option (_("Video"), new VideoTimelineOptions (_rc_config)); - rm->add (UserOrdered, _("assigned by user")); - rm->add (MixerOrdered, _("follows order of mixer")); +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT) + add_option (_("Plugins"), + new RcActionButton (_("Scan for Plugins"), + sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh))); - add_option (_("Control Surfaces"), rm); +#endif - /* VIDEO Timeline */ - add_option (_("Video"), new VideoTimelineOptions (_rc_config)); + add_option (_("Plugins"), new OptionEditorHeading (_("General"))); #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT) - /* Plugin options (currrently VST only) */ - add_option (_("Plugins"), new PluginOptions (_rc_config, _ui_config)); + bo = new BoolOption ( + "show-plugin-scan-window", + _("Always Display Plugin Scan Progress"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_plugin_scan_window), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_plugin_scan_window) + ); + add_option (_("Plugins"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled a popup window showing plugin scan progress is displayed for indexing (cache load) and discovery (detect new plugins)")); +#endif + + bo = new BoolOption ( + "plugins-stop-with-transport", + _("Silence plugins when the transport is stopped"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport) + ); + add_option (_("Plugins"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled plugins will be reset at transport stop. When disabled plugins will be left unchanged at transport stop.\n\nThis mostly affects plugins with a \"tail\" like Reverbs.")); + + bo = new BoolOption ( + "new-plugins-active", + _("Make new plugins active"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active) + ); + add_option (_("Plugins"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled plugins will be activated when they are added to tracks/busses. When disabled plugins will be left inactive when they are added to tracks/busses")); + +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT) + add_option (_("Plugins/VST"), new OptionEditorHeading (_("VST"))); + add_option (_("Plugins/VST"), + new RcActionButton (_("Scan for Plugins"), + sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh))); + + bo = new BoolOption ( + "discover-vst-on-start", + _("Scan for [new] VST Plugins on Application Start"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_discover_vst_on_start), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_discover_vst_on_start) + ); + add_option (_("Plugins/VST"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled new VST plugins are searched, tested and added to the cache index on application start. When disabled new plugins will only be available after triggering a 'Scan' manually")); + +#ifdef WINDOWS_VST_SUPPORT + // currently verbose logging is only implemented for Windows VST. + bo = new BoolOption ( + "verbose-plugin-scan", + _("Verbose Plugin Scan"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_verbose_plugin_scan), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_verbose_plugin_scan) + ); + add_option (_("Plugins/VST"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled additional information for every plugin is added to the Log Window.")); +#endif + + add_option (_("Plugins/VST"), new VstTimeOutSliderOption (_rc_config)); + + add_option (_("Plugins/VST"), + new RcActionButton (_("Clear"), + sigc::mem_fun (*this, &RCOptionEditor::clear_vst_cache), + _("VST Cache:"))); + + add_option (_("Plugins/VST"), + new RcActionButton (_("Clear"), + sigc::mem_fun (*this, &RCOptionEditor::clear_vst_blacklist), + _("VST Blacklist:"))); +#endif + +#ifdef LXVST_SUPPORT + add_option (_("Plugins/VST"), + new RcActionButton (_("Edit"), + sigc::mem_fun (*this, &RCOptionEditor::edit_lxvst_path), + _("Linux VST Path:"))); + + add_option (_("Plugins/VST"), + new RcConfigDisplay ( + "plugin-path-lxvst", + _("Path:"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugin_path_lxvst), + 0)); +#endif + +#ifdef WINDOWS_VST_SUPPORT + add_option (_("Plugins/VST"), + new RcActionButton (_("Edit"), + sigc::mem_fun (*this, &RCOptionEditor::edit_vst_path), + _("Windows VST Path:"))); + add_option (_("Plugins"), + new RcConfigDisplay ( + "plugin-path-vst", + _("Path:"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugin_path_vst), + ';')); +#endif + +#ifdef AUDIOUNIT_SUPPORT + + add_option (_("Plugins/Audio Unit"), new OptionEditorHeading (_("Audio Unit"))); + add_option (_("Plugins/Audio Unit"), + new RcActionButton (_("Scan for Plugins"), + sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh))); + + bo = new BoolOption ( + "discover-audio-units", + _("Scan for AudioUnit Plugins on Application Start"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_discover_audio_units), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_discover_audio_units) + ); + add_option (_("Plugins"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled Audio Unit Plugins are discovered on application start. When disabled AU plugins will only be available after triggering a 'Scan' manually. The first successful scan will enable AU auto-scan, Any crash during plugin discovery will disable it.")); + + add_option (_("Plugins/Audio Unit"), + new RcActionButton (_("Clear"), + sigc::mem_fun (*this, &RCOptionEditor::clear_au_cache), + _("AU Cache:"))); + + add_option (_("Plugins/Audio Unit"), + new RcActionButton (_("Clear"), + sigc::mem_fun (*this, &RCOptionEditor::clear_au_blacklist), + _("AU Blacklist:"))); +#endif + +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT || defined HAVE_LV2) + add_option (_("Plugins"), new OptionEditorHeading (_("Plugin GUI"))); + add_option (_("Plugins"), + new BoolOption ( + "open-gui-after-adding-plugin", + _("Automatically open the plugin GUI when adding a new plugin"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_open_gui_after_adding_plugin), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_open_gui_after_adding_plugin) + )); + +#if (defined LV2_SUPPORT && defined LV2_EXTENDED) + add_option (_("Plugins"), + new BoolOption ( + "show-inline-display-by-default", + _("Show Plugin Inline Display on Mixerstrip by default"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_inline_display_by_default), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_inline_display_by_default) + )); + + _plugin_prefer_inline = new BoolOption ( + "prefer-inline-over-gui", + _("Don't automatically open the plugin GUI when the plugin has an inline display mode"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_prefer_inline_over_gui), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_prefer_inline_over_gui) + ); + add_option (_("Plugins"), _plugin_prefer_inline); +#endif + + add_option (_("Plugins"), new OptionEditorHeading (_("Instrument"))); + + bo = new BoolOption ( + "ask-replace-instrument", + _("Ask to replace existing instrument plugin"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_ask_replace_instrument), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_ask_replace_instrument) + ); + add_option (_("Plugins"), bo); + + bo = new BoolOption ( + "ask-setup_instrument", + _("Interactively configure instrument plugins on insert"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_ask_setup_instrument), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_ask_setup_instrument) + ); + add_option (_("Plugins"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled show a dialog to select instrument channel configuration before adding a multichannel plugin.")); + #endif /* INTERFACE */ +#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE + BoolOption* bgc = new BoolOption ( + "cairo-image-surface", + _("Disable Graphics Hardware Acceleration (requires restart)"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_cairo_image_surface), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_cairo_image_surface) + ); + + Gtkmm2ext::UI::instance()->set_tip (bgc->tip_widget(), string_compose ( + _("Render large parts of the application user-interface in software, instead of using 2D-graphics acceleration.\nThis requires restarting %1 before having an effect"), PROGRAM_NAME)); + add_option (S_("Preferences|GUI"), bgc); +#endif + #ifdef CAIRO_SUPPORTS_FORCE_BUGGY_GRADIENTS_ENVIRONMENT_VARIABLE BoolOption* bgo = new BoolOption ( "buggy-gradients", - _("Possibly improve slow graphical performance"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_buggy_gradients), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_buggy_gradients) + _("Possibly improve slow graphical performance (requires restart)"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_buggy_gradients), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_buggy_gradients) ); - Gtkmm2ext::UI::instance()->set_tip (bgo->tip_widget(), string_compose (_("This requires restarting %1 before having an effect"), PROGRAM_NAME)); + Gtkmm2ext::UI::instance()->set_tip (bgo->tip_widget(), string_compose (_("Disables hardware gradient rendering on buggy video drivers (\"buggy gradients patch\").\nThis requires restarting %1 before having an effect"), PROGRAM_NAME)); add_option (S_("Preferences|GUI"), bgo); #endif - + + add_option (S_("Preferences|GUI"), + new BoolOption ( + "use-wm-visibility", + _("Use Window Manager/Desktop visibility information"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_wm_visibility), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_wm_visibility) + )); + add_option (S_("Preferences|GUI"), new BoolOption ( "widget-prelight", _("Graphically indicate mouse pointer hovering over various widgets"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_widget_prelight), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_widget_prelight) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_widget_prelight), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_widget_prelight) )); -#ifdef TOOLTIPS_GOT_FIXED add_option (S_("Preferences|GUI"), new BoolOption ( "use-tooltips", _("Show tooltips if mouse hovers over a control"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_use_tooltips), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_use_tooltips) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_tooltips), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_tooltips) )); -#endif add_option (S_("Preferences|GUI"), new BoolOption ( "show-name-highlight", _("Use name highlight bars in region displays (requires a restart)"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_name_highlight), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_name_highlight) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_name_highlight), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_name_highlight) )); -#ifndef GTKOSX - /* font scaling does nothing with GDK/Quartz */ - add_option (S_("Preferences|GUI"), new FontScalingOptions (_ui_config)); -#endif - - add_option (S_("GUI"), + add_option (S_("Preferences|GUI"), new BoolOption ( "super-rapid-clock-update", - _("update transport clock display at FPS instead of every 100ms"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_super_rapid_clock_update), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_super_rapid_clock_update) + _("Update transport clock display at FPS instead of every 100ms"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_super_rapid_clock_update), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_super_rapid_clock_update) )); +#ifndef __APPLE__ + /* font scaling does nothing with GDK/Quartz */ + add_option (S_("Preferences|GUI"), new FontScalingOptions ()); +#endif + /* Image cache size */ Gtk::Adjustment *ics = manage (new Gtk::Adjustment(0, 1, 1024, 10)); /* 1 MB to 1GB in steps of 10MB */ HSliderOption *sics = new HSliderOption("waveform-cache-size", _("Waveform image cache size (megabytes)"), ics, - sigc::mem_fun (*ARDOUR_UI::config(), &UIConfiguration::get_waveform_cache_size), - sigc::mem_fun (*ARDOUR_UI::config(), &UIConfiguration::set_waveform_cache_size) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_waveform_cache_size), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_waveform_cache_size) ); sics->scale().set_digits (0); Gtkmm2ext::UI::instance()->set_tip (sics->tip_widget(), _("Increasing the cache size uses more memory to store waveform images, which can improve graphical performance.")); add_option (S_("Preferences|GUI"), sics); - + +if (!ARDOUR::Profile->get_mixbus()) { /* Lock GUI timeout */ Gtk::Adjustment *lts = manage (new Gtk::Adjustment(0, 0, 1000, 1, 10)); HSliderOption *slts = new HSliderOption("lock-gui-after-seconds", _("Lock timeout (seconds)"), lts, - sigc::mem_fun (*ARDOUR_UI::config(), &UIConfiguration::get_lock_gui_after_seconds), - sigc::mem_fun (*ARDOUR_UI::config(), &UIConfiguration::set_lock_gui_after_seconds) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_lock_gui_after_seconds), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_lock_gui_after_seconds) ); slts->scale().set_digits (0); Gtkmm2ext::UI::instance()->set_tip (slts->tip_widget(), _("Lock GUI after this many idle seconds (zero to never lock)")); add_option (S_("Preferences|GUI"), slts); +} // !mixbus /* The names of these controls must be the same as those given in MixerStrip for the actual widgets being controlled. @@ -2875,14 +3151,15 @@ RCOptionEditor::RCOptionEditor () _mixer_strip_visibility.add (0, X_("SoloIsoLock"), _("Solo Iso / Lock")); _mixer_strip_visibility.add (0, X_("Output"), _("Output")); _mixer_strip_visibility.add (0, X_("Comments"), _("Comments")); - + _mixer_strip_visibility.add (0, X_("VCA"), _("VCA Assigns")); + add_option ( S_("Preferences|GUI"), new VisibilityOption ( _("Mixer Strip"), &_mixer_strip_visibility, - sigc::mem_fun (*_ui_config, &UIConfiguration::get_mixer_strip_visibility), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_mixer_strip_visibility) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_mixer_strip_visibility), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_mixer_strip_visibility) ) ); @@ -2890,17 +3167,25 @@ RCOptionEditor::RCOptionEditor () new BoolOption ( "default-narrow_ms", _("Use narrow strips in the mixer by default"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_default_narrow_ms), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_default_narrow_ms) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_default_narrow_ms), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_default_narrow_ms) )); + add_option (S_("Preferences|GUI"), + new ColumVisibilityOption ( + "action-table-columns", _("Action Script Button Visibility"), 3, + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_action_table_columns), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_action_table_columns) + ) + ); + add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Metering"))); ComboOption* mht = new ComboOption ( "meter-hold", _("Peak hold time"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_hold), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_hold) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_meter_hold), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_hold) ); mht->add (MeterHoldOff, _("off")); @@ -2930,8 +3215,8 @@ RCOptionEditor::RCOptionEditor () ComboOption* mlu = new ComboOption ( "meter-line-up-level", _("Meter line-up level; 0dBu"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_line_up_level), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_line_up_level) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_meter_line_up_level), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_line_up_level) ); mlu->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)")); @@ -2946,8 +3231,8 @@ RCOptionEditor::RCOptionEditor () ComboOption* mld = new ComboOption ( "meter-line-up-din", _("IEC1/DIN Meter line-up level; 0dBu"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_line_up_din), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_line_up_din) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_meter_line_up_din), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_line_up_din) ); mld->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)")); @@ -2962,8 +3247,8 @@ RCOptionEditor::RCOptionEditor () ComboOption* mvu = new ComboOption ( "meter-vu-standard", _("VU Meter standard"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_vu_standard), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_vu_standard) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_meter_vu_standard), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_vu_standard) ); mvu->add (MeteringVUfrench, _("0VU = -2dBu (France)")); @@ -2977,8 +3262,8 @@ RCOptionEditor::RCOptionEditor () HSliderOption *mpks = new HSliderOption("meter-peak", _("Peak threshold [dBFS]"), mpk, - sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_peak), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_peak) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_meter_peak), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_peak) ); @@ -3031,7 +3316,7 @@ RCOptionEditor::RCOptionEditor () Gtkmm2ext::UI::instance()->set_tip (mpks->tip_widget(), - _("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red.")); + _("Specify the audio signal level in dBFS at and above which the meter-peak indicator will flash red.")); add_option (S_("Preferences|Metering"), mpks); @@ -3039,14 +3324,50 @@ RCOptionEditor::RCOptionEditor () new BoolOption ( "meter-style-led", _("LED meter style"), - sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_style_led), - sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_style_led) + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_meter_style_led), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_style_led) + )); + + add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Editor Meters"))); + + add_option (S_("Preferences|Metering"), + new BoolOption ( + "show-track-meters", + _("Show meters on tracks in the editor"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_track_meters), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_track_meters) + )); + + add_option (S_("Preferences|Metering"), + new BoolOption ( + "editor-stereo-only-meters", + _("Show at most stereo meters in the track-header"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_editor_stereo_only_meters), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_editor_stereo_only_meters) + )); + + add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Post Export Analysis"))); + + add_option (S_("Preferences|Metering"), + new BoolOption ( + "save-export-analysis-image", + _("Save loudness analysis as image file"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_save_export_analysis_image), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_save_export_analysis_image) )); /* and now the theme manager */ ThemeManager* tm = manage (new ThemeManager); add_page (_("Theme"), *tm); + + add_option (_("Theme/Colors"), new ColorThemeManager); + + //trigger some parameter-changed messages which affect widget-visibility or -sensitivity + parameter_changed ("send-ltc"); + parameter_changed ("sync-source"); + parameter_changed ("use-monitor-bus"); + parameter_changed ("open-gui-after-adding-plugin"); } void @@ -3084,6 +3405,10 @@ RCOptionEditor::parameter_changed (string const & p) bool const s = Config->get_send_ltc (); _ltc_send_continuously->set_sensitive (s); _ltc_volume_slider->set_sensitive (s); + } else if (p == "open-gui-after-adding-plugin" || p == "show-inline-display-by-default") { +#if (defined LV2_SUPPORT && defined LV2_EXTENDED) + _plugin_prefer_inline->set_sensitive (UIConfiguration::instance().get_open_gui_after_adding_plugin() && UIConfiguration::instance().get_show_inline_display_by_default()); +#endif } } @@ -3091,6 +3416,56 @@ void RCOptionEditor::ltc_generator_volume_changed () { _rc_config->set_ltc_output_volume (pow(10, _ltc_volume_adjustment->get_value() / 20)); } +void RCOptionEditor::plugin_scan_refresh () { + PluginManager::instance().refresh(); +} + +void RCOptionEditor::clear_vst_cache () { + PluginManager::instance().clear_vst_cache(); +} + +void RCOptionEditor::clear_vst_blacklist () { + PluginManager::instance().clear_vst_blacklist(); +} + +void RCOptionEditor::clear_au_cache () { + PluginManager::instance().clear_au_cache(); +} + +void RCOptionEditor::clear_au_blacklist () { + PluginManager::instance().clear_au_blacklist(); +} + +void RCOptionEditor::edit_lxvst_path () { + Glib::RefPtr win = get_parent_window (); + Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog ( + *current_toplevel(), _("Set Linux VST Search Path"), + _rc_config->get_plugin_path_lxvst(), + PluginManager::instance().get_default_lxvst_path() + ); + ResponseType r = (ResponseType) pd->run (); + pd->hide(); + if (r == RESPONSE_ACCEPT) { + _rc_config->set_plugin_path_lxvst(pd->get_serialized_paths()); + } + delete pd; +} + +void RCOptionEditor::edit_vst_path () { + Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog ( + *current_toplevel(), _("Set Windows VST Search Path"), + _rc_config->get_plugin_path_vst(), + PluginManager::instance().get_default_windows_vst_path() + ); + ResponseType r = (ResponseType) pd->run (); + pd->hide(); + if (r == RESPONSE_ACCEPT) { + _rc_config->set_plugin_path_vst(pd->get_serialized_paths()); + } + delete pd; +} + + void RCOptionEditor::populate_sync_options () { @@ -3109,4 +3484,29 @@ RCOptionEditor::populate_sync_options () _rc_config->set_sync_source(sync_opts.front()); } } + + parameter_changed ("sync-source"); +} + +Gtk::Window* +RCOptionEditor::use_own_window (bool and_fill_it) +{ + bool new_window = !own_window(); + + Gtk::Window* win = Tabbable::use_own_window (and_fill_it); + + if (win && new_window) { + win->set_name ("PreferencesWindow"); + ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Preferences"), this); + } + + return win; +} + +XMLNode& +RCOptionEditor::get_state () +{ + XMLNode* node = new XMLNode (X_("Preferences")); + node->add_child_nocopy (Tabbable::get_state()); + return *node; }