| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef UI_EVENTS_GESTURE_DETECTION_SNAP_SCROLL_CONTROLLER_H_ |
| #define UI_EVENTS_GESTURE_DETECTION_SNAP_SCROLL_CONTROLLER_H_ |
| |
| #include "base/macros.h" |
| #include "ui/events/gesture_detection/gesture_detection_export.h" |
| #include "ui/gfx/geometry/point_f.h" |
| #include "ui/gfx/geometry/size_f.h" |
| #include "ui/gfx/geometry/vector2d_f.h" |
| |
| namespace ui { |
| |
| class MotionEvent; |
| |
| // Port of SnapScrollController.java from Chromium |
| // Controls the scroll snapping behavior based on scroll updates. |
| class GESTURE_DETECTION_EXPORT SnapScrollController { |
| public: |
| SnapScrollController(float snap_bound, const gfx::SizeF& display_size); |
| ~SnapScrollController(); |
| |
| // Sets the snap scroll mode based on the event type. |
| void SetSnapScrollMode(const MotionEvent& event, |
| bool is_scale_gesture_detection_in_progress); |
| |
| // Updates the snap scroll mode based on the given X and Y distance to be |
| // moved on scroll. If the scroll update is above a threshold, the snapping |
| // behavior is reset. |
| void UpdateSnapScrollMode(float distance_x, float distance_y); |
| |
| bool IsSnapVertical() const; |
| bool IsSnapHorizontal() const; |
| bool IsSnappingScrolls() const; |
| |
| private: |
| enum SnapMode { SNAP_NONE, SNAP_PENDING, SNAP_HORIZ, SNAP_VERT }; |
| |
| const float snap_bound_; |
| const float channel_distance_; |
| SnapMode mode_; |
| gfx::PointF down_position_; |
| gfx::Vector2dF accumulated_distance_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SnapScrollController); |
| }; |
| |
| } // namespace ui |
| |
| #endif // UI_EVENTS_GESTURE_DETECTION_SNAP_SCROLL_CONTROLLER_H_ |