Index: ui/touch_selection/touch_selection_controller.h |
diff --git a/ui/touch_selection/touch_selection_controller.h b/ui/touch_selection/touch_selection_controller.h |
index 4161e770790ac5a972537cf6964526ca8f29f185..b31843680291dcb9f7e1a57dd758b9e73d55ef12 100644 |
--- a/ui/touch_selection/touch_selection_controller.h |
+++ b/ui/touch_selection/touch_selection_controller.h |
@@ -5,9 +5,12 @@ |
#ifndef UI_TOUCH_SELECTION_TOUCH_SELECTION_CONTROLLER_H_ |
#define UI_TOUCH_SELECTION_TOUCH_SELECTION_CONTROLLER_H_ |
+#include "base/time/time.h" |
#include "ui/base/touch/selection_bound.h" |
#include "ui/gfx/geometry/point_f.h" |
#include "ui/gfx/geometry/rect_f.h" |
+#include "ui/gfx/geometry/vector2d_f.h" |
+#include "ui/touch_selection/longpress_drag_selector.h" |
#include "ui/touch_selection/selection_event_type.h" |
#include "ui/touch_selection/touch_handle.h" |
#include "ui/touch_selection/touch_handle_orientation.h" |
@@ -34,7 +37,8 @@ class UI_TOUCH_SELECTION_EXPORT TouchSelectionControllerClient { |
// Controller for manipulating text selection via touch input. |
class UI_TOUCH_SELECTION_EXPORT TouchSelectionController |
- : public TouchHandleClient { |
+ : public TouchHandleClient, |
+ public LongPressDragSelectorClient { |
public: |
enum ActiveStatus { |
INACTIVE, |
@@ -42,10 +46,27 @@ class UI_TOUCH_SELECTION_EXPORT TouchSelectionController |
SELECTION_ACTIVE, |
}; |
+ struct UI_TOUCH_SELECTION_EXPORT Config { |
+ Config(); |
+ ~Config(); |
+ |
+ // Defaults to 100 ms. |
+ base::TimeDelta tap_timeout; |
+ |
+ // Defaults to 8 DIPs. |
+ float tap_slop; |
+ |
+ // Controls whether drag selection after a longpress is enabled. |
+ // Defaults to false. |
+ bool enable_longpress_drag_selection; |
+ |
+ // Controls whether an insertion handle is shown on a tap for an empty |
+ // editable text. Defauls to false. |
+ bool show_on_tap_for_empty_editable; |
+ }; |
+ |
TouchSelectionController(TouchSelectionControllerClient* client, |
- base::TimeDelta tap_timeout, |
- float tap_slop, |
- bool show_on_tap_for_empty_editable); |
+ const Config& config); |
~TouchSelectionController() override; |
// To be called when the selection bounds have changed. |
@@ -65,7 +86,8 @@ class UI_TOUCH_SELECTION_EXPORT TouchSelectionController |
// To be called before forwarding a longpress event. This allows automatically |
// showing the selection or insertion handles from subsequent bounds changes. |
- bool WillHandleLongPressEvent(const gfx::PointF& location); |
+ bool WillHandleLongPressEvent(base::TimeTicks event_time, |
+ const gfx::PointF& location); |
// Allow showing the selection handles from the most recent selection bounds |
// update (if valid), or a future valid bounds update. |
@@ -109,18 +131,26 @@ class UI_TOUCH_SELECTION_EXPORT TouchSelectionController |
ActiveStatus active_status() const { return active_status_; } |
private: |
+ friend class TouchSelectionControllerTestApi; |
+ |
enum InputEventType { TAP, LONG_PRESS, INPUT_EVENT_TYPE_NONE }; |
// TouchHandleClient implementation. |
- void OnHandleDragBegin(const TouchHandle& handle) override; |
- void OnHandleDragUpdate(const TouchHandle& handle, |
- const gfx::PointF& new_position) override; |
- void OnHandleDragEnd(const TouchHandle& handle) override; |
+ void OnDragBegin(const TouchSelectionDraggable& draggable, |
+ const gfx::PointF& drag_position) override; |
+ void OnDragUpdate(const TouchSelectionDraggable& draggable, |
+ const gfx::PointF& drag_position) override; |
+ void OnDragEnd(const TouchSelectionDraggable& draggable) override; |
+ bool IsWithinTapSlop(const gfx::Vector2dF& delta) const override; |
void OnHandleTapped(const TouchHandle& handle) override; |
void SetNeedsAnimate() override; |
scoped_ptr<TouchHandleDrawable> CreateDrawable() override; |
base::TimeDelta GetTapTimeout() const override; |
- float GetTapSlop() const override; |
+ |
+ // LongPressDragSelectorClient implementation. |
+ void OnLongPressDragActiveStateChanged() override; |
+ gfx::PointF GetSelectionStart() const override; |
+ gfx::PointF GetSelectionEnd() const override; |
void ShowInsertionHandleAutomatically(); |
void ShowSelectionHandlesAutomatically(); |
@@ -137,6 +167,10 @@ class UI_TOUCH_SELECTION_EXPORT TouchSelectionController |
void DeactivateSelection(); |
void ForceNextUpdateIfInactive(); |
+ bool WillHandleTouchEventForLongPressDrag(const MotionEvent& event); |
+ void SetTemporarilyHiddenForLongPressDrag(bool hidden); |
+ void RefreshHandleVisibility(); |
+ |
gfx::Vector2dF GetStartLineOffset() const; |
gfx::Vector2dF GetEndLineOffset() const; |
bool GetStartVisible() const; |
@@ -146,17 +180,12 @@ class UI_TOUCH_SELECTION_EXPORT TouchSelectionController |
void LogSelectionEnd(); |
TouchSelectionControllerClient* const client_; |
- const base::TimeDelta tap_timeout_; |
- const float tap_slop_; |
+ const Config config_; |
// Whether to force an update on the next selection event even if the |
// cached selection matches the new selection. |
bool force_next_update_; |
- // Controls whether an insertion handle is shown on a tap for an empty |
- // editable text. |
- bool show_on_tap_for_empty_editable_; |
- |
InputEventType response_pending_input_event_; |
SelectionBound start_; |
@@ -178,6 +207,15 @@ class UI_TOUCH_SELECTION_EXPORT TouchSelectionController |
bool temporarily_hidden_; |
+ // Whether to use the start bound (if false, the end bound) for computing the |
+ // appropriate text line offset when performing a selection drag. This helps |
+ // ensure that the initial selection induced by the drag doesn't "jump" |
+ // between lines. |
+ bool anchor_drag_to_selection_start_; |
+ |
+ // Longpress drag allows direct manipulation of longpress-initiated selection. |
+ LongPressDragSelector longpress_drag_selector_; |
+ |
base::TimeTicks selection_start_time_; |
// Whether a selection handle was dragged during the current 'selection |
// session' - i.e. since the current selection has been activated. |