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);
|
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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue