X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Frc_option_editor.cc;h=3569d939cc72580f83ca4b4498e2f8ae18423699;hb=d26aac90204a87e00ea3b2cb622a7f5729bfbc4a;hp=da0175893f2a3111c043a23b7ccb261a2a6b3fe6;hpb=5a8553f02cb9bcbd75b797c6260539f7a8f8e47a;p=ardour.git diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index da0175893f..3569d939cc 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -41,32 +41,34 @@ #include "pbd/fpu.h" #include "pbd/cpus.h" +#include "pbd/i18n.h" +#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/port_manager.h" #include "ardour/plugin_manager.h" #include "control_protocol/control_protocol.h" #include "canvas/wave_view.h" -#include "ardour_window.h" #include "ardour_dialog.h" #include "ardour_ui.h" +#include "ardour_window.h" #include "color_theme_manager.h" #include "gui_thread.h" +#include "keyboard.h" #include "meter_patterns.h" #include "midi_tracer.h" #include "rc_option_editor.h" -#include "utils.h" -#include "midi_port_dialog.h" #include "sfdb_ui.h" -#include "keyboard.h" #include "theme_manager.h" +#include "tooltips.h" #include "ui_config.h" -#include "pbd/i18n.h" +#include "utils.h" using namespace std; using namespace Gtk; @@ -339,6 +341,7 @@ static const struct { { "Option", GDK_MOD1_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 }, @@ -351,6 +354,7 @@ static const struct { { "Alt", GDK_MOD1_MASK }, { "Control-Shift", GDK_CONTROL_MASK|GDK_SHIFT_MASK }, { "Control-Alt", GDK_CONTROL_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 }, @@ -541,12 +545,13 @@ 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::secondary_modifier_name (), + Keyboard::tertiary_modifier_name (), #endif restart_msg))); for (int x = 0; modifiers[x].name; ++x) { @@ -562,6 +567,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:"))); @@ -595,8 +623,10 @@ public: /* anchored trim */ 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"), Keyboard::tertiary_modifier_name (), restart_msg))); + (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)); @@ -640,7 +670,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::primary_modifier_name (), restart_msg))); + (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)); @@ -668,9 +698,9 @@ public: set_popdown_strings (_snap_modifier_combo, dumb); _snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen)); #ifdef __APPLE__ - std::string mod_str = string_compose (X_("%1-%2"), Keyboard::level4_modifier_name (), Keyboard::tertiary_modifier_name ()); + mod_str = string_compose (X_("%1-%2"), Keyboard::level4_modifier_name (), Keyboard::tertiary_modifier_name ()); #else - std::string mod_str = Keyboard::secondary_modifier_name(); + 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))); @@ -754,7 +784,7 @@ 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::secondary_modifier_name (), Keyboard::tertiary_modifier_name ()); + 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) { @@ -770,28 +800,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)); - - Gtkmm2ext::UI::instance()->set_tip (_push_points_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::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); } @@ -827,7 +835,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; } @@ -839,7 +847,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; } @@ -851,7 +859,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; } @@ -863,7 +871,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; } @@ -875,7 +883,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; } @@ -887,7 +895,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; } @@ -899,7 +907,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; } @@ -911,7 +919,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; } @@ -923,7 +931,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; } @@ -935,7 +943,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; } @@ -947,7 +955,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; } @@ -959,7 +967,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; } @@ -971,7 +979,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; } @@ -1847,6 +1855,292 @@ private: }; +class MidiPortOptions : public OptionEditorBox, public sigc::trackable +{ + public: + MidiPortOptions() { + + setup_midi_port_view (midi_output_view, false); + setup_midi_port_view (midi_input_view, true); + + + input_label.set_markup (string_compose ("%1", _("MIDI Inputs"))); + _box->pack_start (input_label, false, false); + _box->pack_start (midi_input_view); + + output_label.set_markup (string_compose ("%1", _("MIDI Outputs"))); + _box->pack_start (output_label, false, false); + _box->pack_start (midi_output_view); + + midi_output_view.show (); + midi_input_view.show (); + + _box->signal_show().connect (sigc::mem_fun (*this, &MidiPortOptions::on_show)); + } + + void parameter_changed (string const&) {} + void set_state_from_config() {} + + void on_show () { + refill (); + + AudioEngine::instance()->PortRegisteredOrUnregistered.connect (connections, + invalidator (*this), + boost::bind (&MidiPortOptions::refill, this), + gui_context()); + AudioEngine::instance()->MidiPortInfoChanged.connect (connections, + invalidator (*this), + boost::bind (&MidiPortOptions::refill, this), + gui_context()); + AudioEngine::instance()->MidiSelectionPortsChanged.connect (connections, + invalidator (*this), + boost::bind (&MidiPortOptions::refill, this), + gui_context()); + } + + void refill () { + + if (refill_midi_ports (true, midi_input_view)) { + input_label.show (); + } else { + input_label.hide (); + } + if (refill_midi_ports (false, midi_output_view)) { + output_label.show (); + } else { + output_label.hide (); + } + } + + private: + PBD::ScopedConnectionList connections; + + /* MIDI port management */ + struct MidiPortColumns : public Gtk::TreeModel::ColumnRecord { + + MidiPortColumns () { + add (pretty_name); + add (music_data); + add (control_data); + add (selection); + add (name); + add (filler); + } + + Gtk::TreeModelColumn pretty_name; + Gtk::TreeModelColumn music_data; + Gtk::TreeModelColumn control_data; + Gtk::TreeModelColumn selection; + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn filler; + }; + + MidiPortColumns midi_port_columns; + Gtk::TreeView midi_input_view; + Gtk::TreeView midi_output_view; + Gtk::Label input_label; + Gtk::Label output_label; + + void setup_midi_port_view (Gtk::TreeView&, bool with_selection); + bool refill_midi_ports (bool for_input, Gtk::TreeView&); + void pretty_name_edit (std::string const & path, std::string const & new_text, Gtk::TreeView*); + void midi_music_column_toggled (std::string const & path, Gtk::TreeView*); + void midi_control_column_toggled (std::string const & path, Gtk::TreeView*); + void midi_selection_column_toggled (std::string const & path, Gtk::TreeView*); +}; + +void +MidiPortOptions::setup_midi_port_view (Gtk::TreeView& view, bool with_selection) +{ + int pretty_name_column; + int music_column; + int control_column; + int selection_column; + TreeViewColumn* col; + Gtk::Label* l; + + pretty_name_column = view.append_column_editable (_("Name (click to edit)"), midi_port_columns.pretty_name) - 1; + + col = manage (new TreeViewColumn ("", midi_port_columns.music_data)); + col->set_alignment (ALIGN_CENTER); + l = manage (new Label (_("Music Data"))); + set_tooltip (*l, string_compose (_("If ticked, %1 will consider this port to be a source of music performance data."), PROGRAM_NAME)); + col->set_widget (*l); + l->show (); + music_column = view.append_column (*col) - 1; + + col = manage (new TreeViewColumn ("", midi_port_columns.control_data)); + col->set_alignment (ALIGN_CENTER); + l = manage (new Label (_("Control Data"))); + set_tooltip (*l, string_compose (_("If ticked, %1 will consider this port to be a source of control data."), PROGRAM_NAME)); + col->set_widget (*l); + l->show (); + control_column = view.append_column (*col) - 1; + + if (with_selection) { + col = manage (new TreeViewColumn (_("Follow Selection"), midi_port_columns.selection)); + selection_column = view.append_column (*col) - 1; + l = manage (new Label (_("Follow Selection"))); + set_tooltip (*l, string_compose (_("If ticked, and \"MIDI input follows selection\" is enabled,\n%1 will automatically connect the first selected MIDI track to this port.\n"), PROGRAM_NAME)); + col->set_widget (*l); + l->show (); + } + + /* filler column so that the last real column doesn't expand */ + view.append_column ("", midi_port_columns.filler); + + CellRendererText* pretty_name_cell = dynamic_cast (view.get_column_cell_renderer (pretty_name_column)); + pretty_name_cell->property_editable() = true; + pretty_name_cell->signal_edited().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::pretty_name_edit), &view)); + + CellRendererToggle* toggle_cell; + + toggle_cell = dynamic_cast (view.get_column_cell_renderer (music_column)); + toggle_cell->property_activatable() = true; + toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::midi_music_column_toggled), &view)); + + toggle_cell = dynamic_cast (view.get_column_cell_renderer (control_column)); + toggle_cell->property_activatable() = true; + toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::midi_control_column_toggled), &view)); + + if (with_selection) { + toggle_cell = dynamic_cast (view.get_column_cell_renderer (selection_column)); + toggle_cell->property_activatable() = true; + toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::midi_selection_column_toggled), &view)); + } + + view.get_selection()->set_mode (SELECTION_NONE); + view.set_tooltip_column (4); /* port "real" name */ +} + +bool +MidiPortOptions::refill_midi_ports (bool for_input, Gtk::TreeView& view) +{ + using namespace ARDOUR; + + std::vector ports; + + AudioEngine::instance()->get_known_midi_ports (ports); + + if (ports.empty()) { + view.hide (); + return false; + } + + Glib::RefPtr model = Gtk::ListStore::create (midi_port_columns); + + for (vector::const_iterator s = ports.begin(); s != ports.end(); ++s) { + + if (AudioEngine::instance()->port_is_mine (*s)) { + continue; + } + + PortManager::MidiPortInformation mpi (AudioEngine::instance()->midi_port_information (*s)); + + if (mpi.pretty_name.empty()) { + /* vanished since get_known_midi_ports() */ + continue; + } + + if (for_input != mpi.input) { + continue; + } + + TreeModel::Row row = *(model->append()); + + row[midi_port_columns.pretty_name] = mpi.pretty_name; + row[midi_port_columns.music_data] = mpi.properties & MidiPortMusic; + row[midi_port_columns.control_data] = mpi.properties & MidiPortControl; + row[midi_port_columns.selection] = mpi.properties & MidiPortSelection; + row[midi_port_columns.name] = *s; + } + + view.set_model (model); + + return true; +} + +void +MidiPortOptions::midi_music_column_toggled (string const & path, TreeView* view) +{ + TreeIter iter = view->get_model()->get_iter (path); + + if (!iter) { + return; + } + + bool new_value = ! bool ((*iter)[midi_port_columns.music_data]); + + /* don't reset model - wait for MidiPortInfoChanged signal */ + + if (new_value) { + ARDOUR::AudioEngine::instance()->add_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortMusic); + } else { + ARDOUR::AudioEngine::instance()->remove_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortMusic); + } +} + +void +MidiPortOptions::midi_control_column_toggled (string const & path, TreeView* view) +{ + TreeIter iter = view->get_model()->get_iter (path); + + if (!iter) { + return; + } + + bool new_value = ! bool ((*iter)[midi_port_columns.control_data]); + + /* don't reset model - wait for MidiPortInfoChanged signal */ + + if (new_value) { + ARDOUR::AudioEngine::instance()->add_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortControl); + } else { + ARDOUR::AudioEngine::instance()->remove_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortControl); + } +} + +void +MidiPortOptions::midi_selection_column_toggled (string const & path, TreeView* view) +{ + TreeIter iter = view->get_model()->get_iter (path); + + if (!iter) { + return; + } + + bool new_value = ! bool ((*iter)[midi_port_columns.selection]); + + /* don't reset model - wait for MidiSelectionPortsChanged signal */ + + if (new_value) { + ARDOUR::AudioEngine::instance()->add_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortSelection); + } else { + ARDOUR::AudioEngine::instance()->remove_midi_port_flags ((*iter)[midi_port_columns.name], MidiPortSelection); + } +} + +void +MidiPortOptions::pretty_name_edit (std::string const & path, string const & new_text, Gtk::TreeView* view) +{ + TreeIter iter = view->get_model()->get_iter (path); + + if (!iter) { + 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; + } + } +} + +/*============*/ + RCOptionEditor::RCOptionEditor () : OptionEditorContainer (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME)) @@ -1854,14 +2148,6 @@ RCOptionEditor::RCOptionEditor () , _rc_config (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 */ @@ -1884,7 +2170,7 @@ RCOptionEditor::RCOptionEditor () procs->add (0, _("all available processors")); for (uint32_t i = 1; i <= hwcpus; ++i) { - procs->add (i, string_compose (_("%1 processors"), i)); + procs->add (i, string_compose (P_("%1 processor", "%1 processors", i), i)); } procs->set_note (string_compose (_("This setting will only take effect when %1 is restarted."), PROGRAM_NAME)); @@ -2192,7 +2478,7 @@ 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")); + _("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/Sync"), _ltc_volume_slider); @@ -2250,6 +2536,14 @@ if (!Profile->get_mixbus()) { )); } // !mixbus + add_option (_("Editor"), + new BoolOption ( + "use-time-rulers-to-zoom-with-vertical-drag", + _("Use time rulers area to zoom when clicking and dragging vertically"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_time_rulers_to_zoom_with_vertical_drag), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_time_rulers_to_zoom_with_vertical_drag) + )); + add_option (_("Editor"), new BoolOption ( "update-editor-during-summary-drag", @@ -2722,6 +3016,16 @@ if (!ARDOUR::Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback) )); + add_option (_("MIDI/Ports"), + new BoolOption ( + "get-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) + )); + + add_option (_("MIDI/Ports"), new MidiPortOptions ()); + add_option (_("MIDI/Sync"), new OptionEditorHeading (_("MIDI Clock"))); add_option (_("MIDI/Sync"), @@ -2843,7 +3147,7 @@ if (!ARDOUR::Profile->get_mixbus()) { /* VIDEO Timeline */ add_option (_("Video"), new VideoTimelineOptions (_rc_config)); -#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT) +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT || defined AUDIOUNIT_SUPPORT) add_option (_("Plugins"), new RcActionButton (_("Scan for Plugins"), sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh))); @@ -2852,7 +3156,7 @@ if (!ARDOUR::Profile->get_mixbus()) { add_option (_("Plugins"), new OptionEditorHeading (_("General"))); -#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT) +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT || defined AUDIOUNIT_SUPPORT) bo = new BoolOption ( "show-plugin-scan-window", _("Always Display Plugin Scan Progress"), @@ -2884,12 +3188,22 @@ if (!ARDOUR::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")); -#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT) +#if (defined WINDOWS_VST_SUPPORT || defined MACVST_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))); +#if (defined AUDIOUNIT_SUPPORT && defined MACVST_SUPPORT) + bo = new BoolOption ( + "", + _("Enable Mac VST support (requires restart or re-scan)"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_macvst), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_macvst) + ); + add_option (_("Plugins/VST"), bo); +#endif + bo = new BoolOption ( "discover-vst-on-start", _("Scan for [new] VST Plugins on Application Start"), @@ -2962,11 +3276,11 @@ if (!ARDOUR::Profile->get_mixbus()) { bo = new BoolOption ( "discover-audio-units", - _("Scan for AudioUnit Plugins on Application Start"), + _("Scan for [new] 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); + add_option (_("Plugins/Audio Unit"), 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.")); @@ -2981,7 +3295,7 @@ if (!ARDOUR::Profile->get_mixbus()) { _("AU Blacklist:"))); #endif -#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT || defined HAVE_LV2) +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT || defined AUDIOUNIT_SUPPORT || defined HAVE_LV2) add_option (_("Plugins"), new OptionEditorHeading (_("Plugin GUI"))); add_option (_("Plugins"), new BoolOption ( @@ -3310,7 +3624,7 @@ if (!ARDOUR::Profile->get_mixbus()) { 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); @@ -3357,11 +3671,21 @@ if (!ARDOUR::Profile->get_mixbus()) { add_option (_("Theme/Colors"), new ColorThemeManager); + Widget::show_all (); + //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"); + + 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); + } } void @@ -3400,7 +3724,7 @@ RCOptionEditor::parameter_changed (string const & p) _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") { -#ifdef LV2_SUPPORT +#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 } @@ -3485,7 +3809,7 @@ RCOptionEditor::populate_sync_options () Gtk::Window* RCOptionEditor::use_own_window (bool and_fill_it) { - bool new_window = !own_window(); + bool new_window = !own_window (); Gtk::Window* win = Tabbable::use_own_window (and_fill_it);