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;
std::optional<geom::point<int, 2>> mouse_;
std::optional<geom::interval<float>> drag_range_;
on_value_changed_callback callback_;
void post_value_changed();
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;
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<float> const & range) const
{
auto const range = slider_range();
return std::round(geom::unlerp(range, x * 1.f) * value_range_.length()) + value_range_.min;
}