#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"
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));
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);
}
}
}