X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Frc_option_editor.cc;h=5594bbf2f16bd38c6a5c2e6cc1afaba75674c61b;hb=c196a212d0d0a65f33c11ff5e84b517f1cd2f422;hp=ddcf013420d081dd69c0af9fb28a9372c45cd00d;hpb=9ca95fe1f4f9d435f0369a635a13e566ce76ab4b;p=ardour.git diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index ddcf013420..5594bbf2f1 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1,3 +1,26 @@ +/* + Copyright (C) 2001-2011 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifdef WAF_BUILD +#include "gtk2ardour-config.h" +#endif + #include #include #include @@ -15,6 +38,8 @@ #include "ardour/control_protocol_manager.h" #include "control_protocol/control_protocol.h" +#include "ardour_window.h" +#include "ardour_dialog.h" #include "gui_thread.h" #include "midi_tracer.h" #include "rc_option_editor.h" @@ -33,7 +58,7 @@ using namespace ARDOUR; class ClickOptions : public OptionEditorBox { public: - ClickOptions (RCConfiguration* c, ArdourDialog* p) + ClickOptions (RCConfiguration* c, Gtk::Window* p) : _rc_config (c), _parent (p) { @@ -57,6 +82,9 @@ public: t->attach (*b, 2, 3, 1, 2, FILL); _box->pack_start (*t, false, false); + + _click_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_changed)); + _click_emphasis_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_changed)); } void parameter_changed (string const & p) @@ -94,6 +122,11 @@ private: _rc_config->set_click_sound (path); } + void click_changed () + { + click_chosen (_click_path_entry.get_text ()); + } + void click_emphasis_browse_clicked () { SoundFileChooser sfdb (*_parent, _("Choose Click Emphasis")); @@ -112,8 +145,13 @@ private: _rc_config->set_click_emphasis_sound (path); } + void click_emphasis_changed () + { + click_emphasis_chosen (_click_emphasis_path_entry.get_text ()); + } + RCConfiguration* _rc_config; - ArdourDialog* _parent; + Gtk::Window* _parent; Entry _click_path_entry; Entry _click_emphasis_path_entry; }; @@ -223,7 +261,7 @@ static const struct { /* Command = Meta Option/Alt = Mod1 */ - { "Shift", GDK_SHIFT_MASK }, + { "Key|Shift", GDK_SHIFT_MASK }, { "Command", GDK_META_MASK }, { "Control", GDK_CONTROL_MASK }, { "Option", GDK_MOD1_MASK }, @@ -233,7 +271,7 @@ static const struct { { "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|GDK_META_MASK }, #else - { "Shift", GDK_SHIFT_MASK }, + { "Key|Shift", GDK_SHIFT_MASK }, { "Control", GDK_CONTROL_MASK }, { "Alt (Mod1)", GDK_MOD1_MASK }, { "Control-Shift", GDK_CONTROL_MASK|GDK_SHIFT_MASK }, @@ -256,8 +294,9 @@ public: _delete_button_adjustment (3, 1, 12), _delete_button_spin (_delete_button_adjustment), _edit_button_adjustment (3, 1, 5), - _edit_button_spin (_edit_button_adjustment) - + _edit_button_spin (_edit_button_adjustment), + _insert_note_button_adjustment (3, 1, 5), + _insert_note_button_spin (_insert_note_button_adjustment) { /* internationalize and prepare for use with combos */ @@ -271,7 +310,7 @@ public: for (int x = 0; modifiers[x].name; ++x) { if (modifiers[x].modifier == Keyboard::edit_modifier ()) { - _edit_modifier_combo.set_active_text (_(modifiers[x].name)); + _edit_modifier_combo.set_active_text (S_(modifiers[x].name)); break; } } @@ -323,6 +362,35 @@ public: _delete_button_adjustment.set_value (Keyboard::delete_button()); _delete_button_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::delete_button_changed)); + + set_popdown_strings (_insert_note_modifier_combo, dumb); + _insert_note_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::insert_note_modifier_chosen)); + + for (int x = 0; modifiers[x].name; ++x) { + if (modifiers[x].modifier == Keyboard::insert_note_modifier ()) { + _insert_note_modifier_combo.set_active_text (_(modifiers[x].name)); + break; + } + } + + l = manage (new Label (_("Insert note using:"))); + l->set_name ("OptionsLabel"); + l->set_alignment (0, 0.5); + + t->attach (*l, 0, 1, 2, 3, FILL | EXPAND, FILL); + t->attach (_insert_note_modifier_combo, 1, 2, 2, 3, FILL | EXPAND, FILL); + + l = manage (new Label (_("+ button"))); + l->set_name ("OptionsLabel"); + + t->attach (*l, 3, 4, 2, 3, FILL | EXPAND, FILL); + t->attach (_insert_note_button_spin, 4, 5, 2, 3, FILL | EXPAND, 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)); + + set_popdown_strings (_snap_modifier_combo, dumb); _snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen)); @@ -337,8 +405,8 @@ public: l->set_name ("OptionsLabel"); l->set_alignment (0, 0.5); - t->attach (*l, 0, 1, 2, 3, FILL | EXPAND, FILL); - t->attach (_snap_modifier_combo, 1, 2, 2, 3, FILL | EXPAND, FILL); + t->attach (*l, 0, 1, 3, 4, FILL | EXPAND, FILL); + t->attach (_snap_modifier_combo, 1, 2, 3, 4, FILL | EXPAND, FILL); vector strs; @@ -354,8 +422,8 @@ public: l->set_name ("OptionsLabel"); l->set_alignment (0, 0.5); - t->attach (*l, 0, 1, 3, 4, FILL | EXPAND, FILL); - t->attach (_keyboard_layout_selector, 1, 2, 3, 4, FILL | EXPAND, FILL); + t->attach (*l, 0, 1, 4, 5, FILL | EXPAND, FILL); + t->attach (_keyboard_layout_selector, 1, 2, 4, 5, FILL | EXPAND, FILL); _box->pack_start (*t, false, false); } @@ -411,6 +479,18 @@ private: } } + void insert_note_modifier_chosen () + { + string const txt = _insert_note_modifier_combo.get_active_text(); + + for (int i = 0; modifiers[i].name; ++i) { + if (txt == _(modifiers[i].name)) { + Keyboard::set_insert_note_modifier (modifiers[i].modifier); + break; + } + } + } + void snap_modifier_chosen () { string const txt = _snap_modifier_combo.get_active_text(); @@ -433,14 +513,23 @@ private: Keyboard::set_edit_button (_edit_button_spin.get_value_as_int()); } + void insert_note_button_changed () + { + Keyboard::set_insert_note_button (_insert_note_button_spin.get_value_as_int()); + } + ComboBoxText _keyboard_layout_selector; ComboBoxText _edit_modifier_combo; ComboBoxText _delete_modifier_combo; + ComboBoxText _insert_note_modifier_combo; ComboBoxText _snap_modifier_combo; Adjustment _delete_button_adjustment; SpinButton _delete_button_spin; Adjustment _edit_button_adjustment; SpinButton _edit_button_spin; + Adjustment _insert_note_button_adjustment; + SpinButton _insert_note_button_spin; + }; class FontScalingOptions : public OptionEditorBox @@ -496,7 +585,7 @@ private: class BufferingOptions : public OptionEditorBox { public: - BufferingOptions (RCConfiguration* c) + BufferingOptions (RCConfiguration* c) : _rc_config (c) , _playback_adjustment (5, 1, 60, 1, 4) , _capture_adjustment (5, 1, 60, 1, 4) @@ -515,7 +604,7 @@ public: h->pack_start (_playback_slider, true, true); _box->pack_start (*h, false, false); - + _capture_adjustment.set_value (_rc_config->get_audio_capture_buffer_seconds()); l = manage (new Label (_("Recording (seconds of buffering):"))); @@ -528,7 +617,7 @@ public: h->pack_start (_capture_slider, true, true); _box->pack_start (*h, false, false); - + _capture_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &BufferingOptions::capture_changed)); _playback_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &BufferingOptions::playback_changed)); } @@ -570,7 +659,7 @@ private: class ControlSurfacesOptions : public OptionEditorBox { public: - ControlSurfacesOptions (ArdourDialog& parent) + ControlSurfacesOptions (Gtk::Window& parent) : _parent (parent) { _store = ListStore::create (_model); @@ -588,7 +677,7 @@ public: _box->pack_start (*label, false, false); label->show (); - + _store->signal_row_changed().connect (sigc::mem_fun (*this, &ControlSurfacesOptions::model_changed)); _view.signal_button_press_event().connect_notify (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_clicked)); } @@ -654,21 +743,21 @@ private: std::string name; ControlProtocolInfo* cpi; TreeModel::Row row; - + row = *(_view.get_selection()->get_selected()); Window* win = row[_model.editor]; if (win && !win->is_visible()) { - win->present (); + win->present (); } else { cpi = row[_model.protocol_info]; - + if (cpi && cpi->protocol && cpi->protocol->has_editor ()) { Box* box = (Box*) cpi->protocol->get_gui (); if (box) { string title = row[_model.name]; - ArdourDialog* win = new ArdourDialog (_parent, title); - win->get_vbox()->pack_start (*box, false, false); + ArdourWindow* win = new ArdourWindow (_parent, title); + win->add (*box); box->show (); win->present (); row[_model.editor] = win; @@ -703,10 +792,69 @@ private: Gtk::Window& _parent; }; +/** A class which allows control of visibility of some editor components usign + * a VisibilityGroup. The caller should pass in a `dummy' VisibilityGroup + * which has the correct members, but with null widget pointers. This + * class allows the user to set visibility of the members, the details + * of which are stored in a configuration variable which can be watched + * by parts of the editor that actually contain the widgets whose visibility + * is being controlled. + */ + +class VisibilityOption : public Option +{ +public: + /** @param name User-visible name for this group. + * @param g `Dummy' VisibilityGroup (as described above). + * @param get Method to get the value of the appropriate configuration variable. + * @param set Method to set the value of the appropriate configuration variable. + */ + VisibilityOption (string name, VisibilityGroup* g, sigc::slot get, sigc::slot set) + : Option (g->get_state_name(), name) + , _heading (name) + , _visibility_group (g) + , _get (get) + , _set (set) + { + /* Watch for changes made by the user to our members */ + _visibility_group->VisibilityChanged.connect_same_thread ( + _visibility_group_connection, sigc::bind (&VisibilityOption::changed, this) + ); + } + + void set_state_from_config () + { + /* Set our state from the current configuration */ + _visibility_group->set_state (_get ()); + } + + void add_to_page (OptionEditorPage* p) + { + _heading.add_to_page (p); + add_widget_to_page (p, _visibility_group->list_view ()); + } + +private: + void changed () + { + /* The user has changed something, so reflect this change + in the RCConfiguration. + */ + _set (_visibility_group->get_state_value ()); + } + + OptionEditorHeading _heading; + VisibilityGroup* _visibility_group; + sigc::slot _get; + sigc::slot _set; + PBD::ScopedConnection _visibility_group_connection; +}; + RCOptionEditor::RCOptionEditor () : OptionEditor (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME)) , _rc_config (Config) + , _mixer_strip_visibility ("mixer-strip-visibility") { /* MISC */ @@ -714,68 +862,28 @@ RCOptionEditor::RCOptionEditor () if (hwcpus > 1) { add_option (_("Misc"), new OptionEditorHeading (_("DSP CPU Utilization"))); - - ComboOption* procs = new ComboOption ( + + ComboOption* procs = new ComboOption ( "processor-usage", _("Signal processing uses"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_processor_usage), sigc::mem_fun (*_rc_config, &RCConfiguration::set_processor_usage) ); - + procs->add (-1, _("all but one processor")); procs->add (0, _("all available processors")); - - for (uint32_t i = 2; i < hwcpus; ++i) { - procs->add (1, string_compose (_("%1 processors"), i)); + + for (uint32_t i = 1; i <= hwcpus; ++i) { + procs->add (i, string_compose (_("%1 processors"), i)); } - + add_option (_("Misc"), procs); } - add_option (_("Misc"), new OptionEditorHeading (_("Metering"))); - - ComboOption* mht = new ComboOption ( - "meter-hold", - _("Meter hold time"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_hold), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_hold) - ); - - mht->add (MeterHoldOff, _("off")); - mht->add (MeterHoldShort, _("short")); - mht->add (MeterHoldMedium, _("medium")); - mht->add (MeterHoldLong, _("long")); - - add_option (_("Misc"), mht); - - ComboOption* mfo = new ComboOption ( - "meter-falloff", - _("Meter fall-off"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_falloff), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_falloff) - ); - - mfo->add (METER_FALLOFF_OFF, _("off")); - mfo->add (METER_FALLOFF_SLOWEST, _("slowest")); - mfo->add (METER_FALLOFF_SLOW, _("slow")); - mfo->add (METER_FALLOFF_MEDIUM, _("medium")); - mfo->add (METER_FALLOFF_FAST, _("fast")); - mfo->add (METER_FALLOFF_FASTER, _("faster")); - mfo->add (METER_FALLOFF_FASTEST, _("fastest")); - - add_option (_("Misc"), mfo); - - add_option (_("Misc"), new OptionEditorHeading (_("Undo"))); + add_option (_("Misc"), new OptionEditorHeading (S_("Options|Undo"))); add_option (_("Misc"), new UndoOptions (_rc_config)); - add_option (_("Misc"), new OptionEditorHeading (_("Misc"))); - -#ifndef GTKOSX - /* font scaling does nothing with GDK/Quartz */ - add_option (_("Misc"), new FontScalingOptions (_rc_config)); -#endif - add_option (_("Misc"), new BoolOption ( "verify-remove-last-capture", @@ -792,13 +900,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_periodic_safety_backups) )); - add_option (_("Misc"), - new BoolOption ( - "sync-all-route-ordering", - _("Syncronise editor and mixer track order"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_sync_all_route_ordering), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_all_route_ordering) - )); + add_option (_("Misc"), new OptionEditorHeading (_("Misc"))); add_option (_("Misc"), new BoolOption ( @@ -808,24 +910,15 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_only_copy_imported_files) )); - add_option (_("Misc"), - new BoolOption ( - "default-narrow_ms", - _("Use narrow mixer strips"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_narrow_ms), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_narrow_ms) - )); - - add_option (_("Misc"), - new BoolOption ( - "name-new-markers", - _("Name new markers"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_name_new_markers), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_name_new_markers) - )); + add_option (_("Misc"), 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 (_("Misc"), new OptionEditorHeading (_("Click"))); - + add_option (_("Misc"), new ClickOptions (_rc_config, this)); /* TRANSPORT */ @@ -862,6 +955,14 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_at_session_end) )); + add_option (_("Transport"), + new BoolOption ( + "seamless-loop", + _("Do seamless looping (not possible when slaved to MTC, JACK etc)"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_seamless_loop), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_seamless_loop) + )); + add_option (_("Transport"), new BoolOption ( "primary-clock-delta-edit-cursor", @@ -976,6 +1077,54 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms_while_recording) )); + add_option (_("Editor"), + new BoolOption ( + "show-zoom-tools", + _("Show zoom toolbar"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_zoom_tools), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_zoom_tools) + )); + + add_option (_("Editor"), + new BoolOption ( + "color-regions-using-track-color", + _("Color regions using their track's color"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_color_regions_using_track_color), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_color_regions_using_track_color) + )); + + add_option (_("Editor"), + new BoolOption ( + "update-editor-during-summary-drag", + _("Update editor window during drags of the summary"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_update_editor_during_summary_drag), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_update_editor_during_summary_drag) + )); + + add_option (_("Editor"), + new BoolOption ( + "sync-all-route-ordering", + _("Synchronise editor and mixer track order"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_sync_all_route_ordering), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_all_route_ordering) + )); + + add_option (_("Editor"), + new BoolOption ( + "link-editor-and-mixer-selection", + _("Synchronise editor and mixer selection"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_editor_and_mixer_selection), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_editor_and_mixer_selection) + )); + + add_option (_("Editor"), + new BoolOption ( + "name-new-markers", + _("Name new markers"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_name_new_markers), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_name_new_markers) + )); + /* AUDIO */ add_option (_("Audio"), new OptionEditorHeading (_("Buffering"))); @@ -994,7 +1143,7 @@ RCOptionEditor::RCOptionEditor () ComboOption* mm = new ComboOption ( "monitoring-model", - _("Monitoring handled by"), + _("Record monitoring handled by"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_monitoring_model), sigc::mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model) ); @@ -1083,7 +1232,7 @@ RCOptionEditor::RCOptionEditor () } if (fpu.has_flush_to_zero() && fpu.has_denormals_are_zero()) { - dm->add (DenormalFTZDAZ, _("use FlushToZero and DenormalsAreZerO")); + dm->add (DenormalFTZDAZ, _("use FlushToZero and DenormalsAreZero")); } add_option (_("Audio"), dm); @@ -1122,35 +1271,70 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_auto_analyse_audio) )); + add_option (_("Audio"), + new BoolOption ( + "replicate-missing-region-channels", + _("Replicate missing region channels"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_replicate_missing_region_channels), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_replicate_missing_region_channels) + )); + /* SOLO AND MUTE */ add_option (_("Solo / mute"), new FaderOption ( "solo-mute-gain", - _("Solo mute cut (dB)"), + _("Solo-in-place mute cut (dB)"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_mute_gain), sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_gain) )); - - add_option (_("Solo / mute"), - new BoolOption ( - "solo-control-is-listen-control", - _("Solo controls are Listen controls"), - sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_control_is_listen_control), - sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control) - )); - ComboOption* lp = new ComboOption ( + _solo_control_is_listen_control = new BoolOption ( + "solo-control-is-listen-control", + _("Solo controls are Listen controls"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_solo_control_is_listen_control), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control) + ); + + add_option (_("Solo / mute"), _solo_control_is_listen_control); + + _listen_position = new ComboOption ( "listen-position", _("Listen Position"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_listen_position), sigc::mem_fun (*_rc_config, &RCConfiguration::set_listen_position) ); - lp->add (AfterFaderListen, _("after-fader listen")); - lp->add (PreFaderListen, _("pre-fader listen")); + _listen_position->add (AfterFaderListen, _("after-fader (AFL)")); + _listen_position->add (PreFaderListen, _("pre-fader (PFL)")); + + add_option (_("Solo / mute"), _listen_position); + + ComboOption* pp = new ComboOption ( + "pfl-position", + _("PFL signals come from"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_pfl_position), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_pfl_position) + ); + + pp->add (PFLFromBeforeProcessors, _("before pre-fader processors")); + pp->add (PFLFromAfterProcessors, _("pre-fader but after pre-fader processors")); + + add_option (_("Solo / mute"), pp); + + ComboOption* pa = new ComboOption ( + "afl-position", + _("AFL signals come from"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_afl_position), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_afl_position) + ); + + pa->add (AFLFromBeforeProcessors, _("immediately post-fader")); + pa->add (AFLFromAfterProcessors, _("after post-fader processors (before pan)")); + + add_option (_("Solo / mute"), pa); - add_option (_("Solo / mute"), lp); + parameter_changed ("use-monitor-bus"); add_option (_("Solo / mute"), new BoolOption ( @@ -1177,7 +1361,7 @@ RCOptionEditor::RCOptionEditor () )); add_option (_("Solo / mute"), new OptionEditorHeading (_("Default track / bus muting options"))); - + add_option (_("Solo / mute"), new BoolOption ( "mute-affects-pre-fader", @@ -1193,7 +1377,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_post_fader), sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_post_fader) )); - + add_option (_("Solo / mute"), new BoolOption ( "mute-affects-control-outs", @@ -1201,7 +1385,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::get_mute_affects_control_outs), sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_control_outs) )); - + add_option (_("Solo / mute"), new BoolOption ( "mute-affects-main-outs", @@ -1210,7 +1394,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs) )); - add_option (_("MIDI control"), + add_option (_("MIDI"), new BoolOption ( "send-midi-clock", _("Send MIDI Clock"), @@ -1218,7 +1402,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_midi_clock) )); - add_option (_("MIDI control"), + add_option (_("MIDI"), new BoolOption ( "send-mtc", _("Send MIDI Time Code"), @@ -1226,7 +1410,16 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mtc) )); - add_option (_("MIDI control"), + add_option (_("MIDI"), + new SpinOption ( + "mtc-qf-speed-tolerance", + _("Percentage either side of normal transport speed to transmit MTC"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mtc_qf_speed_tolerance), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mtc_qf_speed_tolerance), + 0, 20, 1, 5 + )); + + add_option (_("MIDI"), new BoolOption ( "mmc-control", _("Obey MIDI Machine Control commands"), @@ -1234,8 +1427,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_control) )); - - add_option (_("MIDI control"), + add_option (_("MIDI"), new BoolOption ( "send-mmc", _("Send MIDI Machine Control commands"), @@ -1243,7 +1435,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mmc) )); - add_option (_("MIDI control"), + add_option (_("MIDI"), new BoolOption ( "midi-feedback", _("Send MIDI control feedback"), @@ -1251,7 +1443,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback) )); - add_option (_("MIDI control"), + add_option (_("MIDI"), new SpinOption ( "mmc-receive-device-id", _("Inbound MMC device ID"), @@ -1260,7 +1452,7 @@ RCOptionEditor::RCOptionEditor () 0, 128, 1, 10 )); - add_option (_("MIDI control"), + add_option (_("MIDI"), new SpinOption ( "mmc-send-device-id", _("Outbound MMC device ID"), @@ -1269,7 +1461,7 @@ RCOptionEditor::RCOptionEditor () 0, 128, 1, 10 )); - add_option (_("MIDI control"), + add_option (_("MIDI"), new SpinOption ( "initial-program-change", _("Initial program change"), @@ -1278,9 +1470,31 @@ RCOptionEditor::RCOptionEditor () -1, 65536, 1, 10 )); - /* CONTROL SURFACES */ + add_option (_("MIDI"), + new BoolOption ( + "diplay-first-midi-bank-as-zero", + _("Display first MIDI bank/program as 0"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_first_midi_bank_is_zero), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_first_midi_bank_is_zero) + )); + + add_option (_("MIDI"), + new BoolOption ( + "never-display-periodic-midi", + _("Never display periodic MIDI messages (MTC, MIDI Clock)"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_never_display_periodic_midi), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_never_display_periodic_midi) + )); + + /* USER INTERACTION */ + + add_option (_("User interaction"), new OptionEditorHeading (_("Keyboard"))); - add_option (_("Control surfaces"), new ControlSurfacesOptions (*this)); + add_option (_("User interaction"), new KeyboardOptions); + + add_option (_("User interaction"), new OptionEditorHeading (_("Control surfaces"))); + + add_option (_("User interaction"), new ControlSurfacesOptions (*this)); ComboOption* rm = new ComboOption ( "remote-model", @@ -1293,11 +1507,97 @@ RCOptionEditor::RCOptionEditor () rm->add (MixerOrdered, _("follows order of mixer")); rm->add (EditorOrdered, _("follows order of editor")); - add_option (_("Control surfaces"), rm); + add_option (_("User interaction"), rm); + + /* INTERFACE */ + + add_option (S_("Visual|Interface"), + new BoolOption ( + "widget_prelight", + _("Graphically indicate mouse pointer hovering over various widgets"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_widget_prelight), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_widget_prelight) + )); + +#ifndef GTKOSX + /* font scaling does nothing with GDK/Quartz */ + add_option (S_("Visual|Interface"), new FontScalingOptions (_rc_config)); +#endif + + /* The names of these controls must be the same as those given in MixerStrip + for the actual widgets being controlled. + */ + _mixer_strip_visibility.add (0, X_("PhaseInvert"), _("Phase Invert")); + _mixer_strip_visibility.add (0, X_("SoloSafe"), _("Solo Safe")); + _mixer_strip_visibility.add (0, X_("SoloIsolated"), _("Solo Isolated")); + _mixer_strip_visibility.add (0, X_("Comments"), _("Comments")); + _mixer_strip_visibility.add (0, X_("Group"), _("Group")); + _mixer_strip_visibility.add (0, X_("MeterPoint"), _("Meter Point")); + + add_option ( + S_("Visual|Interface"), + new VisibilityOption ( + _("Mixer Strip"), + &_mixer_strip_visibility, + sigc::mem_fun (*_rc_config, &RCConfiguration::get_mixer_strip_visibility), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_mixer_strip_visibility) + ) + ); + + add_option (S_("Visual|Interface"), + new BoolOption ( + "default-narrow_ms", + _("Use narrow mixer strips by default"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_narrow_ms), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_narrow_ms) + )); + + add_option (S_("Visual|Interface"), new OptionEditorHeading (_("Metering"))); + + ComboOption* mht = new ComboOption ( + "meter-hold", + _("Meter hold time"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_hold), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_hold) + ); + + mht->add (MeterHoldOff, _("off")); + mht->add (MeterHoldShort, _("short")); + mht->add (MeterHoldMedium, _("medium")); + mht->add (MeterHoldLong, _("long")); + + add_option (S_("Visual|Interface"), mht); + + ComboOption* mfo = new ComboOption ( + "meter-falloff", + _("Meter fall-off"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_falloff), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_falloff) + ); - /* KEYBOARD */ + mfo->add (METER_FALLOFF_OFF, _("off")); + mfo->add (METER_FALLOFF_SLOWEST, _("slowest")); + mfo->add (METER_FALLOFF_SLOW, _("slow")); + mfo->add (METER_FALLOFF_MEDIUM, _("medium")); + mfo->add (METER_FALLOFF_FAST, _("fast")); + mfo->add (METER_FALLOFF_FASTER, _("faster")); + mfo->add (METER_FALLOFF_FASTEST, _("fastest")); - add_option (_("Keyboard"), new KeyboardOptions); + add_option (S_("Visual|Interface"), mfo); } +void +RCOptionEditor::parameter_changed (string const & p) +{ + OptionEditor::parameter_changed (p); + if (p == "use-monitor-bus") { + bool const s = Config->get_use_monitor_bus (); + if (!s) { + /* we can't use this if we don't have a monitor bus */ + Config->set_solo_control_is_listen_control (false); + } + _solo_control_is_listen_control->set_sensitive (s); + _listen_position->set_sensitive (s); + } +}