mechanism to allow Track (or other Route-derived type) to add its own processors...
[ardour.git] / gtk2_ardour / ardour_ui_options.cc
index 0c31bf4de1e9d1dbb31105e66b0b6e0032e34b9e..14a8695c8b585cac267e504e404406332f9d669a 100644 (file)
 #include "pbd/stacktrace.h"
 #include "pbd/unwind.h"
 
-#include <gtkmm2ext/utils.h>
-
 #include "ardour/rc_configuration.h"
 #include "ardour/session.h"
 
-#include "canvas/wave_view.h"
+#include "gtkmm2ext/utils.h"
+#include "waveview/wave_view.h"
 
 #include "audio_clock.h"
 #include "ardour_ui.h"
@@ -45,6 +44,7 @@ using namespace Gtk;
 using namespace Gtkmm2ext;
 using namespace ARDOUR;
 using namespace PBD;
+using namespace ArdourWidgets;
 
 void
 ARDOUR_UI::toggle_external_sync()
@@ -132,9 +132,6 @@ ARDOUR_UI::toggle_click ()
 void
 ARDOUR_UI::toggle_session_monitoring_in ()
 {
-       if (ignore_session_monitoring) {
-               return;
-       }
        Glib::RefPtr<Action> act = ActionManager::get_action (X_("Transport"), X_("SessionMonitorIn"));
        if (!act) {
                return;
@@ -143,15 +140,15 @@ ARDOUR_UI::toggle_session_monitoring_in ()
        if (!tact) {
                return;
        }
+
+       if (tact->get_active() && _session->config.get_session_monitoring () == MonitorInput) {
+               return;
+       }
+       if (!tact->get_active() && _session->config.get_session_monitoring () != MonitorInput) {
+               return;
+       }
+
        if (tact->get_active()) {
-               Glib::RefPtr<Action> dact = ActionManager::get_action (X_("Transport"), X_("SessionMonitorDisk"));
-               if (dact) {
-                       Glib::RefPtr<ToggleAction> tdact = Glib::RefPtr<ToggleAction>::cast_dynamic(dact);
-                       if (tdact) {
-                               PBD::Unwinder<bool> (ignore_session_monitoring, true);
-                               tdact->set_active (false);
-                       }
-               }
                _session->config.set_session_monitoring (MonitorInput);
        } else {
                _session->config.set_session_monitoring (MonitorAuto);
@@ -161,9 +158,6 @@ ARDOUR_UI::toggle_session_monitoring_in ()
 void
 ARDOUR_UI::toggle_session_monitoring_disk ()
 {
-       if (ignore_session_monitoring) {
-               return;
-       }
        Glib::RefPtr<Action> act = ActionManager::get_action (X_("Transport"), X_("SessionMonitorDisk"));
        if (!act) {
                return;
@@ -172,15 +166,14 @@ ARDOUR_UI::toggle_session_monitoring_disk ()
        if (!tact) {
                return;
        }
+       if (tact->get_active() && _session->config.get_session_monitoring () == MonitorDisk) {
+               return;
+       }
+       if (!tact->get_active() && _session->config.get_session_monitoring () != MonitorDisk) {
+               return;
+       }
+
        if (tact->get_active()) {
-               Glib::RefPtr<Action> iact = ActionManager::get_action (X_("Transport"), X_("SessionMonitorIn"));
-               if (iact) {
-                       Glib::RefPtr<ToggleAction> tiact = Glib::RefPtr<ToggleAction>::cast_dynamic(iact);
-                       if (tiact) {
-                               PBD::Unwinder<bool> (ignore_session_monitoring, true);
-                               tiact->set_active (false);
-                       }
-               }
                _session->config.set_session_monitoring (MonitorDisk);
        } else {
                _session->config.set_session_monitoring (MonitorAuto);
@@ -360,7 +353,6 @@ ARDOUR_UI::parameter_changed (std::string p)
 
                if (!_session->config.get_external_sync()) {
                        sync_button.set_text (S_("SyncSource|Int."));
-                       auto_loop_button.set_sensitive (true);
                        ActionManager::get_action ("Transport", "ToggleAutoPlay")->set_sensitive (true);
                        ActionManager::get_action ("Transport", "ToggleAutoReturn")->set_sensitive (true);
                        ActionManager::get_action ("Transport", "ToggleFollowEdits")->set_sensitive (true);
@@ -372,12 +364,12 @@ ARDOUR_UI::parameter_changed (std::string p)
                                // but makes it clear to the user that it's disabled.
                                _session->request_play_loop (false, false);
                        }
-                       auto_loop_button.set_sensitive (false);
                        /* XXX we need to make sure that auto-play is off as well as insensitive */
                        ActionManager::get_action ("Transport", "ToggleAutoPlay")->set_sensitive (false);
                        ActionManager::get_action ("Transport", "ToggleAutoReturn")->set_sensitive (false);
                        ActionManager::get_action ("Transport", "ToggleFollowEdits")->set_sensitive (false);
                }
+               set_loop_sensitivity ();
 
        } else if (p == "follow-edits") {
 
@@ -409,9 +401,11 @@ ARDOUR_UI::parameter_changed (std::string p)
                                switch (_session->config.get_session_monitoring ()) {
                                        case MonitorDisk:
                                                tdact->set_active (true);
+                                               tiact->set_active (false);
                                                break;
                                        case MonitorInput:
                                                tiact->set_active (true);
+                                               tdact->set_active (false);
                                                break;
                                        default:
                                                tdact->set_active (false);
@@ -432,6 +426,13 @@ ARDOUR_UI::parameter_changed (std::string p)
                }
        } else if (p == "clicking") {
                ActionManager::map_some_state ("Transport", "ToggleClick", &RCConfiguration::get_clicking);
+       } else if (p == "click-record-only") {
+               // TODO set a flag, blink or gray-out metronome button while rolling, only
+               if (Config->get_click_record_only()) {
+                       click_button.set_name ("generic button"); // XXX
+               } else {
+                       click_button.set_name ("transport button");
+               }
        } else if (p == "use-video-sync") {
                ActionManager::map_some_state ("Transport",  "ToggleVideoSync", sigc::mem_fun (_session->config, &SessionConfiguration::get_use_video_sync));
        } else if (p == "sync-source") {
@@ -474,7 +475,7 @@ ARDOUR_UI::parameter_changed (std::string p)
                        Gtkmm2ext::disable_tooltips ();
                }
        } else if (p == "waveform-gradient-depth") {
-               ArdourCanvas::WaveView::set_global_gradient_depth (UIConfiguration::instance().get_waveform_gradient_depth());
+               ArdourWaveView::WaveView::set_global_gradient_depth (UIConfiguration::instance().get_waveform_gradient_depth());
        } else if (p == "show-mini-timeline") {
                repack_transport_hbox ();
        } else if (p == "show-toolbar-recpunch") {
@@ -488,17 +489,17 @@ ARDOUR_UI::parameter_changed (std::string p)
        } else if (p == "show-secondary-clock") {
                update_clock_visibility ();
        } else if (p == "waveform-scale") {
-               ArdourCanvas::WaveView::set_global_logscaled (UIConfiguration::instance().get_waveform_scale() == Logarithmic);
+               ArdourWaveView::WaveView::set_global_logscaled (UIConfiguration::instance().get_waveform_scale() == Logarithmic);
        } else if (p == "widget-prelight") {
                CairoWidget::set_widget_prelight (UIConfiguration::instance().get_widget_prelight());
        } else if (p == "waveform-shape") {
-               ArdourCanvas::WaveView::set_global_shape (UIConfiguration::instance().get_waveform_shape() == Rectified
-                               ? ArdourCanvas::WaveView::Rectified : ArdourCanvas::WaveView::Normal);
+               ArdourWaveView::WaveView::set_global_shape (UIConfiguration::instance().get_waveform_shape() == Rectified
+                               ? ArdourWaveView::WaveView::Rectified : ArdourWaveView::WaveView::Normal);
        } else if (p == "show-waveform-clipping") {
-               ArdourCanvas::WaveView::set_global_show_waveform_clipping (UIConfiguration::instance().get_show_waveform_clipping());
+               ArdourWaveView::WaveView::set_global_show_waveform_clipping (UIConfiguration::instance().get_show_waveform_clipping());
        } else if (p == "waveform-cache-size") {
                /* GUI option has units of megabytes; image cache uses units of bytes */
-               ArdourCanvas::WaveView::set_image_cache_size (UIConfiguration::instance().get_waveform_cache_size() * 1048576);
+               ArdourWaveView::WaveView::set_image_cache_size (UIConfiguration::instance().get_waveform_cache_size() * 1048576);
        } else if (p == "use-wm-visibility") {
                VisibilityTracker::set_use_window_manager_visibility (UIConfiguration::instance().get_use_wm_visibility());
        } else if (p == "action-table-columns") {
@@ -514,9 +515,9 @@ ARDOUR_UI::parameter_changed (std::string p)
        } else if (p == "layered-record-mode") {
                layered_button.set_active (_session->config.get_layered_record_mode ());
        } else if (p == "show-waveform-clipping") {
-               ArdourCanvas::WaveView::set_global_show_waveform_clipping (UIConfiguration::instance().get_show_waveform_clipping());
+               ArdourWaveView::WaveView::set_global_show_waveform_clipping (UIConfiguration::instance().get_show_waveform_clipping());
        } else if (p == "waveform-gradient-depth") {
-               ArdourCanvas::WaveView::set_global_gradient_depth (UIConfiguration::instance().get_waveform_gradient_depth());
+               ArdourWaveView::WaveView::set_global_gradient_depth (UIConfiguration::instance().get_waveform_gradient_depth());
        } else if (p == "flat-buttons") {
                bool flat = UIConfiguration::instance().get_flat_buttons();
                if (ArdourButton::flat_buttons () != flat) {
@@ -524,6 +525,11 @@ ARDOUR_UI::parameter_changed (std::string p)
                        /* force a redraw */
                        gtk_rc_reset_styles (gtk_settings_get_default());
                }
+       } else if (p == "click-gain") {
+               float gain_db = accurate_coefficient_to_dB (Config->get_click_gain());
+               char tmp[32];
+               snprintf(tmp, 31, "%+.1f", gain_db);
+               set_tip (click_button, string_compose (_("Enable/Disable metronome\n\nRight-click to access preferences\nMouse-wheel to modify level\nSignal Level: %1 dBFS"), tmp));
        }
 }