From 21d6076f5c8e1496344794c5168e4e23dc7b04fa Mon Sep 17 00:00:00 2001 From: lisyarus Date: Tue, 20 Jul 2021 14:03:39 +0300 Subject: [PATCH] Support cyclic ui::slider --- libs/ui/include/psemek/ui/slider.hpp | 5 +++++ libs/ui/source/slider.cpp | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libs/ui/include/psemek/ui/slider.hpp b/libs/ui/include/psemek/ui/slider.hpp index 27fdd8a7..00ef3528 100644 --- a/libs/ui/include/psemek/ui/slider.hpp +++ b/libs/ui/include/psemek/ui/slider.hpp @@ -20,6 +20,9 @@ namespace psemek::ui virtual int value() const { return value_; } 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 on_value_changed(on_value_changed_callback callback); @@ -42,6 +45,8 @@ namespace psemek::ui geom::interval value_range_{0, 100}; int value_ = 0; + bool cyclic_ = false; + state_t state_ = state_t::normal; std::optional> mouse_; diff --git a/libs/ui/source/slider.cpp b/libs/ui/source/slider.cpp index 25adf4f3..18204d55 100644 --- a/libs/ui/source/slider.cpp +++ b/libs/ui/source/slider.cpp @@ -85,7 +85,10 @@ namespace psemek::ui 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) { value_ = v;