Support ui::scroller preferred direction

This commit is contained in:
Nikita Lisitsa 2022-03-07 01:13:13 +03:00
parent 75e6db45f1
commit ad53fdd7a4
2 changed files with 34 additions and 20 deletions

View file

@ -13,6 +13,15 @@ namespace psemek::ui
virtual std::shared_ptr<element> set_child(std::shared_ptr<element> c);
enum class direction
{
horizontal,
vertical,
};
virtual direction preferred_direction() const { return preferred_direction_; }
virtual void set_preferred_direction(direction d);
virtual bool set_horizontal_scroll(bool enabled);
virtual bool set_vertical_scroll(bool enabled);
@ -57,6 +66,8 @@ namespace psemek::ui
box_shape shape_;
std::optional<geom::point<int, 2>> mouse_;
direction preferred_direction_ = direction::vertical;
bool horizontal_ = false;
bool vertical_ = true;

View file

@ -17,6 +17,11 @@ namespace psemek::ui
return old;
}
void scroller::set_preferred_direction(direction d)
{
preferred_direction_ = d;
}
bool scroller::set_horizontal_scroll(bool enabled)
{
std::swap(horizontal_, enabled);
@ -164,32 +169,30 @@ namespace psemek::ui
{
geom::vector<float, 2> delta = {0.f, 0.f};
if (vertical_scroll() && !horizontal_scroll())
auto pos = geom::cast<float>(*mouse_);
auto vcontains = geom::contains(vertical_box(), pos);
auto hcontains = geom::contains(horizontal_box(), pos);
if (vertical_scroll() && horizontal_scroll())
{
if (vcontains)
delta[1] = e.delta;
else if (hcontains)
delta[0] = e.delta;
else if (preferred_direction() == direction::vertical)
delta[1] = e.delta;
else
delta[0] = e.delta;
}
else if (vertical_scroll())
{
delta[1] = e.delta;
}
else if (!vertical_scroll() && horizontal_scroll())
else if (horizontal_scroll())
{
delta[0] = e.delta;
}
else
{
auto pos = geom::cast<float>(*mouse_);
if (horizontal_scroll())
{
if (geom::contains(horizontal_box(), pos))
{
delta[0] = e.delta;
}
}
if (vertical_scroll())
{
if (geom::contains(vertical_box(), pos))
delta[1] = e.delta;
}
}
shift_tgt_ += delta * 50.f;
clamp_shift();