Fix ui::slider behavior if reshape occurs while user is changing value

This commit is contained in:
Nikita Lisitsa 2022-02-05 12:43:21 +03:00
parent 323c5a714f
commit 5779680e1d
2 changed files with 9 additions and 4 deletions

View file

@ -49,12 +49,14 @@ namespace psemek::ui
state_t state_ = state_t::normal; state_t state_ = state_t::normal;
std::optional<geom::point<int, 2>> mouse_; std::optional<geom::point<int, 2>> mouse_;
std::optional<geom::interval<float>> drag_range_;
on_value_changed_callback callback_; on_value_changed_callback callback_;
void post_value_changed(); void post_value_changed();
int compute_value(int x) const; int compute_value(int x) const;
int compute_value(int x, geom::interval<float> const & range) const;
}; };
} }

View file

@ -25,7 +25,7 @@ namespace psemek::ui
break; break;
case state_t::mousedown: case state_t::mousedown:
if (mouse_) if (mouse_)
set_value(compute_value((*mouse_)[0])); set_value(compute_value((*mouse_)[0], *drag_range_));
break; break;
} }
@ -44,7 +44,10 @@ namespace psemek::ui
{ {
state_ = state_t::mousedown; state_ = state_t::mousedown;
if (mouse_) if (mouse_)
set_value(compute_value((*mouse_)[0])); {
drag_range_ = slider_range();
set_value(compute_value((*mouse_)[0], *drag_range_));
}
on_state_changed(state_t::mouseover); on_state_changed(state_t::mouseover);
return true; return true;
} }
@ -56,6 +59,7 @@ namespace psemek::ui
state_ = state_t::mouseover; state_ = state_t::mouseover;
else else
state_ = state_t::normal; state_ = state_t::normal;
drag_range_ = std::nullopt;
on_state_changed(state_t::mousedown); on_state_changed(state_t::mousedown);
return true; return true;
} }
@ -116,9 +120,8 @@ namespace psemek::ui
}); });
} }
int slider::compute_value(int x) const int slider::compute_value(int x, geom::interval<float> const & range) const
{ {
auto const range = slider_range();
return std::round(geom::unlerp(range, x * 1.f) * value_range_.length()) + value_range_.min; return std::round(geom::unlerp(range, x * 1.f) * value_range_.length()) + value_range_.min;
} }