Toggled automation fixes.
[ardour.git] / gtk2_ardour / automation_controller.cc
index a8051f0eb498b839036bfce6e50288e04a144bb0..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,16 +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 - lo) / 100;
-       }
-       if (largestep == 0.0) {
-               largestep = (up - lo) / 10;
-       }
-       smallstep = ac->internal_to_interface(smallstep);
-       largestep = ac->internal_to_interface(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));
@@ -162,12 +154,15 @@ AutomationController::value_adjusted ()
 {
        if (!_ignore_change) {
                _controllable->set_value (_controllable->interface_to_internal(_adjustment->get_value()));
-       } else {
-               /* A bar controller will automatically follow the adjustment, but for a
-                  button we have to do it manually. */
-               ArdourButton* but = dynamic_cast<ArdourButton*>(_widget);
-               if (but) {
-                       but->set_active(_adjustment->get_value() >= 0.5);
+       }
+
+       /* A bar controller will automatically follow the adjustment, but for a
+          button we have to do it manually. */
+       ArdourButton* but = dynamic_cast<ArdourButton*>(_widget);
+       if (but) {
+               const bool active = _adjustment->get_value() >= 0.5;
+               if (but->get_active() != active) {
+                       but->set_active(active);
                }
        }
 }
@@ -203,10 +198,10 @@ AutomationController::toggled ()
        ArdourButton* but = dynamic_cast<ArdourButton*>(_widget);
        if (but) {
                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);
                }
@@ -299,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);