diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 1eedac86d2..89e1e5b79b 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -204,6 +204,13 @@ ARDOUR_UI *ARDOUR_UI::theArdourUI = 0; sigc::signal ARDOUR_UI::Clock; sigc::signal ARDOUR_UI::CloseAllDialogs; +static const gchar *_record_mode_strings[] = { + N_("Layerered"), + N_("Non Layered"), + N_("Sound on Sound"), + 0 +}; + static bool ask_about_configuration_copy (string const & old_dir, string const & new_dir, int version) { @@ -351,6 +358,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) UIConfiguration::instance().post_gui_init (); + record_mode_strings = I18N (_record_mode_strings); + if (ARDOUR::handle_old_configuration_files (boost::bind (ask_about_configuration_copy, _1, _2, _3))) { { /* "touch" the been-here-before path now that config has been migrated */ @@ -2137,7 +2146,7 @@ void ARDOUR_UI::map_transport_state () { if (!_session) { - layered_button.set_sensitive (false); + record_mode_selector.set_sensitive (false); if (UIConfiguration::instance().get_screen_saver_mode () == InhibitWhileRecording) { inhibit_screensaver (false); } @@ -2149,9 +2158,9 @@ ARDOUR_UI::map_transport_state () float sp = _session->transport_speed(); if (sp != 0.0f) { - layered_button.set_sensitive (!_session->actively_recording ()); + record_mode_selector.set_sensitive (!_session->actively_recording ()); } else { - layered_button.set_sensitive (true); + record_mode_selector.set_sensitive (true); update_disk_space (); } if (UIConfiguration::instance().get_screen_saver_mode () == InhibitWhileRecording) { diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 06af6b06cc..8c6a350d19 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -522,9 +522,9 @@ private: TransportControlUI transport_ctrl; - ArdourWidgets::ArdourButton punch_in_button; - ArdourWidgets::ArdourButton punch_out_button; - ArdourWidgets::ArdourButton layered_button; + ArdourWidgets::ArdourButton punch_in_button; + ArdourWidgets::ArdourButton punch_out_button; + ArdourWidgets::ArdourDropdown record_mode_selector; ArdourWidgets::ArdourVSpacer recpunch_spacer; ArdourWidgets::ArdourVSpacer latency_spacer; @@ -604,7 +604,7 @@ private: void audition_alert_clicked (); bool error_alert_press (GdkEventButton *); - void layered_button_clicked (); + void set_record_mode (ARDOUR::RecordMode); void big_clock_value_changed (); void primary_clock_value_changed (); @@ -835,6 +835,7 @@ private: void editor_realized (); std::vector positional_sync_strings; + std::vector record_mode_strings; void toggle_use_mmc (); void toggle_send_mmc (); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 27f3f51a16..d032aa3876 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -91,7 +91,7 @@ ARDOUR_UI::setup_tooltips () ArdourCanvas::Canvas::set_tooltip_timeout (Gtk::Settings::get_default()->property_gtk_tooltip_timeout ()); set_tip (auto_return_button, _("Return to last playback start when stopped")); - set_tip (layered_button, _("When active, new recordings will be added as regions on a layer atop existing regions.\nWhen disabled, the underlying region will be spliced and replaced with the newly recorded region.")); + set_tip (record_mode_selector, _("Layered, new recordings will be added as regions on a layer atop existing regions.\nSoundOnSound, behaves like Layered, except underlying regions will be audible.\nNon Layered, the underlying region will be spliced and replaced with the newly recorded region.")); set_tip (follow_edits_button, _("Playhead follows Range tool clicks, and Range selections")); parameter_changed("click-gain"); set_tip (solo_alert_button, _("When active, something is soloed.\nClick to de-solo everything")); @@ -241,14 +241,14 @@ ARDOUR_UI::repack_transport_hbox () layered_label.show (); punch_in_button.show (); punch_out_button.show (); - layered_button.show (); + record_mode_selector.show (); recpunch_spacer.show (); } else { punch_label.hide (); layered_label.hide (); punch_in_button.hide (); punch_out_button.hide (); - layered_button.hide (); + record_mode_selector.hide (); recpunch_spacer.hide (); } @@ -336,8 +336,6 @@ ARDOUR_UI::setup_transport () error_alert_button.set_related_action(act); error_alert_button.set_fallthrough_to_parent(true); - layered_button.signal_clicked.connect (sigc::mem_fun(*this,&ARDOUR_UI::layered_button_clicked)); - editor_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-editor-visibility"))); mixer_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-mixer-visibility"))); prefs_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-preferences-visibility"))); @@ -423,7 +421,7 @@ ARDOUR_UI::setup_transport () punch_in_button.set_name ("punch button"); punch_out_button.set_name ("punch button"); - layered_button.set_name (("layered button")); + record_mode_selector.set_name (("record mode button")); latency_disable_button.set_name ("latency button"); @@ -446,7 +444,12 @@ ARDOUR_UI::setup_transport () follow_edits_button.set_text(_("Follow Range")); punch_in_button.set_text (_("In")); punch_out_button.set_text (_("Out")); - layered_button.set_text (_("Non-Layered")); + + record_mode_selector.AddMenuElem (MenuElem (record_mode_strings[(int)RecLayered], sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::set_record_mode), RecLayered))); + record_mode_selector.AddMenuElem (MenuElem (record_mode_strings[(int)RecNonLayered], sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::set_record_mode), RecNonLayered))); + record_mode_selector.AddMenuElem (MenuElem (record_mode_strings[(int)RecSoundOnSound], sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::set_record_mode), RecSoundOnSound))); + + set_size_request_to_display_given_text (record_mode_selector, record_mode_strings, /*COMBO_TRIANGLE_WIDTH*/ 5, 2); latency_disable_button.set_text (_("Disable PDC")); io_latency_label.set_text (_("I/O Latency:")); @@ -561,7 +564,7 @@ ARDOUR_UI::setup_transport () //punch section button_height_size_group->add_widget (punch_in_button); button_height_size_group->add_widget (punch_out_button); - button_height_size_group->add_widget (layered_button); + button_height_size_group->add_widget (record_mode_selector); // PDC button_height_size_group->add_widget (latency_disable_button); @@ -603,10 +606,10 @@ ARDOUR_UI::setup_transport () transport_table.attach (layered_label, TCOL, 1, 2 , FILL, SHRINK, 3, 0); ++col; - transport_table.attach (punch_in_button, col, col + 1, 0, 1 , FILL, SHRINK, hpadding, vpadding); - transport_table.attach (punch_space, col + 1, col + 2, 0, 1 , FILL, SHRINK, 0, vpadding); - transport_table.attach (punch_out_button, col + 2, col + 3, 0, 1 , FILL, SHRINK, hpadding, vpadding); - transport_table.attach (layered_button, col, col + 3, 1, 2 , FILL, SHRINK, hpadding, vpadding); + transport_table.attach (punch_in_button, col, col + 1, 0, 1 , FILL, SHRINK, hpadding, vpadding); + transport_table.attach (punch_space, col + 1, col + 2, 0, 1 , FILL, SHRINK, 0, vpadding); + transport_table.attach (punch_out_button, col + 2, col + 3, 0, 1 , FILL, SHRINK, hpadding, vpadding); + transport_table.attach (record_mode_selector, col, col + 3, 1, 2 , FILL, SHRINK, hpadding, vpadding); col += 3; transport_table.attach (recpunch_spacer, TCOL, 0, 2 , SHRINK, EXPAND|FILL, 3, 0); @@ -805,10 +808,10 @@ ARDOUR_UI::error_alert_press (GdkEventButton* ev) } void -ARDOUR_UI::layered_button_clicked () +ARDOUR_UI::set_record_mode (RecordMode m) { if (_session) { - _session->config.set_layered_record_mode (!_session->config.get_layered_record_mode ()); + _session->config.set_record_mode (m); } } diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 9e49887dad..8b262dbd58 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -466,8 +466,10 @@ ARDOUR_UI::parameter_changed (std::string p) } else if (p == "cue-behavior") { CueBehavior cb (_session->config.get_cue_behavior()); _cue_play_enable.set_active (cb & ARDOUR::FollowCues); - } else if (p == "layered-record-mode") { - layered_button.set_active (_session->config.get_layered_record_mode ()); + } else if (p == "record-mode") { + size_t m = _session->config.get_record_mode (); + assert (m < record_mode_strings.size ()); + record_mode_selector.set_active (record_mode_strings[m]); } else if (p == "flat-buttons") { bool flat = UIConfiguration::instance().get_flat_buttons(); if (ArdourButton::flat_buttons () != flat) { diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index b4727319d2..562b6a2560 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2635,7 +2635,7 @@ Editor::insert_source_list_selection (float times) playlist->clear_changes (); playlist->clear_owned_changes (); - playlist->add_region ((RegionFactory::create (region, true)), get_preferred_edit_position(), times, _session->config.get_layered_record_mode()); //ToDo: insert_mode ? + playlist->add_region ((RegionFactory::create (region, true)), get_preferred_edit_position(), times, RecNonLayered == _session->config.get_record_mode()); //ToDo: insert_mode ? if (should_ripple()) { do_ripple (playlist, get_preferred_edit_position(), region->length().scale (times), boost::shared_ptr(), true); diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 48a1bd3ce4..960485e93f 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -2032,7 +2032,7 @@ RouteUI::parameter_changed (string const & p) update_monitoring_display (); } else if (p == "triggerbox-overrides-disk-monitoring") { update_monitoring_display (); - } else if (p == "layered-record-mode") { + } else if (p == "record-mode") { update_monitoring_display (); } else if (p == "auto-input-does-talkback") { update_monitoring_display ();