mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-11 17:16:38 +01:00
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:
parent
14517e13ec
commit
0e79253412
2 changed files with 14 additions and 0 deletions
|
|
@ -70,6 +70,7 @@ AutomationController::AutomationController(boost::shared_ptr<AutomationControl>
|
||||||
, _controllable(ac)
|
, _controllable(ac)
|
||||||
, _adjustment(adj)
|
, _adjustment(adj)
|
||||||
, _ignore_change(false)
|
, _ignore_change(false)
|
||||||
|
, _grabbed(false)
|
||||||
{
|
{
|
||||||
if (ac->toggled()) {
|
if (ac->toggled()) {
|
||||||
ArdourButton* but = manage(new ArdourButton());
|
ArdourButton* but = manage(new ArdourButton());
|
||||||
|
|
@ -165,6 +166,13 @@ AutomationController::display_effective_value ()
|
||||||
{
|
{
|
||||||
double const interface_value = _controllable->internal_to_interface(_controllable->get_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) {
|
if (_adjustment->get_value () != interface_value) {
|
||||||
_ignore_change = true;
|
_ignore_change = true;
|
||||||
_adjustment->set_value (interface_value);
|
_adjustment->set_value (interface_value);
|
||||||
|
|
@ -197,6 +205,7 @@ AutomationController::value_adjusted ()
|
||||||
void
|
void
|
||||||
AutomationController::start_touch()
|
AutomationController::start_touch()
|
||||||
{
|
{
|
||||||
|
_grabbed = true;
|
||||||
_controllable->start_touch (_controllable->session().transport_sample());
|
_controllable->start_touch (_controllable->session().transport_sample());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -204,6 +213,10 @@ void
|
||||||
AutomationController::end_touch ()
|
AutomationController::end_touch ()
|
||||||
{
|
{
|
||||||
_controllable->stop_touch (_controllable->session().transport_sample());
|
_controllable->stop_touch (_controllable->session().transport_sample());
|
||||||
|
if (_grabbed) {
|
||||||
|
_grabbed = false;
|
||||||
|
display_effective_value ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,7 @@ private:
|
||||||
sigc::connection _screen_update_connection;
|
sigc::connection _screen_update_connection;
|
||||||
PBD::ScopedConnectionList _changed_connections;
|
PBD::ScopedConnectionList _changed_connections;
|
||||||
bool _ignore_change;
|
bool _ignore_change;
|
||||||
|
bool _grabbed;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue