From ad53fdd7a4450b1971fbe94a14814634a48bf9b5 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 7 Mar 2022 01:13:13 +0300 Subject: [PATCH] Support ui::scroller preferred direction --- libs/ui/include/psemek/ui/scroller.hpp | 11 +++++++ libs/ui/source/scroller.cpp | 43 ++++++++++++++------------ 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/libs/ui/include/psemek/ui/scroller.hpp b/libs/ui/include/psemek/ui/scroller.hpp index 32bb5b87..debcc3bb 100644 --- a/libs/ui/include/psemek/ui/scroller.hpp +++ b/libs/ui/include/psemek/ui/scroller.hpp @@ -13,6 +13,15 @@ namespace psemek::ui virtual std::shared_ptr set_child(std::shared_ptr 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> mouse_; + direction preferred_direction_ = direction::vertical; + bool horizontal_ = false; bool vertical_ = true; diff --git a/libs/ui/source/scroller.cpp b/libs/ui/source/scroller.cpp index 635afb73..6487d4b4 100644 --- a/libs/ui/source/scroller.cpp +++ b/libs/ui/source/scroller.cpp @@ -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 delta = {0.f, 0.f}; - if (vertical_scroll() && !horizontal_scroll()) + auto pos = geom::cast(*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(*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();