#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 ash {
class PaginationModel;
class ASH_PUBLIC_EXPORT PaginationController {
public:
enum ScrollAxis { SCROLL_AXIS_HORIZONTAL, SCROLL_AXIS_VERTICAL };
using RecordMetrics = base::RepeatingCallback<void(ui::EventType)>;
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_; }
bool OnScroll(const gfx::Vector2dF& offset, ui::EventType type);
bool OnGestureEvent(const ui::GestureEvent& event, const gfx::Rect& bounds);
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:
bool StartDrag(float scroll);
bool UpdateDrag(float scroll, const gfx::Rect& bounds);
bool EndDrag(const ui::LocatedEvent& event);
void SelectPageAndRecordMetric(int delta, ui::EventType type);
const raw_ptr<PaginationModel, ExperimentalAsh>
pagination_model_;
const ScrollAxis scroll_axis_;
const RecordMetrics record_metrics_;
};
}
#endif