Toggled automation fixes.
[ardour.git] / gtk2_ardour / automation_controller.cc
index a7922d2f00302413e6691b4c93d4743aadfd941d..1bce94dca2b464c9f024fd3f41bd67680891d607 100644 (file)
 #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"
+#include "timers.h"
 
 #include "i18n.h"
 
@@ -83,9 +83,9 @@ AutomationController::AutomationController(boost::shared_ptr<Automatable>
                } else {
                        but->set_name("generic button");
                }
+               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));
@@ -104,7 +104,7 @@ AutomationController::AutomationController(boost::shared_ptr<Automatable>
        _adjustment->signal_value_changed().connect(
                sigc::mem_fun(*this, &AutomationController::value_adjusted));
 
-       _screen_update_connection = ARDOUR_UI::RapidScreenUpdate.connect (
+       _screen_update_connection = Timers::rapid_connect (
                        sigc::mem_fun (*this, &AutomationController::display_effective_value));
 
        ac->Changed.connect (_changed_connection, invalidator (*this), boost::bind (&AutomationController::value_changed, this), gui_context());
@@ -126,19 +126,8 @@ AutomationController::create(boost::shared_ptr<Automatable>       printer,
        const double lo        = ac->internal_to_interface(desc.lower);
        const double up        = ac->internal_to_interface(desc.upper);
        const double normal    = ac->internal_to_interface(desc.normal);
-       double       smallstep = desc.smallstep;
-       double       largestep = desc.largestep;
-       if (smallstep == 0.0) {
-               smallstep = up / 1000.;
-       } else {
-               smallstep = ac->internal_to_interface(desc.lower + smallstep);
-       }
-
-       if (largestep == 0.0) {
-               largestep = up / 40.;
-       } else {
-               largestep = ac->internal_to_interface(desc.lower + largestep);
-       }
+       const double smallstep = ac->internal_to_interface(desc.lower + desc.smallstep);
+       const double largestep = ac->internal_to_interface(desc.lower + desc.largestep);
 
        Gtk::Adjustment* adjustment = manage (
                new Gtk::Adjustment (normal, lo, up, smallstep, largestep));
@@ -208,16 +197,14 @@ AutomationController::toggled ()
 {
        ArdourButton* but = dynamic_cast<ArdourButton*>(_widget);
        if (but) {
-               start_touch();
                const bool was_active = _controllable->get_value() >= 0.5;
-               if (was_active) {
+               if (was_active && but->get_active()) {
                        _adjustment->set_value(0.0);
                        but->set_active(false);
-               } else {
+               } else if (!was_active && !but->get_active()) {
                        _adjustment->set_value(1.0);
                        but->set_active(true);
                }
-               end_touch();
        }
 }
 
@@ -307,10 +294,10 @@ AutomationController::on_button_release(GdkEventButton* ev)
                                                 sigc::mem_fun(*this, &AutomationController::run_note_select_dialog)));
                }
                if (is_low) {
-                       for (double beats = 1.0; beats <= 16; ++beats) {
-                               items.push_back(MenuElem(string_compose(_("Set to %1 beat(s)"), (int)beats),
+                       for (int beats = 1; beats <= 16; ++beats) {
+                               items.push_back(MenuElem (string_compose(P_("Set to %1 beat", "Set to %1 beats", beats), beats),
                                                         sigc::bind(sigc::mem_fun(*this, &AutomationController::set_freq_beats),
-                                                                   beats)));
+                                                                   (double)beats)));
                        }
                }
                menu->popup(1, ev->time);