using PBD::Controllable;
AutomationBarController::AutomationBarController (
- boost::shared_ptr<Automatable> printer,
boost::shared_ptr<AutomationControl> ac,
Adjustment* adj)
: Gtkmm2ext::BarController(*adj, ac)
- , _printer(printer)
, _controllable(ac)
{
}
std::string
AutomationBarController::get_label (double& xpos)
{
- xpos = 0.5;
- return _printer->value_as_string (_controllable);
+ xpos = 0.5;
+ return _controllable->get_user_string();
}
AutomationBarController::~AutomationBarController()
{
}
-AutomationController::AutomationController(boost::shared_ptr<Automatable> printer,
- boost::shared_ptr<AutomationControl> ac,
+AutomationController::AutomationController(boost::shared_ptr<AutomationControl> ac,
Adjustment* adj,
bool use_knob)
: _widget(NULL)
- , _printer (printer)
, _controllable(ac)
, _adjustment(adj)
, _ignore_change(false)
{
- assert (_printer);
-
if (ac->toggled()) {
ArdourButton* but = manage(new ArdourButton());
} else {
but->set_name("generic button");
}
+ but->set_fallthrough_to_parent(true);
but->set_controllable(ac);
- but->signal_clicked.connect(
- sigc::mem_fun(*this, &AutomationController::toggled));
+ but->signal_button_press_event().connect(
+ sigc::mem_fun(*this, &AutomationController::button_press));
+ but->signal_button_release_event().connect(
+ sigc::mem_fun(*this, &AutomationController::button_release));
const bool active = _adjustment->get_value() >= 0.5;
if (but->get_active() != active) {
but->set_active(active);
knob->set_name("processor control knob");
_widget = knob;
} else {
- AutomationBarController* bar = manage(new AutomationBarController(_printer, ac, adj));
+ AutomationBarController* bar = manage(new AutomationBarController(ac, adj));
bar->set_name(X_("ProcessorControlSlider"));
bar->StartGesture.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());
+ ac->Changed.connect (_changed_connection, invalidator (*this), boost::bind (&AutomationController::display_effective_value, this), gui_context());
add(*_widget);
show_all();
}
boost::shared_ptr<AutomationController>
-AutomationController::create(boost::shared_ptr<Automatable> printer,
- const Evoral::Parameter& param,
+AutomationController::create(const Evoral::Parameter& param,
const ParameterDescriptor& desc,
boost::shared_ptr<AutomationControl> ac,
bool use_knob)
assert (ac);
assert(ac->parameter() == param);
- return boost::shared_ptr<AutomationController>(new AutomationController(printer, ac, adjustment, use_knob));
+ return boost::shared_ptr<AutomationController>(new AutomationController(ac, adjustment, use_knob));
}
void
_adjustment->set_value (interface_value);
_ignore_change = false;
}
+
}
void
}
}
-void
-AutomationController::toggled ()
+bool
+AutomationController::button_press (GdkEventButton*)
{
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 (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);
- }
- /* 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);
- }
+ start_touch ();
+ _controllable->set_value (but->get_active () ? 0.0 : 1.0, Controllable::UseGroup);
}
+ return false;
+}
+
+bool
+AutomationController::button_release (GdkEventButton*)
+{
+ end_touch ();
+ return true;
}
static double
const ARDOUR::Session& session = _controllable->session();
const framepos_t pos = session.transport_frame();
const ARDOUR::Tempo& tempo = session.tempo_map().tempo_at_frame (pos);
- const double bpm = tempo.beats_per_minute();
+ const double bpm = tempo.note_types_per_minute();
const double bps = bpm / 60.0;
const double freq = bps / beats;
_controllable->set_value(clamp(freq, desc.lower, desc.upper), Controllable::NoGroup);
return false;
}
-void
-AutomationController::value_changed ()
-{
- Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&AutomationController::display_effective_value, this));
-}
-
/** Stop updating our value from our controllable */
void
AutomationController::stop_updating ()