From 5779680e1d142b3bccbd9a05adf14b3115b829cc Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 5 Feb 2022 12:43:21 +0300 Subject: [PATCH] Fix ui::slider behavior if reshape occurs while user is changing value --- libs/ui/include/psemek/ui/slider.hpp | 2 ++ libs/ui/source/slider.cpp | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libs/ui/include/psemek/ui/slider.hpp b/libs/ui/include/psemek/ui/slider.hpp index 00ef3528..0669d5db 100644 --- a/libs/ui/include/psemek/ui/slider.hpp +++ b/libs/ui/include/psemek/ui/slider.hpp @@ -49,12 +49,14 @@ namespace psemek::ui state_t state_ = state_t::normal; std::optional> mouse_; + std::optional> drag_range_; on_value_changed_callback callback_; void post_value_changed(); int compute_value(int x) const; + int compute_value(int x, geom::interval const & range) const; }; } diff --git a/libs/ui/source/slider.cpp b/libs/ui/source/slider.cpp index 18204d55..ec440bef 100644 --- a/libs/ui/source/slider.cpp +++ b/libs/ui/source/slider.cpp @@ -25,7 +25,7 @@ namespace psemek::ui break; case state_t::mousedown: if (mouse_) - set_value(compute_value((*mouse_)[0])); + set_value(compute_value((*mouse_)[0], *drag_range_)); break; } @@ -44,7 +44,10 @@ namespace psemek::ui { state_ = state_t::mousedown; 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); return true; } @@ -56,6 +59,7 @@ namespace psemek::ui state_ = state_t::mouseover; else state_ = state_t::normal; + drag_range_ = std::nullopt; on_state_changed(state_t::mousedown); return true; } @@ -116,9 +120,8 @@ namespace psemek::ui }); } - int slider::compute_value(int x) const + int slider::compute_value(int x, geom::interval const & range) const { - auto const range = slider_range(); return std::round(geom::unlerp(range, x * 1.f) * value_range_.length()) + value_range_.min; }