X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Frc_option_editor.cc;h=c1a9b87527c549d058f984e88bfdf167822ef958;hb=14c390ed027b3ba1c48084502677d1a1287bfc05;hp=9729f1715eaf5772d6d14780172892624075df30;hpb=e122506c91af60fa89081f716d431fcc9a1fe664;p=ardour.git diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 9729f1715e..c1a9b87527 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -33,11 +33,9 @@ #include #include -#include -#include -#include -#include -#include +#include "gtkmm2ext/utils.h" +#include "gtkmm2ext/gtk_ui.h" +#include "gtkmm2ext/window_title.h" #include "pbd/fpu.h" #include "pbd/cpus.h" @@ -45,15 +43,20 @@ #include "ardour/audio_backend.h" #include "ardour/audioengine.h" -#include "ardour/profile.h" -#include "ardour/dB.h" -#include "ardour/rc_configuration.h" #include "ardour/control_protocol_manager.h" +#include "ardour/dB.h" #include "ardour/port_manager.h" #include "ardour/plugin_manager.h" +#include "ardour/profile.h" +#include "ardour/rc_configuration.h" +#include "ardour/transport_master_manager.h" + #include "control_protocol/control_protocol.h" -#include "canvas/wave_view.h" +#include "waveview/wave_view.h" + +#include "widgets/paths_dialog.h" +#include "widgets/tooltips.h" #include "ardour_dialog.h" #include "ardour_ui.h" @@ -65,7 +68,7 @@ #include "midi_tracer.h" #include "rc_option_editor.h" #include "sfdb_ui.h" -#include "tooltips.h" +#include "transport_masters_dialog.h" #include "ui_config.h" #include "utils.h" @@ -75,6 +78,7 @@ using namespace Gtkmm2ext; using namespace PBD; using namespace ARDOUR; using namespace ARDOUR_UI_UTILS; +using namespace ArdourWidgets; class ClickOptions : public OptionEditorMiniPage { @@ -86,42 +90,48 @@ public: { // TODO get rid of GTK -> use OptionEditor Widgets Table* t = &table; + Label* l; + int row = 0; - Label* l = manage (left_aligned_label (_("Emphasis on first beat"))); + l = manage (left_aligned_label (_("Emphasis on first beat"))); _use_emphasis_on_click_check_button.add (*l); - t->attach (_use_emphasis_on_click_check_button, 1, 3, 0, 1, FILL); + t->attach (_use_emphasis_on_click_check_button, 1, 3, row, row + 1, FILL); _use_emphasis_on_click_check_button.signal_toggled().connect ( sigc::mem_fun (*this, &ClickOptions::use_emphasis_on_click_toggled)); + ++row; l = manage (left_aligned_label (_("Use built-in default sounds"))); _use_default_click_check_button.add (*l); - t->attach (_use_default_click_check_button, 1, 3, 1, 2, FILL); + t->attach (_use_default_click_check_button, 1, 3, row, row + 1, FILL); _use_default_click_check_button.signal_toggled().connect ( sigc::mem_fun (*this, &ClickOptions::use_default_click_toggled)); + ++row; l = manage (left_aligned_label (_("Audio file:"))); - t->attach (*l, 1, 2, 2, 3, FILL); - t->attach (_click_path_entry, 2, 3, 2, 3, FILL); + t->attach (*l, 1, 2, row, row + 1, FILL); + t->attach (_click_path_entry, 2, 3, row, row + 1, FILL); _click_browse_button.signal_clicked ().connect ( sigc::mem_fun (*this, &ClickOptions::click_browse_clicked)); - t->attach (_click_browse_button, 3, 4, 2, 3, FILL); + t->attach (_click_browse_button, 3, 4, row, row + 1, FILL); + ++row; l = manage (left_aligned_label (_("Emphasis audio file:"))); - t->attach (*l, 1, 2, 3, 4, FILL); - t->attach (_click_emphasis_path_entry, 2, 3, 3, 4, FILL); + t->attach (*l, 1, 2, row, row + 1, FILL); + t->attach (_click_emphasis_path_entry, 2, 3, row, row + 1, FILL); _click_emphasis_browse_button.signal_clicked ().connect ( sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked)); - t->attach (_click_emphasis_browse_button, 3, 4, 3, 4, FILL); + t->attach (_click_emphasis_browse_button, 3, 4, row, row + 1, FILL); + ++row; - FaderOption* fo = new FaderOption ( + _click_fader = new FaderOption ( "click-gain", _("Gain level"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_click_gain), sigc::mem_fun (*_rc_config, &RCConfiguration::set_click_gain) ); - fo->add_to_page (this); - fo->set_state_from_config (); + _click_fader->add_to_page (this); + _click_fader->set_state_from_config (); _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)); @@ -129,7 +139,7 @@ public: 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); + _use_emphasis_on_click_check_button.set_active (_rc_config->get_use_click_emphasis ()); } else { _use_default_click_check_button.set_active (false); @@ -146,6 +156,8 @@ public: } else if (p == "use-click-emphasis") { bool x = _rc_config->get_use_click_emphasis (); _use_emphasis_on_click_check_button.set_active (x); + } else if (p == "click-gain") { + _click_fader->set_state_from_config (); } } @@ -237,6 +249,7 @@ private: Entry _click_emphasis_path_entry; Button _click_browse_button; Button _click_emphasis_browse_button; + FaderOption* _click_fader; }; class UndoOptions : public OptionEditorComponent @@ -393,13 +406,13 @@ static const struct { class KeyboardOptions : public OptionEditorMiniPage { public: - KeyboardOptions () : - _delete_button_adjustment (3, 1, 12), - _delete_button_spin (_delete_button_adjustment), - _edit_button_adjustment (3, 1, 5), - _edit_button_spin (_edit_button_adjustment), - _insert_note_button_adjustment (3, 1, 5), - _insert_note_button_spin (_insert_note_button_adjustment) + KeyboardOptions () + : _delete_button_adjustment (3, 1, 12) + , _delete_button_spin (_delete_button_adjustment) + , _edit_button_adjustment (3, 1, 5) + , _edit_button_spin (_edit_button_adjustment) + , _insert_note_button_adjustment (3, 1, 5) + , _insert_note_button_spin (_insert_note_button_adjustment) { // TODO get rid of GTK -> use OptionEditor Widgets @@ -414,13 +427,7 @@ 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)); - break; - } - } + (string_compose (_("Recommended Setting: %1 + button 3 (right mouse button)%2"), Keyboard::primary_modifier_name (), restart_msg))); Table* t = &table; @@ -467,7 +474,6 @@ public: t->attach (_edit_button_spin, col + 4, col + 5, row, row + 1, SHRINK , FILL); _edit_button_spin.set_name ("OptionsEntry"); - _edit_button_adjustment.set_value (Keyboard::edit_button()); _edit_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::edit_button_changed)); ++row; @@ -476,13 +482,7 @@ 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)); - break; - } - } + (string_compose (_("Recommended Setting: %1 + button 3 (right mouse button)%2"), Keyboard::tertiary_modifier_name (), restart_msg))); l = manage (left_aligned_label (_("Delete using:"))); l->set_name ("OptionsLabel"); @@ -497,7 +497,6 @@ public: t->attach (_delete_button_spin, col + 4, col + 5, row, row + 1, SHRINK, FILL); _delete_button_spin.set_name ("OptionsEntry"); - _delete_button_adjustment.set_value (Keyboard::delete_button()); _delete_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_button_changed)); ++row; @@ -506,13 +505,7 @@ 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)); - break; - } - } + (string_compose (_("Recommended Setting: %1 + button 1 (left mouse button)%2"), Keyboard::primary_modifier_name (), restart_msg))); l = manage (left_aligned_label (_("Insert note using:"))); l->set_name ("OptionsLabel"); @@ -527,7 +520,6 @@ public: t->attach (_insert_note_button_spin, col + 4, col + 5, row, row + 1, SHRINK, FILL); _insert_note_button_spin.set_name ("OptionsEntry"); - _insert_note_button_adjustment.set_value (Keyboard::insert_note_button()); _insert_note_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::insert_note_button_changed)); ++row; @@ -551,12 +543,6 @@ public: 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)); - break; - } - } l = manage (left_aligned_label (_("Copy items using:"))); l->set_name ("OptionsLabel"); @@ -570,7 +556,6 @@ 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__ @@ -579,12 +564,6 @@ public: 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)); - break; - } - } l = manage (left_aligned_label (_("Constrain drag using:"))); l->set_name ("OptionsLabel"); @@ -599,15 +578,9 @@ public: 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 ()); + std::string 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; - } - } + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); l = manage (left_aligned_label (_("Push points using:"))); l->set_name ("OptionsLabel"); @@ -629,13 +602,7 @@ public: 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)); - break; - } - } + (string_compose (_("Recommended Setting: %1%2"), Keyboard::primary_modifier_name (), restart_msg))); l = manage (left_aligned_label (_("Trim contents using:"))); l->set_name ("OptionsLabel"); @@ -652,13 +619,7 @@ public: 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)); - break; - } - } + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); l = manage (left_aligned_label (_("Anchored trim using:"))); l->set_name ("OptionsLabel"); @@ -674,13 +635,6 @@ public: set_popdown_strings (_trim_jump_combo, dumb); _trim_jump_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::trim_jump_modifier_chosen)); - for (int x = 0; modifiers[x].name; ++x) { - if (modifiers[x].modifier == (guint) Keyboard::trim_jump_modifier ()) { - _trim_jump_combo.set_active_text (S_(modifiers[x].name)); - break; - } - } - l = manage (left_aligned_label (_("Jump after trim using:"))); l->set_name ("OptionsLabel"); @@ -696,13 +650,7 @@ public: 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)); - break; - } - } + (string_compose (_("Recommended Setting: %1%2"), Keyboard::tertiary_modifier_name (), restart_msg))); // XXX 2ndary l = manage (left_aligned_label (_("Resize notes relatively using:"))); l->set_name ("OptionsLabel"); @@ -730,13 +678,7 @@ public: 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)); - break; - } - } + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); l = manage (left_aligned_label (_("Ignore snap using:"))); l->set_name ("OptionsLabel"); @@ -756,13 +698,7 @@ public: 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)); - break; - } - } + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); l = manage (left_aligned_label (_("Snap relatively using:"))); l->set_name ("OptionsLabel"); @@ -785,13 +721,7 @@ public: _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)); - break; - } - } + (string_compose (_("Recommended Setting: %1%2"), Keyboard::tertiary_modifier_name (), restart_msg))); l = manage (left_aligned_label (_("Resize overlapped regions using:"))); l->set_name ("OptionsLabel"); @@ -813,21 +743,24 @@ 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 ()); + mod_str = string_compose (X_("%1-%2"), Keyboard::primary_modifier_name (), Keyboard::secondary_modifier_name ()); // XXX just 2ndary ?! 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)); - break; - } - } + (string_compose (_("Recommended Setting: %1%2"), mod_str, restart_msg))); l = manage (left_aligned_label (_("Fine adjust using:"))); l->set_name ("OptionsLabel"); t->attach (*l, col, col + 1, row, row + 1, FILL, FILL); t->attach (_fine_adjust_combo, col + 1, col + 2, row, row + 1, FILL | EXPAND, FILL); + + OptionEditorHeading* h = new OptionEditorHeading (_("Reset")); + h->add_to_page (this); + + RcActionButton* rb = new RcActionButton (_("Reset to recommended defaults"), + sigc::mem_fun (*this, &KeyboardOptions::reset_to_defaults)); + rb->add_to_page (this); + + set_state_from_config (); } void parameter_changed (string const &) @@ -837,7 +770,56 @@ public: void set_state_from_config () { - /* XXX: these aren't really config options... */ + _delete_button_adjustment.set_value (Keyboard::delete_button()); + _insert_note_button_adjustment.set_value (Keyboard::insert_note_button()); + _edit_button_adjustment.set_value (Keyboard::edit_button()); + + 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)); + } + if (modifiers[x].modifier == Keyboard::delete_modifier ()) { + _delete_modifier_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == Keyboard::edit_modifier ()) { + _edit_modifier_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == Keyboard::insert_note_modifier ()) { + _insert_note_modifier_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == (guint) Keyboard::CopyModifier) { + _copy_modifier_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == (guint) ArdourKeyboard::constraint_modifier ()) { + _constraint_modifier_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == (guint) ArdourKeyboard::push_points_modifier ()) { + _push_points_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == (guint) ArdourKeyboard::trim_contents_modifier ()) { + _trim_contents_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == (guint) ArdourKeyboard::trim_anchored_modifier ()) { + _trim_anchored_combo.set_active_text (S_(modifiers[x].name)); + } +#if 0 + if (modifiers[x].modifier == (guint) Keyboard::trim_jump_modifier ()) { + _trim_jump_combo.set_active_text (S_(modifiers[x].name)); + } +#endif + if (modifiers[x].modifier == (guint) ArdourKeyboard::note_size_relative_modifier ()) { + _note_size_relative_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == (guint) Keyboard::snap_modifier ()) { + _snap_modifier_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == (guint) Keyboard::snap_delta_modifier ()) { + _snap_delta_combo.set_active_text (S_(modifiers[x].name)); + } + if (modifiers[x].modifier == (guint) ArdourKeyboard::fine_adjust_modifier ()) { + _fine_adjust_combo.set_active_text (S_(modifiers[x].name)); + } + } } void add_to_page (OptionEditorPage* p) @@ -1035,6 +1017,56 @@ private: Keyboard::set_insert_note_button (_insert_note_button_spin.get_value_as_int()); } + void reset_to_defaults () + { + /* when clicking*/ + Keyboard::set_edit_modifier (Keyboard::PrimaryModifier); + Keyboard::set_edit_button (3); + Keyboard::set_delete_modifier (Keyboard::TertiaryModifier); + Keyboard::set_delete_button (3); + Keyboard::set_insert_note_modifier (Keyboard::PrimaryModifier); + Keyboard::set_insert_note_button (1); + + /* when beginning a drag */ +#ifdef __APPLE__ + Keyboard::set_copy_modifier (Keyboard::SecondaryModifier); +#else + Keyboard::set_copy_modifier (Keyboard::PrimaryModifier); +#endif + +#ifdef __APPLE__ + ArdourKeyboard::set_constraint_modifier (Keyboard::PrimaryModifier); +#else + ArdourKeyboard::set_constraint_modifier (Keyboard::TertiaryModifier); +#endif + ArdourKeyboard::set_push_points_modifier (Keyboard::PrimaryModifier | Keyboard::Level4Modifier); + + /* when beginning a trim */ + ArdourKeyboard::set_trim_contents_modifier (Keyboard::PrimaryModifier); + ArdourKeyboard::set_trim_anchored_modifier (Keyboard::PrimaryModifier | Keyboard::TertiaryModifier); + ArdourKeyboard::set_note_size_relative_modifier (Keyboard::TertiaryModifier); // XXX better: 2ndary + + /* while dragging */ +#ifdef __APPLE__ + Keyboard::set_snap_modifier (Keyboard::TertiaryModifier); +#else + Keyboard::set_snap_modifier (Keyboard::SecondaryModifier); +#endif +#ifdef __APPLE__ + Keyboard::set_snap_delta_modifier (Keyboard::Level4Modifier); +#else + Keyboard::set_snap_delta_modifier (Keyboard::SecondaryModifier | Keyboard::Level4Modifier); +#endif + + /* while trimming */ + ArdourKeyboard::set_trim_overlap_modifier (Keyboard::TertiaryModifier); + + /* while dragging ctrl points */ + ArdourKeyboard::set_fine_adjust_modifier (/*Keyboard::PrimaryModifier | */Keyboard::SecondaryModifier); // XXX + + set_state_from_config (); + } + ComboBoxText _keyboard_layout_selector; ComboBoxText _edit_modifier_combo; ComboBoxText _delete_modifier_combo; @@ -1169,7 +1201,7 @@ private: { 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()); + ArdourWaveView::WaveView::set_clip_level (_clip_level_adjustment.get_value()); } Adjustment _clip_level_adjustment; @@ -1346,7 +1378,7 @@ class ControlSurfacesOptions : public OptionEditorMiniPage if (!(*i)->mandatory) { TreeModel::Row r = *_store->append (); r[_model.name] = (*i)->name; - r[_model.enabled] = ((*i)->protocol || (*i)->requested); + r[_model.enabled] = 0 != (*i)->protocol; r[_model.protocol_info] = *i; } } @@ -1363,8 +1395,9 @@ class ControlSurfacesOptions : public OptionEditorMiniPage if ((*x)[_model.protocol_info] == cpi) { _ignore_view_change++; - (*x)[_model.enabled] = (cpi->protocol || cpi->requested); + (*x)[_model.enabled] = 0 != cpi->protocol; _ignore_view_change--; + selection_changed (); // update sensitivity break; } } @@ -1374,10 +1407,12 @@ class ControlSurfacesOptions : public OptionEditorMiniPage { //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 + if (row && row[_model.enabled]) { + ControlProtocolInfo* cpi = row[_model.protocol_info]; + edit_button->set_sensitive (cpi && cpi->protocol && cpi->protocol->has_editor ()); + } else { edit_button->set_sensitive (false); + } } void view_changed (TreeModel::Path const &, TreeModel::iterator const & i) @@ -1440,7 +1475,7 @@ class ControlSurfacesOptions : public OptionEditorMiniPage * tear_down_gui() hides an deletes the Window if it exists. */ ArdourWindow* win = new ArdourWindow (*((Gtk::Window*) _view.get_toplevel()), title.get_string()); - win->set_title ("Control Protocol Options"); + win->set_title (_("Control Protocol Settings")); win->add (*box); box->show (); win->present (); @@ -1507,7 +1542,7 @@ class VideoTimelineOptions : public OptionEditorMiniPage t->attach (_video_advanced_setup_button, 1, 4, n, n + 1, FILL); _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.")); + _("When enabled you can specify a custom video-server URL and docroot. - Do not enable this option unless you know what you are doing.")); ++n; Label* l = manage (new Label (_("Video Server URL:"))); @@ -1523,7 +1558,7 @@ class VideoTimelineOptions : public OptionEditorMiniPage t->attach (*l, 1, 2, n, n + 1, FILL); t->attach (_video_server_docroot_entry, 2, 4, n, n + 1); 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.")); + _("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 unavailable. It is used for the local video-monitor and file-browsing when opening/adding a video file.")); ++n; l = manage (new Label ("")); @@ -1559,9 +1594,6 @@ class VideoTimelineOptions : public OptionEditorMiniPage _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)); } void server_url_changed () @@ -1594,13 +1626,13 @@ class VideoTimelineOptions : public OptionEditorMiniPage void custom_xjadeo_path_changed () { - UIConfiguration::instance().set_xjadeo_binary (_custom_xjadeo_path.get_text()); + _rc_config->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.set_filename (_rc_config->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) { @@ -1611,7 +1643,7 @@ class VideoTimelineOptions : public OptionEditorMiniPage #endif Glib::file_test (filename, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE) )) { - UIConfiguration::instance().set_xjadeo_binary (filename); + _rc_config->set_xjadeo_binary (filename); } } } @@ -1634,7 +1666,7 @@ class VideoTimelineOptions : public OptionEditorMiniPage _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()); + _custom_xjadeo_path.set_text (_rc_config->get_xjadeo_binary()); } } @@ -2077,14 +2109,7 @@ MidiPortOptions::pretty_name_edit (std::string const & path, string const & new_ return; } - boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); - if (backend) { - ARDOUR::PortEngine::PortHandle ph = backend->get_port_by_name ((*iter)[midi_port_columns.name]); - if (ph) { - backend->set_port_property (ph, "http://jackaudio.org/metadata/pretty-name", new_text, ""); - (*iter)[midi_port_columns.pretty_name] = new_text; - } - } + AudioEngine::instance()->set_midi_port_pretty_name ((*iter)[midi_port_columns.name], new_text); } /*============*/ @@ -2092,7 +2117,11 @@ MidiPortOptions::pretty_name_edit (std::string const & path, string const & new_ RCOptionEditor::RCOptionEditor () : OptionEditorContainer (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME)) - , Tabbable (*this, _("Preferences")) /* pack self-as-vbox into tabbable */ + , Tabbable (*this, _("Preferences") +#ifdef MIXBUS + , false // detached by default (first start, no instant.xml) +#endif + ) /* pack self-as-vbox into tabbable */ , _rc_config (Config) , _mixer_strip_visibility ("mixer-element-visibility") { @@ -2102,7 +2131,6 @@ RCOptionEditor::RCOptionEditor () uint32_t hwcpus = hardware_concurrency (); BoolOption* bo; - BoolComboOption* bco; if (hwcpus > 1) { add_option (_("General"), new OptionEditorHeading (_("DSP CPU Utilization"))); @@ -2126,50 +2154,29 @@ RCOptionEditor::RCOptionEditor () add_option (_("General"), procs); } - add_option (_("General"), new OptionEditorHeading (S_("Options|Undo"))); - - add_option (_("General"), new UndoOptions (_rc_config)); - - add_option (_("General"), - new BoolOption ( - "verify-remove-last-capture", - _("Verify removal of last capture"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_verify_remove_last_capture), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_verify_remove_last_capture) - )); + /* Image cache size */ + add_option (_("General"), new OptionEditorHeading (_("Memory Usage"))); - add_option (_("General"), new OptionEditorHeading (_("Session Management"))); + HSliderOption *sics = new HSliderOption ("waveform-cache-size", + _("Waveform image cache size (megabytes)"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_waveform_cache_size), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_waveform_cache_size), + 1, 1024, 10 /* 1 MB to 1GB in steps of 10MB */ + ); + 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 (_("General"), sics); - add_option (_("General"), - new BoolOption ( - "periodic-safety-backups", - _("Make periodic backups of the session file"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_periodic_safety_backups), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_periodic_safety_backups) - )); + add_option (_("General"), new OptionEditorHeading (_("Engine"))); add_option (_("General"), new BoolOption ( - "only-copy-imported-files", - _("Always 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 (_("General"), new DirectoryOption ( - X_("default-session-parent-dir"), - _("Default folder for new sessions:"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_session_parent_dir), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_session_parent_dir) - )); - - add_option (_("General"), - new SpinOption ( - "max-recent-sessions", - _("Maximum number of recent sessions"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_max_recent_sessions), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_max_recent_sessions), - 0, 1000, 1, 20 + "try-autostart-engine", + _("Try to auto-launch audio/midi engine"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_try_autostart_engine), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_try_autostart_engine) )); add_option (_("General"), new OptionEditorHeading (_("Automation"))); @@ -2194,48 +2201,97 @@ RCOptionEditor::RCOptionEditor () add_option (_("General"), new OptionEditorHeading (_("Tempo"))); - BoolOption* tsf; - - tsf = new BoolOption ( + bo = new BoolOption ( "allow-non-quarter-pulse", _("Allow non quarter-note pulse"), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_allow_non_quarter_pulse), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_allow_non_quarter_pulse) ); - Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), string_compose (_("When enabled %1 will allow tempo to be expressed in divisions per minute\n" "When disabled %1 will only allow tempo to be expressed in quarter notes per minute"), PROGRAM_NAME)); - add_option (_("General"), tsf); + add_option (_("General"), bo); -#ifdef ENABLE_NLS + if (!ARDOUR::Profile->get_mixbus()) { + add_option (_("General"), new OptionEditorHeading (_("GUI Lock"))); + /* Lock GUI timeout */ - add_option (_("General/Translation"), new OptionEditorHeading (_("Internationalization"))); + HSliderOption *slts = new HSliderOption("lock-gui-after-seconds", + _("Lock timeout (seconds)"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_lock_gui_after_seconds), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_lock_gui_after_seconds), + 0, 1000, 1, 10 + ); + 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 (_("General"), slts); + } // !mixbus - bo = new BoolOption ( - "enable-translation", - _("Use translations"), - sigc::ptr_fun (ARDOUR::translations_are_enabled), - sigc::ptr_fun (ARDOUR::set_translations_enabled) - ); + add_option (_("General/Session"), new OptionEditorHeading (S_("Options|Undo"))); - bo->set_note (string_compose (_("These settings will only take effect after %1 is restarted (if available for your language preferences)."), PROGRAM_NAME)); + add_option (_("General/Session"), new UndoOptions (_rc_config)); - add_option (_("General/Translation"), bo); + add_option (_("General/Session"), + new BoolOption ( + "verify-remove-last-capture", + _("Verify removal of last capture"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_verify_remove_last_capture), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_verify_remove_last_capture) + )); - _l10n = new ComboOption ( - "locale-mode", - _("Localization"), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_locale_mode), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_locale_mode) - ); + add_option (_("General/Session"), new OptionEditorHeading (_("Session Management"))); - _l10n->add (ARDOUR::SET_LC_ALL, _("Set complete locale")); - _l10n->add (ARDOUR::SET_LC_MESSAGES, _("Enable only message translation")); - _l10n->add (ARDOUR::SET_LC_MESSAGES_AND_LC_NUMERIC, _("Translate messages and format numeric format")); - _l10n->set_note (_("This setting is provided for plugin compatibility. e.g. some plugins on some systems expect the decimal point to be a dot.")); + add_option (_("General/Session"), + new BoolOption ( + "periodic-safety-backups", + _("Make periodic backups of the session file"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_periodic_safety_backups), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_periodic_safety_backups) + )); + + add_option (_("General/Session"), + new BoolOption ( + "only-copy-imported-files", + _("Always 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 (_("General/Session"), new DirectoryOption ( + X_("default-session-parent-dir"), + _("Default folder for new sessions:"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_session_parent_dir), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_session_parent_dir) + )); + + add_option (_("General/Session"), + new SpinOption ( + "max-recent-sessions", + _("Maximum number of recent sessions"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_max_recent_sessions), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_max_recent_sessions), + 0, 1000, 1, 20 + )); + + +#if ENABLE_NLS + + add_option (_("General/Translation"), new OptionEditorHeading (_("Internationalization"))); + + bo = new BoolOption ( + "enable-translation", + _("Use translations"), + sigc::ptr_fun (ARDOUR::translations_are_enabled), + sigc::ptr_fun (ARDOUR::set_translations_enabled) + ); + + bo->set_note (string_compose (_("These settings will only take effect after %1 is restarted (if available for your language preferences)."), PROGRAM_NAME)); + + add_option (_("General/Translation"), bo); - add_option (_("General/Translation"), _l10n); parameter_changed ("enable-translation"); #endif // ENABLE_NLS @@ -2244,17 +2300,9 @@ RCOptionEditor::RCOptionEditor () add_option (_("Editor"), new OptionEditorHeading (_("General"))); - add_option (_("Editor"), - new BoolOption ( - "rubberbanding-snaps-to-grid", - _("Snap rubberband to 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", - _("Prompt for a new marker name"), + _("Prompt for new marker names"), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_name_new_markers), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_name_new_markers) ); @@ -2270,16 +2318,43 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_draggable_playhead) )); -if (!Profile->get_mixbus()) { + ComboOption* dps = new ComboOption ( + "draggable-playhead-speed", + _("Playhead dragging speed (%)"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_draggable_playhead_speed), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_draggable_playhead_speed) + ); + dps->add (0.05, _("5%")); + dps->add (0.1, _("10%")); + dps->add (0.25, _("25%")); + dps->add (0.5, _("50%")); + dps->add (1.0, _("100%")); + add_option (_("Editor"), dps); + + ComboOption* eet = new ComboOption ( + "extra-ui-extents-time", + _("Limit zooming & summary view to X minutes beyond session extents"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_extra_ui_extents_time), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_extra_ui_extents_time) + ); + eet->add (1, _("1 minute")); + eet->add (2, _("2 minutes")); + eet->add (20, _("20 minutes")); + eet->add (60, _("1 hour")); + eet->add (60*2, _("2 hours")); + eet->add (60*24, _("24 hours")); + add_option (_("Editor"), eet); - add_option (_("Editor"), - new BoolOption ( - "use-mouse-position-as-zoom-focus-on-scroll", - _("Zoom to mouse position when zooming with 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 + if (!Profile->get_mixbus()) { + + add_option (_("Editor"), + new BoolOption ( + "use-mouse-position-as-zoom-focus-on-scroll", + _("Zoom to mouse position when zooming with 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 ( @@ -2333,6 +2408,16 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_automation_follows_regions) )); + bo = new BoolOption ( + "new-automation-points-on-lane", + _("Ignore Y-axis click position when adding new automation-points"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_new_automation_points_on_lane), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_new_automation_points_on_lane) + ); + add_option (_("Editor"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled The new points drawn in any automation lane will be placed on the existing line, regardless of mouse y-axis position.")); + ComboOption* fadeshape = new ComboOption ( "default-fade-shape", _("Default fade shape"), @@ -2351,16 +2436,18 @@ if (!Profile->get_mixbus()) { add_option (_("Editor"), fadeshape); - bco = new BoolComboOption ( - "use-overlap-equivalency", - _("Regions in edit groups are edited together"), - _("whenever they overlap in time"), - _("only if they have identical length and position"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_overlap_equivalency), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_overlap_equivalency) + ComboOption *eqv = new ComboOption ( + "region-equivalence", + _("Regions in active edit groups are edited together"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_region_equivalence), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_region_equivalence) ); - add_option (_("Editor"), bco); + eqv->add (Overlap, _("whenever they overlap in time")); + eqv->add (Enclosed, _("if either encloses the other")); + eqv->add (Exact, _("only if they have identical length, position and origin")); + + add_option (_("Editor"), eqv); ComboOption* lm = new ComboOption ( "layer-model", @@ -2391,6 +2478,93 @@ if (!Profile->get_mixbus()) { add_option (_("Editor"), rsas); + add_option (_("Editor/Snap"), new OptionEditorHeading (_("General Snap options:"))); + + add_option (_("Editor/Snap"), + new SpinOption ( + "snap-threshold", + _("Snap Threshold (pixels)"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_snap_threshold), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_snap_threshold), + 10, 200, + 1, 10 + )); + + add_option (_("Editor/Snap"), + new BoolOption ( + "show-snapped-cursor", + _("Show \"snapped cursor\""), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_snapped_cursor), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_snapped_cursor) + )); + + add_option (_("Editor/Snap"), + new BoolOption ( + "rubberbanding-snaps-to-grid", + _("Snap rubberband selection to grid"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_rubberbanding_snaps_to_grid), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_rubberbanding_snaps_to_grid) + )); + + add_option (_("Editor/Snap"), + new BoolOption ( + "grid-follows-internal", + _("Grid switches to alternate selection for Internal Edit tools"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_grid_follows_internal), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_grid_follows_internal) + )); + + add_option (_("Editor/Snap"), + new BoolOption ( + "rulers-follow-grid", + _("Rulers automatically change to follow the Grid mode selection"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_rulers_follow_grid), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_rulers_follow_grid) + )); + + add_option (_("Editor/Snap"), new OptionEditorHeading (_("When \"Snap\" is enabled, snap to:"))); + + + add_option (_("Editor/Snap"), + new BoolOption ( + "snap-to-marks", + _("Markers"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_snap_to_marks), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_snap_to_marks) + )); + + add_option (_("Editor/Snap"), + new BoolOption ( + "snap-to-region-sync", + _("Region Sync Points"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_snap_to_region_sync), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_snap_to_region_sync) + )); + + add_option (_("Editor/Snap"), + new BoolOption ( + "snap-to-region-start", + _("Region Starts"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_snap_to_region_start), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_snap_to_region_start) + )); + + add_option (_("Editor/Snap"), + new BoolOption ( + "snap-to-region-end", + _("Region Ends"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_snap_to_region_end), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_snap_to_region_end) + )); + + add_option (_("Editor/Snap"), + new BoolOption ( + "snap-to-grid", + _("Grid"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_snap_to_grid), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_snap_to_grid) + )); + add_option (_("Editor/Modifiers"), new OptionEditorHeading (_("Keyboard Modifiers"))); add_option (_("Editor/Modifiers"), new KeyboardOptions); add_option (_("Editor/Modifiers"), new OptionEditorBlank ()); @@ -2476,7 +2650,7 @@ if (!Profile->get_mixbus()) { add_option (_("Mixer"), pa); - add_option (_("Mixer"), new OptionEditorHeading (_("Default track / bus muting options"))); + add_option (_("Mixer"), new OptionEditorHeading (_("Default Track / Bus Muting Options"))); add_option (_("Mixer"), new BoolOption ( @@ -2511,25 +2685,20 @@ if (!Profile->get_mixbus()) { )); -if (!ARDOUR::Profile->get_mixbus()) { - add_option (_("Mixer"), new OptionEditorHeading (_("Send Routing"))); - add_option (_("Mixer"), - 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) - )); -} - - - /* AUDIO */ - - add_option (_("Audio"), new OptionEditorHeading (_("Buffering"))); + if (!ARDOUR::Profile->get_mixbus()) { + add_option (_("Mixer"), new OptionEditorHeading (_("Send Routing"))); + add_option (_("Mixer"), + 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 (_("Audio"), new BufferingOptions (_rc_config)); + /* Signal Flow */ - add_option (_("Audio"), new OptionEditorHeading (_("Monitoring"))); + add_option (_("Signal Flow"), new OptionEditorHeading (_("Monitoring"))); ComboOption* mm = new ComboOption ( "monitoring-model", @@ -2547,64 +2716,75 @@ if (!ARDOUR::Profile->get_mixbus()) { mm->add (SoftwareMonitoring, string_compose (_("%1"), prog)); mm->add (ExternalMonitoring, _("audio hardware")); - add_option (_("Audio"), mm); + add_option (_("Signal Flow"), mm); - add_option (_("Audio"), - new BoolOption ( + bo = new BoolOption ( "tape-machine-mode", _("Tape machine mode"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_tape_machine_mode), sigc::mem_fun (*_rc_config, &RCConfiguration::set_tape_machine_mode) - )); + ); + add_option (_("Signal Flow"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + string_compose (_("When enabled %1 will not monitor a track's input if the transport is stopped."), + PROGRAM_NAME)); - add_option (_("Audio"), new OptionEditorHeading (_("Track and Bus Connections"))); -if (!Profile->get_mixbus()) { + if (!Profile->get_mixbus()) { - add_option (_("Audio"), - new BoolOption ( - "auto-connect-standard-busses", - _("Auto-connect master/monitor busses"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_auto_connect_standard_busses), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_connect_standard_busses) - )); + add_option (_("Signal Flow"), new OptionEditorHeading (_("Track and Bus Connections"))); - ComboOption* iac = new ComboOption ( - "input-auto-connect", - _("Connect track inputs"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_input_auto_connect), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_input_auto_connect) - ); + add_option (_("Signal Flow"), + new BoolOption ( + "auto-connect-standard-busses", + _("Auto-connect master/monitor busses"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_auto_connect_standard_busses), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_connect_standard_busses) + )); - iac->add (AutoConnectPhysical, _("automatically to physical inputs")); - iac->add (ManualConnect, _("manually")); + ComboOption* iac = new ComboOption ( + "input-auto-connect", + _("Connect track inputs"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_input_auto_connect), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_input_auto_connect) + ); - add_option (_("Audio"), iac); + iac->add (AutoConnectPhysical, _("automatically to physical inputs")); + iac->add (ManualConnect, _("manually")); - ComboOption* oac = new ComboOption ( - "output-auto-connect", - _("Connect track and bus outputs"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_output_auto_connect), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_output_auto_connect) - ); + add_option (_("Signal Flow"), iac); - oac->add (AutoConnectPhysical, _("automatically to physical outputs")); - oac->add (AutoConnectMaster, _("automatically to master bus")); - oac->add (ManualConnect, _("manually")); + ComboOption* oac = new ComboOption ( + "output-auto-connect", + _("Connect track and bus outputs"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_output_auto_connect), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_output_auto_connect) + ); - add_option (_("Audio"), oac); + oac->add (AutoConnectPhysical, _("automatically to physical outputs")); + oac->add (AutoConnectMaster, _("automatically to master bus")); + oac->add (ManualConnect, _("manually")); - 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 (_("Signal Flow"), oac); - 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.")); + 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 (_("Signal Flow"), 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 -} // !mixbus + + /* AUDIO */ + + add_option (_("Audio"), new OptionEditorHeading (_("Buffering"))); + + add_option (_("Audio"), new BufferingOptions (_rc_config)); add_option (_("Audio"), new OptionEditorHeading (_("Denormals"))); @@ -2698,24 +2878,6 @@ if (!Profile->get_mixbus()) { -1, 65536, 1, 10 )); - add_option (_("MIDI"), new OptionEditorHeading (_("Display"))); - - 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", - _("Don't display periodic (MTC, MMC) SysEx messages in MIDI Regions"), - 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 OptionEditorHeading (_("Audition"))); add_option (_("MIDI"), @@ -2757,6 +2919,20 @@ if (!Profile->get_mixbus()) { add_option (_("Metronome"), new OptionEditorHeading (_("Metronome"))); add_option (_("Metronome"), new ClickOptions (_rc_config)); + add_option (_("Metronome"), new OptionEditorHeading (_("Options"))); + + bo = new BoolOption ( + "click-record-only", + _("Enable metronome only while recording"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_click_record_only), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_click_record_only) + ); + + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + string_compose (_("When enabled the metronome will remain silent if %1 is not recording."), PROGRAM_NAME)); + add_option (_("Metronome"), bo); + add_option (_("Metronome"), new OptionEditorBlank ()); + /* Meters */ @@ -2839,6 +3015,24 @@ if (!Profile->get_mixbus()) { add_option (S_("Preferences|Metering"), mvu); + HSliderOption *mpks = new HSliderOption("meter-peak", + _("Peak indicator threshold [dBFS]"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_meter_peak), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_peak), + -10, 0, .1, .1 + ); + + 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.")); + + add_option (S_("Preferences|Metering"), mpks); + + OptionEditorHeading* default_meter_head = new OptionEditorHeading (_("Default Meter Types")); + default_meter_head->set_note (_("These settings apply to newly created tracks and busses. For the Master bus, this will be when a new session is created.")); + + add_option (S_("Preferences|Metering"), default_meter_head); + ComboOption* mtm = new ComboOption ( "meter-type-master", _("Default Meter Type for Master Bus"), @@ -2859,7 +3053,7 @@ if (!Profile->get_mixbus()) { ComboOption* mtb = new ComboOption ( "meter-type-bus", - _("Default Meter Type for Busses"), + _("Default meter type for busses"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_type_bus), sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_type_bus) ); @@ -2876,7 +3070,7 @@ if (!Profile->get_mixbus()) { ComboOption* mtt = new ComboOption ( "meter-type-track", - _("Default Meter Type for Tracks"), + _("Default meter type for tracks"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_type_track), sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_type_track) ); @@ -2885,27 +3079,6 @@ if (!Profile->get_mixbus()) { add_option (S_("Preferences|Metering"), mtt); - HSliderOption *mpks = new HSliderOption("meter-peak", - _("Peak threshold [dBFS]"), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_meter_peak), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_peak), - -10, 0, .1, .1 - ); - - 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.")); - - add_option (S_("Preferences|Metering"), mpks); - - add_option (S_("Preferences|Metering"), - new BoolOption ( - "meter-style-led", - _("LED meter style"), - 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 (_("Post Export Analysis"))); add_option (S_("Preferences|Metering"), @@ -2920,46 +3093,48 @@ if (!Profile->get_mixbus()) { add_option (_("Transport"), new OptionEditorHeading (_("General"))); - tsf = new BoolOption ( + bo = new BoolOption ( "stop-at-session-end", _("Stop at the end of the session"), 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 (bo->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"), PROGRAM_NAME)); - add_option (_("Transport"), tsf); + add_option (_("Transport"), bo); - tsf = new BoolOption ( + bo = new BoolOption ( "latched-record-enable", _("Keep record-enable engaged on stop"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_latched_record_enable), sigc::mem_fun (*_rc_config, &RCConfiguration::set_latched_record_enable) ); - add_option (_("Transport"), tsf); + add_option (_("Transport"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled master record will remain engaged when the transport transitions to stop.\nWhen disabled master record will be disabled when the transport transitions to stop.")); - tsf = new BoolOption ( + bo = new BoolOption ( "disable-disarm-during-roll", _("Disable per-track record disarm while rolling"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_disable_disarm_during_roll), sigc::mem_fun (*_rc_config, &RCConfiguration::set_disable_disarm_during_roll) ); - Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), _("When enabled this will prevent you from accidentally stopping specific tracks recording during a take")); - add_option (_("Transport"), tsf); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), _("When enabled this will prevent you from accidentally stopping specific tracks recording during a take.")); + add_option (_("Transport"), bo); - tsf = new BoolOption ( + bo = new BoolOption ( "quieten_at_speed", _("12dB gain reduction during fast-forward and fast-rewind"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_quieten_at_speed), sigc::mem_fun (*_rc_config, &RCConfiguration::set_quieten_at_speed) ); - Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), - _("When enabled rhis will reduce the unpleasant increase in perceived volume " + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled this will reduce the unpleasant increase in perceived volume " "that occurs when fast-forwarding or rewinding through some kinds of audio")); - add_option (_("Transport"), tsf); + add_option (_("Transport"), bo); ComboOption* psc = new ComboOption ( "preroll-seconds", @@ -2968,8 +3143,11 @@ if (!Profile->get_mixbus()) { 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" + (_("The amount of preroll to apply when Play with Preroll or Record with Prerollis 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 (-4.0, _("4 Bars")); + psc->add (-2.0, _("2 Bars")); + psc->add (-1.0, _("1 Bar")); psc->add (0.0, _("0 (no pre-roll)")); psc->add (0.1, _("0.1 second")); psc->add (0.25, _("0.25 second")); @@ -2981,63 +3159,56 @@ if (!Profile->get_mixbus()) { add_option (_("Transport"), new OptionEditorHeading (_("Looping"))); - tsf = new BoolOption ( + bo = new BoolOption ( "loop-is-mode", _("Play loop is a transport mode"), 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 (bo->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); + add_option (_("Transport"), bo); - tsf = new BoolOption ( + bo = new BoolOption ( "seamless-loop", _("Do seamless looping (not possible when slaved to MTC, LTC etc)"), 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 (bo->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 " "which will often cause a small click or delay"), PROGRAM_NAME)); - add_option (_("Transport"), tsf); + add_option (_("Transport"), bo); add_option (_("Transport"), new OptionEditorHeading (_("Dropout (xrun) Handling"))); - tsf = new BoolOption ( + bo = 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 (bo->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); + add_option (_("Transport"), bo); - tsf = new BoolOption ( + bo = new BoolOption ( "create-xrun-marker", _("Create markers where xruns occur"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_create_xrun_marker), sigc::mem_fun (*_rc_config, &RCConfiguration::set_create_xrun_marker) ); - add_option (_("Transport"), tsf); + add_option (_("Transport"), bo); /* SYNC */ - add_option (_("Sync"), new OptionEditorHeading (_("External Syncronization"))); + add_option (_("Sync"), new OptionEditorHeading (_("Transport Masters"))); - _sync_source = new ComboOption ( - "sync-source", - _("External timecode source"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_sync_source), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_source) - ); - - add_option (_("Sync"), _sync_source); + add_option (_("Sync"), new WidgetOption (X_("foo"), X_("Transport Masters"), _transport_masters_widget)); _sync_framerate = new BoolOption ( "timecode-sync-frame-rate", @@ -3055,64 +3226,6 @@ if (!Profile->get_mixbus()) { add_option (_("Sync"), _sync_framerate); - _sync_genlock = new BoolOption ( - "timecode-source-is-synced", - _("Sync-lock timecode to clock (disable drift compensation)"), - 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 - (_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 " - "(Black & Burst, Wordclock, etc) with the audio interface. " - "This option disables drift compensation. The transport speed is fixed at 1.0. " - "Vari-speed LTC will be ignored and cause drift." - "\n\n" - "When disabled %1 will compensate for potential drift, regardless if the " - "timecode sources shares clock sync." - ), PROGRAM_NAME)); - - - add_option (_("Sync"), _sync_genlock); - - _sync_source_2997 = new BoolOption ( - "timecode-source-2997", - _("Lock to 29.9700 fps instead of 30000/1001"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_source_2997), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_source_2997) - ); - Gtkmm2ext::UI::instance()->set_tip - (_sync_source_2997->tip_widget(), - _("When enabled the external timecode source is assumed to use 29.97 fps instead of 30000/1001.\n" - "SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions that " - "drop-frame timecode has an accumulated error of -86ms over a 24-hour period.\n" - "Drop-frame timecode would compensate exactly for a NTSC color frame rate of 30 * 0.9990 (ie 29.970000). " - "That is not the actual rate. However, some vendors use that rate - despite it being against the specs - " - "because the variant of using exactly 29.97 fps has zero timecode drift.\n" - )); - - add_option (_("Sync"), _sync_source_2997); - - add_option (_("Sync/LTC"), new OptionEditorHeading (_("Linear Timecode (LTC) Reader"))); - - _ltc_port = new ComboStringOption ( - "ltc-source-port", - _("LTC incoming port"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_ltc_source_port), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_ltc_source_port) - ); - - vector physical_inputs; - physical_inputs.push_back (_("None")); - AudioEngine::instance()->get_physical_inputs (DataType::AUDIO, physical_inputs); - _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 (_("Sync/LTC"), _ltc_port); - add_option (_("Sync/LTC"), new OptionEditorHeading (_("Linear Timecode (LTC) Generator"))); add_option (_("Sync/LTC"), @@ -3134,7 +3247,7 @@ if (!Profile->get_mixbus()) { string_compose (_("When enabled %1 will continue to send LTC information even when the transport (playhead) is not moving"), PROGRAM_NAME)); add_option (_("Sync/LTC"), _ltc_send_continuously); - _ltc_volume_slider = new HSliderOption("ltcvol", _("LTC generator level"), + _ltc_volume_slider = new HSliderOption("ltcvol", _("LTC generator level [dBFS]"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_ltc_output_volume), sigc::mem_fun (*_rc_config, &RCConfiguration::set_ltc_output_volume), -50, 0, .5, 5, @@ -3200,7 +3313,7 @@ if (!Profile->get_mixbus()) { _("Inbound MMC device ID"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_receive_device_id), sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_receive_device_id), - 0, 128, 1, 10 + 0, 127, 1, 10 )); add_option (_("Sync/MIDI"), @@ -3209,7 +3322,7 @@ if (!Profile->get_mixbus()) { _("Outbound MMC device ID"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_send_device_id), sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_send_device_id), - 0, 128, 1, 10 + 0, 127, 1, 10 )); @@ -3223,7 +3336,7 @@ if (!Profile->get_mixbus()) { add_option (_("MIDI Ports"), new BoolOption ( - "get-midi-input-follows-selection", + "midi-input-follows-selection", _("MIDI input follows MIDI track selection"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_input_follows_selection), sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_input_follows_selection) @@ -3276,6 +3389,23 @@ if (!Profile->get_mixbus()) { 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")); + ComboOption* lna = new ComboOption ( + "limit-n-automatables", + _("Limit automatable parameters per plugin"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_limit_n_automatables), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_limit_n_automatables) + ); + lna->add (0, _("Unlimited")); + lna->add (64, _("64 parameters")); + lna->add (128, _("128 parameters")); + lna->add (256, _("256 parameters")); + lna->add (512, _("512 parameters")); + lna->add (999, _("999 parameters")); + add_option (_("Plugins"), lna); + Gtkmm2ext::UI::instance()->set_tip (lna->tip_widget(), + _("Some Plugins expose an unreasonable amount of control-inputs. This option limits the number of parameters that can are listed as automatable without restricting the number of total controls.\n\nThis reduces lag in the GUI and shortens excessively long drop-down lists for plugins with a large number of control ports.\n\nNote: This only affects newly added plugins and is applied to plugin on session-reload. Already automated parameters are retained.")); + + #if (defined WINDOWS_VST_SUPPORT || defined MACVST_SUPPORT || defined LXVST_SUPPORT) add_option (_("Plugins/VST"), new OptionEditorHeading (_("VST"))); #if 0 @@ -3440,7 +3570,7 @@ if (!Profile->get_mixbus()) { /* INTERFACE */ #if (defined OPTIONAL_CAIRO_IMAGE_SURFACE || defined CAIRO_SUPPORTS_FORCE_BUGGY_GRADIENTS_ENVIRONMENT_VARIABLE) - add_option (S_("Preferences|GUI"), new OptionEditorHeading (_("Graphics Acceleration"))); + add_option (_("Appearance"), new OptionEditorHeading (_("Graphics Acceleration"))); #endif #ifdef OPTIONAL_CAIRO_IMAGE_SURFACE @@ -3453,7 +3583,7 @@ if (!Profile->get_mixbus()) { 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); + add_option (_("Appearance"), bgc); #endif #ifdef CAIRO_SUPPORTS_FORCE_BUGGY_GRADIENTS_ENVIRONMENT_VARIABLE @@ -3465,11 +3595,11 @@ if (!Profile->get_mixbus()) { ); 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); + add_option (_("Appearance"), bgo); #endif - add_option (S_("Preferences|GUI"), new OptionEditorHeading (_("Graphical User Interface"))); + add_option (_("Appearance"), new OptionEditorHeading (_("Graphical User Interface"))); - add_option (S_("Preferences|GUI"), + add_option (_("Appearance"), new BoolOption ( "widget-prelight", _("Highlight widgets on mouseover"), @@ -3477,7 +3607,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_widget_prelight) )); - add_option (S_("Preferences|GUI"), + add_option (_("Appearance"), new BoolOption ( "use-tooltips", _("Show tooltips if mouse hovers over a control"), @@ -3495,9 +3625,9 @@ if (!Profile->get_mixbus()) { _("When enabled clock displays are updated every Timecode Frame (fps).\n\n" "When disabled clock displays are updated only every 100ms." )); - add_option (S_("Preferences|GUI"), bo); + add_option (_("Appearance"), bo); - add_option (S_("Preferences|GUI"), + add_option (_("Appearance"), new BoolOption ( "blink-rec-arm", _("Blink Rec-Arm buttons"), @@ -3505,44 +3635,21 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_blink_rec_arm) )); + add_option (_("Appearance"), + new BoolOption ( + "blink-alert-indicators", + _("Blink Alert Indicators"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_blink_alert_indicators), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_blink_alert_indicators) + )); + #ifndef __APPLE__ /* font scaling does nothing with GDK/Quartz */ - add_option (S_("Preferences|GUI"), new FontScalingOptions ()); + add_option (_("Appearance"), new FontScalingOptions ()); #endif - - /* Image cache size */ - - HSliderOption *sics = new HSliderOption ("waveform-cache-size", - _("Waveform image cache size (megabytes)"), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_waveform_cache_size), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_waveform_cache_size), - 1, 1024, 10 /* 1 MB to 1GB in steps of 10MB */ - ); - 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 */ - - HSliderOption *slts = new HSliderOption("lock-gui-after-seconds", - _("Lock timeout (seconds)"), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_lock_gui_after_seconds), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_lock_gui_after_seconds), - 0, 1000, 1, 10 - ); - 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 - - add_option (_("GUI/Editor"), new OptionEditorHeading (_("General"))); - add_option (_("GUI/Editor"), + add_option (_("Appearance/Editor"), new OptionEditorHeading (_("General"))); + add_option (_("Appearance/Editor"), new BoolOption ( "show-name-highlight", _("Use name highlight bars in region displays (requires a restart)"), @@ -3550,7 +3657,7 @@ if (!ARDOUR::Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_name_highlight) )); - add_option (_("GUI/Editor"), + add_option (_("Appearance/Editor"), new BoolOption ( "color-regions-using-track-color", _("Region color follows track color"), @@ -3558,19 +3665,19 @@ if (!ARDOUR::Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_color_regions_using_track_color) )); - add_option (_("GUI/Editor"), new OptionEditorHeading (_("Waveforms"))); + add_option (_("Appearance/Editor"), new OptionEditorHeading (_("Waveforms"))); -if (!Profile->get_mixbus()) { - add_option (_("GUI/Editor"), - new BoolOption ( - "show-waveforms", - _("Show waveforms in regions"), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_waveforms), - sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_waveforms) - )); -} // !mixbus + if (!Profile->get_mixbus()) { + add_option (_("Appearance/Editor"), + new BoolOption ( + "show-waveforms", + _("Show waveforms in regions"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_waveforms), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_waveforms) + )); + } // !mixbus - add_option (_("GUI/Editor"), + add_option (_("Appearance/Editor"), new BoolOption ( "show-waveforms-while-recording", _("Show waveforms while recording"), @@ -3578,7 +3685,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_waveforms_while_recording) )); - add_option (_("GUI/Editor"), + add_option (_("Appearance/Editor"), new BoolOption ( "show-waveform-clipping", _("Show waveform clipping"), @@ -3586,7 +3693,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_waveform_clipping) )); - add_option (_("GUI/Editor"), new ClipLevelOptions ()); + add_option (_("Appearance/Editor"), new ClipLevelOptions ()); ComboOption* wfs = new ComboOption ( "waveform-scale", @@ -3598,7 +3705,7 @@ if (!Profile->get_mixbus()) { wfs->add (Linear, _("linear")); wfs->add (Logarithmic, _("logarithmic")); - add_option (_("GUI/Editor"), wfs); + add_option (_("Appearance/Editor"), wfs); ComboOption* wfsh = new ComboOption ( "waveform-shape", @@ -3610,11 +3717,11 @@ if (!Profile->get_mixbus()) { wfsh->add (Traditional, _("traditional")); wfsh->add (Rectified, _("rectified")); - add_option (_("GUI/Editor"), wfsh); + add_option (_("Appearance/Editor"), wfsh); - add_option (_("GUI/Editor"), new OptionEditorHeading (_("Editor Meters"))); + add_option (_("Appearance/Editor"), new OptionEditorHeading (_("Editor Meters"))); - add_option (_("GUI/Editor"), + add_option (_("Appearance/Editor"), new BoolOption ( "show-track-meters", _("Show meters in track headers"), @@ -3622,7 +3729,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_track_meters) )); - add_option (_("GUI/Editor"), + add_option (_("Appearance/Editor"), new BoolOption ( "editor-stereo-only-meters", _("Limit track header meters to stereo"), @@ -3630,7 +3737,42 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_editor_stereo_only_meters) )); - add_option (_("GUI/Editor"), new OptionEditorBlank ()); + add_option (_("Appearance/Editor"), new OptionEditorHeading (_("MIDI Regions"))); + + add_option (_("Appearance/Editor"), + 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 (_("Appearance/Editor"), + new BoolOption ( + "never-display-periodic-midi", + _("Don't display periodic (MTC, MMC) SysEx messages in MIDI Regions"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_never_display_periodic_midi), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_never_display_periodic_midi) + )); + + + add_option (_("Appearance/Editor"), + new BoolOption ( + "use-note-bars-for-velocity", + _("Show velocity horizontally inside notes"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_note_bars_for_velocity), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_note_bars_for_velocity) + )); + + add_option (_("Appearance/Editor"), + new BoolOption ( + "use-note-color-for-velocity", + _("Use colors to show note velocity"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_note_color_for_velocity), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_note_color_for_velocity) + )); + + add_option (_("Appearance/Editor"), new OptionEditorBlank ()); /* The names of these controls must be the same as those given in MixerStrip for the actual widgets being controlled. @@ -3643,7 +3785,7 @@ if (!Profile->get_mixbus()) { _mixer_strip_visibility.add (0, X_("Comments"), _("Comments")); _mixer_strip_visibility.add (0, X_("VCA"), _("VCA Assigns")); - add_option (_("GUI/Mixer"), + add_option (_("Appearance/Mixer"), new VisibilityOption ( _("Mixer Strip"), &_mixer_strip_visibility, @@ -3652,19 +3794,48 @@ if (!Profile->get_mixbus()) { ) ); - add_option (_("GUI/Mixer"), + add_option (_("Appearance/Mixer"), new BoolOption ( "default-narrow_ms", - _("Use narrow strips in the mixer by default"), + _("Use narrow strips in the mixer for new strips by default"), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_default_narrow_ms), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_default_narrow_ms) )); - add_option (_("GUI/Mixer"), new OptionEditorBlank ()); + ComboOption* mic = new ComboOption ( + "max-inline-controls", + _("Limit inline-mixer-strip controls per plugin"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_max_inline_controls), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_max_inline_controls) + ); + mic->add (0, _("Unlimited")); + mic->add (16, _("16 parameters")); + mic->add (32, _("32 parameters")); + mic->add (64, _("64 parameters")); + mic->add (128, _("128 parameters")); + add_option (_("Appearance/Mixer"), mic); + + add_option (_("Appearance/Mixer"), new OptionEditorBlank ()); - add_option (_("GUI/Toolbar"), new OptionEditorHeading (_("Main Transport Toolbar Items"))); + add_option (_("Appearance/Toolbar"), new OptionEditorHeading (_("Main Transport Toolbar Items"))); - add_option (_("GUI/Toolbar"), + add_option (_("Appearance/Toolbar"), + new BoolOption ( + "show-toolbar-recpunch", + _("Display Record/Punch Options"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_toolbar_recpunch), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_toolbar_recpunch) + )); + + add_option (_("Appearance/Toolbar"), + new BoolOption ( + "show-toolbar-monitoring", + _("Display Monitor Options"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_toolbar_monitoring), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_toolbar_monitoring) + )); + + add_option (_("Appearance/Toolbar"), new BoolOption ( "show-toolbar-selclock", _("Display Selection Clock"), @@ -3673,7 +3844,7 @@ if (!Profile->get_mixbus()) { )); if (!ARDOUR::Profile->get_small_screen()) { - add_option (_("GUI/Toolbar"), + add_option (_("Appearance/Toolbar"), new BoolOption ( "show-secondary-clock", _("Display Secondary Clock"), @@ -3682,7 +3853,7 @@ if (!Profile->get_mixbus()) { )); } - add_option (_("GUI/Toolbar"), + add_option (_("Appearance/Toolbar"), new BoolOption ( "show-mini-timeline", _("Display Navigation Timeline"), @@ -3690,7 +3861,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_mini_timeline) )); - add_option (_("GUI/Toolbar"), + add_option (_("Appearance/Toolbar"), new BoolOption ( "show-editor-meter", _("Display Master Level Meter"), @@ -3698,32 +3869,35 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_editor_meter) )); - add_option (_("GUI/Toolbar"), + add_option (_("Appearance/Toolbar"), new ColumVisibilityOption ( - "action-table-columns", _("Lua Action Script Button Visibility"), 4, + "action-table-columns", _("Display Action-Buttons"), 4, sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_action_table_columns), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_action_table_columns) ) ); - add_option (_("GUI/Toolbar"), new OptionEditorBlank ()); - - - OptionEditorHeading* quirks_head = new OptionEditorHeading (_("Various Workarounds for Windowing Systems")); + add_option (_("Appearance/Toolbar"), new OptionEditorBlank ()); - quirks_head->set_note (string_compose (_("These settings will only take effect after %1 is restarted."), PROGRAM_NAME)); /* and now the theme manager */ - add_option (_("GUI/Theme"), new OptionEditorHeading (_("Theme"))); + add_option (_("Appearance/Theme"), new OptionEditorHeading (_("Theme"))); - add_option (_("GUI/Theme"), new BoolOption ( + add_option (_("Appearance/Theme"), new BoolOption ( "flat-buttons", _("Draw \"flat\" buttons"), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_flat_buttons), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_flat_buttons) )); - add_option (_("GUI/Theme"), new BoolOption ( + add_option (_("Appearance/Theme"), new BoolOption ( + "boxy-buttons", + _("Draw \"boxy\" buttons"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_boxy_buttons), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_boxy_buttons) + )); + + add_option (_("Appearance/Theme"), new BoolOption ( "meter-style-led", _("LED meter style"), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_meter_style_led), @@ -3739,7 +3913,7 @@ if (!Profile->get_mixbus()) { 0, 1.0, 0.05 ); gui_hs->scale().set_update_policy (Gtk::UPDATE_DELAYED); - add_option (_("GUI/Theme"), gui_hs); + add_option (_("Appearance/Theme"), gui_hs); gui_hs = new HSliderOption( "timeline-item-gradient-depth", @@ -3749,7 +3923,7 @@ if (!Profile->get_mixbus()) { 0, 1.0, 0.05 ); gui_hs->scale().set_update_policy (Gtk::UPDATE_DELAYED); - add_option (_("GUI/Theme"), gui_hs); + add_option (_("Appearance/Theme"), gui_hs); vector icon_sets = ::get_icon_sets (); if (icon_sets.size() > 1) { @@ -3761,24 +3935,34 @@ if (!Profile->get_mixbus()) { for (vector::const_iterator i = icon_sets.begin (); i != icon_sets.end (); ++i) { io->add (*i, *i); } - add_option (_("GUI/Theme"), io); + add_option (_("Appearance/Theme"), io); } - add_option (_("GUI/Colors"), new OptionEditorHeading (_("Colors"))); - add_option (_("GUI/Colors"), new ColorThemeManager); - add_option (_("GUI/Colors"), new OptionEditorBlank ()); + add_option (_("Appearance/Colors"), new OptionEditorHeading (_("Colors"))); + add_option (_("Appearance/Colors"), new ColorThemeManager); + add_option (_("Appearance/Colors"), new OptionEditorBlank ()); /* Quirks */ - add_option (_("GUI/Quirks"), quirks_head); + OptionEditorHeading* quirks_head = new OptionEditorHeading (_("Various Workarounds for Windowing Systems")); - add_option (_("GUI/Quirks"), - new BoolOption ( + quirks_head->set_note (string_compose (_("Rules for closing, minimizing, maximizing, and stay-on-top can vary \ +with each version of your OS, and the preferences that you've set in your OS.\n\n\ +You can adjust the options, below, to change how %1's windows and dialogs behave.\n\n\ +These settings will only take effect after %1 is restarted.\n\ + "), PROGRAM_NAME)); + + add_option (_("Appearance/Quirks"), quirks_head); + + bo = new BoolOption ( "use-wm-visibility", - _("Use Window Manager/Desktop visibility information"), + _("Use visibility information provided by your Window Manager/Desktop"), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_wm_visibility), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_wm_visibility) - )); + ); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget (), + _("If you have trouble toggling between hidden Editor and Mixer windows, try changing this setting.")); + add_option (_("Appearance/Quirks"), bo); #ifndef __APPLE__ bo = new BoolOption ( @@ -3789,7 +3973,7 @@ if (!Profile->get_mixbus()) { ); Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget (), _("Mark all floating windows to be type \"Dialog\" rather than using \"Utility\" for some.\nThis may help with some window managers.")); - add_option (_("GUI/Quirks"), bo); + add_option (_("Appearance/Quirks"), bo); bo = new BoolOption ( "transients-follow-front", @@ -3799,7 +3983,7 @@ if (!Profile->get_mixbus()) { ); Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget (), _("Make transient windows follow the front window when toggling between the editor and mixer.")); - add_option (_("GUI/Quirks"), bo); + add_option (_("Appearance/Quirks"), bo); #endif if (!Profile->get_mixbus()) { @@ -3811,10 +3995,10 @@ if (!Profile->get_mixbus()) { ); Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget (), _("When detaching the monitoring section, mark it as \"Utility\" window to stay in front.")); - add_option (_("GUI/Quirks"), bo); + add_option (_("Appearance/Quirks"), bo); } - add_option (_("GUI/Quirks"), new OptionEditorBlank ()); + add_option (_("Appearance/Quirks"), new OptionEditorBlank ()); /* VIDEO Timeline */ add_option (_("Video"), new OptionEditorHeading (_("Video Server"))); @@ -3839,6 +4023,13 @@ if (!Profile->get_mixbus()) { set_current_page (_("General")); } +void +RCOptionEditor::set_session (Session *s) +{ + SessionHandlePtr::set_session (s); + _transport_masters_widget.set_session (s); +} + void RCOptionEditor::parameter_changed (string const & p) { @@ -3853,22 +4044,11 @@ RCOptionEditor::parameter_changed (string const & p) _solo_control_is_listen_control->set_sensitive (s); _listen_position->set_sensitive (s); } else if (p == "sync-source") { - _sync_source->set_sensitive (true); - if (_session) { - _sync_source->set_sensitive (!_session->config.get_external_sync()); - } - switch(Config->get_sync_source()) { - case ARDOUR::MTC: - case ARDOUR::LTC: - _sync_genlock->set_sensitive (true); + boost::shared_ptr tm (TransportMasterManager::instance().current()); + if (boost::dynamic_pointer_cast (tm)) { _sync_framerate->set_sensitive (true); - _sync_source_2997->set_sensitive (true); - break; - default: - _sync_genlock->set_sensitive (false); + } else { _sync_framerate->set_sensitive (false); - _sync_source_2997->set_sensitive (false); - break; } } else if (p == "send-ltc") { bool const s = Config->get_send_ltc (); @@ -3877,10 +4057,6 @@ RCOptionEditor::parameter_changed (string const & p) } 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 -#ifdef ENABLE_NLS - } else if (p == "enable-translation") { - _l10n->set_sensitive (ARDOUR::translations_are_enabled ()); #endif } } @@ -3907,7 +4083,7 @@ void RCOptionEditor::clear_au_blacklist () { void RCOptionEditor::edit_lxvst_path () { Glib::RefPtr win = get_parent_window (); - Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog ( + PathsDialog *pd = new PathsDialog ( *current_toplevel(), _("Set Linux VST Search Path"), _rc_config->get_plugin_path_lxvst(), PluginManager::instance().get_default_lxvst_path() @@ -3916,12 +4092,20 @@ void RCOptionEditor::edit_lxvst_path () { pd->hide(); if (r == RESPONSE_ACCEPT) { _rc_config->set_plugin_path_lxvst(pd->get_serialized_paths()); + + MessageDialog msg (_("Re-scan Plugins now?"), + false /*no markup*/, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true /*modal*/); + msg.set_default_response (Gtk::RESPONSE_YES); + if (msg.run() == Gtk::RESPONSE_YES) { + msg.hide (); + plugin_scan_refresh (); + } } delete pd; } void RCOptionEditor::edit_vst_path () { - Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog ( + PathsDialog *pd = new PathsDialog ( *current_toplevel(), _("Set Windows VST Search Path"), _rc_config->get_plugin_path_vst(), PluginManager::instance().get_default_windows_vst_path() @@ -3930,31 +4114,15 @@ void RCOptionEditor::edit_vst_path () { pd->hide(); if (r == RESPONSE_ACCEPT) { _rc_config->set_plugin_path_vst(pd->get_serialized_paths()); - } - delete pd; -} - - -void -RCOptionEditor::populate_sync_options () -{ - vector sync_opts = ARDOUR::get_available_sync_options (); - - _sync_source->clear (); - - for (vector::iterator i = sync_opts.begin(); i != sync_opts.end(); ++i) { - _sync_source->add (*i, sync_source_to_string (*i)); - } - - if (sync_opts.empty()) { - _sync_source->set_sensitive(false); - } else { - if (std::find(sync_opts.begin(), sync_opts.end(), _rc_config->get_sync_source()) == sync_opts.end()) { - _rc_config->set_sync_source(sync_opts.front()); + MessageDialog msg (_("Re-scan Plugins now?"), + false /*no markup*/, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true /*modal*/); + msg.set_default_response (Gtk::RESPONSE_YES); + if (msg.run() == Gtk::RESPONSE_YES) { + msg.hide (); + plugin_scan_refresh (); } } - - parameter_changed ("sync-source"); + delete pd; } Gtk::Window* @@ -3967,6 +4135,8 @@ RCOptionEditor::use_own_window (bool and_fill_it) if (win && new_window) { win->set_name ("PreferencesWindow"); ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Preferences"), this); + win->resize (1, 1); + win->set_resizable (false); } return win;