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;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue