aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/controls')
-rw-r--r--src/ui/controls/scroll_control.cpp23
-rw-r--r--src/ui/controls/scroll_control.hpp4
2 files changed, 26 insertions, 1 deletions
diff --git a/src/ui/controls/scroll_control.cpp b/src/ui/controls/scroll_control.cpp
index 103a5c20..aa5403d4 100644
--- a/src/ui/controls/scroll_control.cpp
+++ b/src/ui/controls/scroll_control.cpp
@@ -308,6 +308,29 @@ namespace cru::ui::controls
}
}
+ void ScrollControl::OnMouseWheelCore(events::MouseWheelEventArgs& args)
+ {
+ Control::OnMouseWheelCore(args);
+
+ constexpr const auto view_delta = 30.0f;
+
+ if (args.GetDelta() == 0.0f)
+ return;
+
+ const auto content_rect = GetRect(RectRange::Content);
+ if (IsVerticalScrollEnabled() && GetScrollOffsetY() != (args.GetDelta() > 0.0f ? 0.0f : AtLeast0(GetViewHeight() - content_rect.height)))
+ {
+ SetScrollOffset(std::nullopt, GetScrollOffsetY() - args.GetDelta() / WHEEL_DELTA * view_delta);
+ return;
+ }
+
+ if (IsHorizontalScrollEnabled() && GetScrollOffsetX() != (args.GetDelta() > 0.0f ? 0.0f : AtLeast0(GetViewWidth() - content_rect.width)))
+ {
+ SetScrollOffset(GetScrollOffsetX() - args.GetDelta() / WHEEL_DELTA * view_delta, std::nullopt);
+ return;
+ }
+ }
+
void ScrollControl::CoerceAndSetOffsets(const float offset_x, const float offset_y, const bool update_children)
{
const auto old_offset_x = offset_x_;
diff --git a/src/ui/controls/scroll_control.hpp b/src/ui/controls/scroll_control.hpp
index 76762f21..0541a010 100644
--- a/src/ui/controls/scroll_control.hpp
+++ b/src/ui/controls/scroll_control.hpp
@@ -16,7 +16,7 @@ namespace cru::ui::controls
// Done: Draw(no need)
// Done: API
// Done: ScrollBar
- // TODO: MouseEvent
+ // Done: MouseEvent
class ScrollControl : public Control
{
private:
@@ -128,6 +128,8 @@ namespace cru::ui::controls
void OnMouseMoveCore(events::MouseEventArgs& args) override final;
void OnMouseUpCore(events::MouseButtonEventArgs& args) override final;
+ void OnMouseWheelCore(events::MouseWheelEventArgs& args) override;
+
private:
void CoerceAndSetOffsets(float offset_x, float offset_y, bool update_children = true);
void UpdateScrollBarVisibility();