Fix ui::slider behavior if reshape occurs while user is changing value
This commit is contained in:
parent
323c5a714f
commit
5779680e1d
2 changed files with 9 additions and 4 deletions
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue