Support cyclic ui::slider

This commit is contained in:
Nikita Lisitsa 2021-07-20 14:03:39 +03:00
parent 5f70c61723
commit 21d6076f5c
2 changed files with 9 additions and 1 deletions

View file

@ -20,6 +20,9 @@ namespace psemek::ui
virtual int value() const { return value_; } virtual int value() const { return value_; }
virtual void set_value(int v, bool notify = true); virtual void set_value(int v, bool notify = true);
virtual bool cyclic() const { return cyclic_; }
virtual void set_cyclic(bool cyclic) { cyclic_ = cyclic; }
using on_value_changed_callback = std::function<void(int)>; using on_value_changed_callback = std::function<void(int)>;
void on_value_changed(on_value_changed_callback callback); void on_value_changed(on_value_changed_callback callback);
@ -42,6 +45,8 @@ namespace psemek::ui
geom::interval<int> value_range_{0, 100}; geom::interval<int> value_range_{0, 100};
int value_ = 0; int value_ = 0;
bool cyclic_ = false;
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_;

View file

@ -85,7 +85,10 @@ namespace psemek::ui
void slider::set_value(int v, bool notify) void slider::set_value(int v, bool notify)
{ {
v = geom::clamp(v, value_range_); if (cyclic_)
v = geom::imod(v - value_range_.min, value_range_.length()) + value_range_.min;
else
v = geom::clamp(v, value_range_);
if (value_ != v) if (value_ != v)
{ {
value_ = v; value_ = v;