Support ui::scroller preferred direction
This commit is contained in:
parent
75e6db45f1
commit
ad53fdd7a4
2 changed files with 34 additions and 20 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue