59 lines
1 KiB
C++
59 lines
1 KiB
C++
#include <psemek/ui/spinbox.hpp>
|
|
|
|
namespace psemek::ui
|
|
{
|
|
|
|
void spinbox::set_value(int v, bool notify)
|
|
{
|
|
v = geom::clamp(v, value_range_);
|
|
if (v != value_)
|
|
{
|
|
value_ = v;
|
|
|
|
if (notify)
|
|
post_value_changed();
|
|
}
|
|
}
|
|
|
|
void spinbox::set_value_range(geom::interval<int> i)
|
|
{
|
|
value_range_ = i;
|
|
set_value(value_);
|
|
}
|
|
|
|
void spinbox::set_wrap(bool w)
|
|
{
|
|
wrap_ = w;
|
|
}
|
|
|
|
void spinbox::inc()
|
|
{
|
|
if (wrap_)
|
|
set_value(((value_ + 1 - value_range_.min) % (value_range_.length() + 1)) + value_range_.min);
|
|
else
|
|
set_value(value_ + 1);
|
|
}
|
|
|
|
void spinbox::dec()
|
|
{
|
|
int const range = value_range_.length() + 1;
|
|
if (wrap_)
|
|
set_value(((value_ + range - 1 - value_range_.min) % range) + value_range_.min);
|
|
else
|
|
set_value(value_ - 1);
|
|
}
|
|
|
|
void spinbox::on_value_changed(on_value_changed_callback callback, bool notify)
|
|
{
|
|
on_value_changed_ = std::move(callback);
|
|
if (notify)
|
|
post_value_changed();
|
|
}
|
|
|
|
void spinbox::post_value_changed()
|
|
{
|
|
if (on_value_changed_)
|
|
post([cb = on_value_changed_, v = value_]{ cb(v); });
|
|
}
|
|
|
|
}
|