Fix generic UI sliders w/rangesteps

Leave the user in control while the slider is being dragged.

Previously there was a feedback loop:
User-drags slider -> value changes -> value is rounded
-> slider is updated with rounded value (while the user still drags)
This commit is contained in:
Robin Gareus 2018-07-18 10:55:41 +02:00
parent 14517e13ec
commit 0e79253412
2 changed files with 14 additions and 0 deletions

View File

@ -70,6 +70,7 @@ AutomationController::AutomationController(boost::shared_ptr<AutomationControl>
, _controllable(ac)
, _adjustment(adj)
, _ignore_change(false)
, _grabbed(false)
{
if (ac->toggled()) {
ArdourButton* but = manage(new ArdourButton());
@ -165,6 +166,13 @@ AutomationController::display_effective_value ()
{
double const interface_value = _controllable->internal_to_interface(_controllable->get_value());
if (_grabbed) {
/* we cannot use _controllable->touching() here
* because that's only set in Write or Touch mode.
* Besides ctrl-surfaces may also set touching()
*/
return;
}
if (_adjustment->get_value () != interface_value) {
_ignore_change = true;
_adjustment->set_value (interface_value);
@ -197,6 +205,7 @@ AutomationController::value_adjusted ()
void
AutomationController::start_touch()
{
_grabbed = true;
_controllable->start_touch (_controllable->session().transport_sample());
}
@ -204,6 +213,10 @@ void
AutomationController::end_touch ()
{
_controllable->stop_touch (_controllable->session().transport_sample());
if (_grabbed) {
_grabbed = false;
display_effective_value ();
}
}
bool

View File

@ -102,6 +102,7 @@ private:
sigc::connection _screen_update_connection;
PBD::ScopedConnectionList _changed_connections;
bool _ignore_change;
bool _grabbed;
};