1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77

ash / public / cpp / pagination / pagination_controller.h [blame]

// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_PUBLIC_CPP_PAGINATION_PAGINATION_CONTROLLER_H_
#define ASH_PUBLIC_CPP_PAGINATION_PAGINATION_CONTROLLER_H_

#include "ash/public/cpp/ash_public_export.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "ui/events/event.h"
#include "ui/events/types/event_type.h"

namespace gfx {
class Vector2dF;
class Rect;
}  // namespace gfx

namespace ash {

class PaginationModel;
// Receives user scroll events from various sources (mouse wheel, touchpad,
// touch gestures) and manipulates a PaginationModel as necessary.
class ASH_PUBLIC_EXPORT PaginationController {
 public:
  enum ScrollAxis { SCROLL_AXIS_HORIZONTAL, SCROLL_AXIS_VERTICAL };

  using RecordMetrics = base::RepeatingCallback<void(ui::EventType)>;

  // Creates a PaginationController. Does not take ownership of |model|. The
  // |model| is required to outlive this PaginationController. |scroll_axis|
  // specifies the axis in which the pages will scroll.
  PaginationController(PaginationModel* model,
                       ScrollAxis scroll_axis,
                       const RecordMetrics& record_metrics);

  PaginationController(const PaginationController&) = delete;
  PaginationController& operator=(const PaginationController&) = delete;

  ~PaginationController();

  ScrollAxis scroll_axis() const { return scroll_axis_; }

  // Handles a mouse wheel or touchpad scroll event in the area represented by
  // the PaginationModel. |offset| is the number of units scrolled in each axis.
  // Returns true if the event was captured and there was some room to scroll.
  bool OnScroll(const gfx::Vector2dF& offset, ui::EventType type);

  // Handles a touch gesture event in the area represented by the
  // PaginationModel. Returns true if the event was captured.
  bool OnGestureEvent(const ui::GestureEvent& event, const gfx::Rect& bounds);

  // Handles a mouse event in the area represented by the PaginationModel.
  // |drag_offset| should be in screen coordinates.
  void StartMouseDrag(const gfx::Vector2dF& drag_offset);
  void UpdateMouseDrag(const gfx::Vector2dF& drag_offset,
                       const gfx::Rect& bounds);
  void EndMouseDrag(const ui::MouseEvent& event);

 private:
  // Drag related functions. Utilized by both gesture drag and mouse drag:
  bool StartDrag(float scroll);
  bool UpdateDrag(float scroll, const gfx::Rect& bounds);
  bool EndDrag(const ui::LocatedEvent& event);

  // Helper function to change the page and callback record_metrics_.
  void SelectPageAndRecordMetric(int delta, ui::EventType type);

  const raw_ptr<PaginationModel> pagination_model_;  // Not owned.
  const ScrollAxis scroll_axis_;

  const RecordMetrics record_metrics_;
};

}  // namespace ash

#endif  // ASH_PUBLIC_CPP_PAGINATION_PAGINATION_CONTROLLER_H_