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); 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_horizontal_scroll(bool enabled);
virtual bool set_vertical_scroll(bool enabled); virtual bool set_vertical_scroll(bool enabled);
@ -57,6 +66,8 @@ namespace psemek::ui
box_shape shape_; box_shape shape_;
std::optional<geom::point<int, 2>> mouse_; std::optional<geom::point<int, 2>> mouse_;
direction preferred_direction_ = direction::vertical;
bool horizontal_ = false; bool horizontal_ = false;
bool vertical_ = true; bool vertical_ = true;

View file

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