Use lwrcase_dirname for desktop file names and substitutions.
[ardour.git] / gtk2_ardour / automation_controller.cc
index f57f2a737a81314f20ec9524f5f26d2875d86751..dd2d71d9cd4d5c43f96650a3aa3ff4230dbf18c7 100644 (file)
@@ -30,7 +30,6 @@
 #include "ardour/tempo.h"
 
 #include "ardour_button.h"
-#include "ardour_ui.h"
 #include "automation_controller.h"
 #include "gui_thread.h"
 #include "note_select_dialog.h"
@@ -87,7 +86,6 @@ AutomationController::AutomationController(boost::shared_ptr<Automatable>
                but->set_controllable(ac);
                but->signal_clicked.connect(
                        sigc::mem_fun(*this, &AutomationController::toggled));
-
                _widget = but;
        } else {
                AutomationBarController* bar = manage(new AutomationBarController(_printer, ac, adj));
@@ -198,22 +196,27 @@ void
 AutomationController::toggled ()
 {
        ArdourButton* but = dynamic_cast<ArdourButton*>(_widget);
+       const AutoState as = _controllable->automation_state ();
+       const double where = _controllable->session ().audible_frame ();
+       const bool to_list = _controllable->list () && _controllable->session().transport_rolling () && (as == Touch || as == Write);
+
        if (but) {
-               if (_controllable->session().transport_rolling()) {
-                       if (_controllable->automation_state() == Touch) {
-                               _controllable->set_automation_state(Write);
-                       }
-                       if (_controllable->list()) {
-                               _controllable->list()->set_in_write_pass(true, false, _controllable->session().audible_frame());
+               if (to_list) {
+                       if (as == Touch && _controllable->list ()->in_new_write_pass ()) {
+                               _controllable->alist ()->start_write_pass (where);
                        }
+                       _controllable->list ()->set_in_write_pass (true, false, where);
                }
-               const bool was_active = _controllable->get_value() >= 0.5;
-               if (was_active && but->get_active()) {
-                       _adjustment->set_value(0.0);
-                       but->set_active(false);
-               } else if (!was_active && !but->get_active()) {
-                       _adjustment->set_value(1.0);
-                       but->set_active(true);
+               /* set to opposite value.*/
+               _controllable->set_double (but->get_active () ? 0.0 : 1.0, where, to_list);
+
+               const bool active = _controllable->get_double (to_list, where) >= 0.5;
+               if (active && !but->get_active ()) {
+                       _adjustment->set_value (1.0);
+                       but->set_active (true);
+               } else if (!active && but->get_active ()) {
+                       _adjustment->set_value (0.0);
+                       but->set_active (false);
                }
        }
 }