Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(730)

Unified Diff: content/browser/renderer_host/input/touch_handle.cc

Issue 759433002: Reland: Move TouchSelectionController from content to ui (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Excluded ui/touch_selection from Windows GN build Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/input/touch_handle.cc
diff --git a/content/browser/renderer_host/input/touch_handle.cc b/content/browser/renderer_host/input/touch_handle.cc
deleted file mode 100644
index 2e247e6cdde9259cad4d185d4d44f06eaf0d1a98..0000000000000000000000000000000000000000
--- a/content/browser/renderer_host/input/touch_handle.cc
+++ /dev/null
@@ -1,264 +0,0 @@
-// 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.
-
-#include "content/browser/renderer_host/input/touch_handle.h"
-
-#include <cmath>
-
-namespace content {
-
-namespace {
-
-// Maximum duration of a fade sequence.
-const double kFadeDurationMs = 200;
-
-// Maximum amount of travel for a fade sequence. This avoids handle "ghosting"
-// when the handle is moving rapidly while the fade is active.
-const double kFadeDistanceSquared = 20.f * 20.f;
-
-// Avoid using an empty touch rect, as it may fail the intersection test event
-// if it lies within the other rect's bounds.
-const float kMinTouchMajorForHitTesting = 1.f;
-
-// The maximum touch size to use when computing whether a touch point is
-// targetting a touch handle. This is necessary for devices that misreport
-// touch radii, preventing inappropriately largely touch sizes from completely
-// breaking handle dragging behavior.
-const float kMaxTouchMajorForHitTesting = 36.f;
-
-} // namespace
-
-// Responsible for rendering a selection or insertion handle for text editing.
-TouchHandle::TouchHandle(TouchHandleClient* client,
- TouchHandleOrientation orientation)
- : drawable_(client->CreateDrawable()),
- client_(client),
- orientation_(orientation),
- deferred_orientation_(TOUCH_HANDLE_ORIENTATION_UNDEFINED),
- alpha_(0.f),
- animate_deferred_fade_(false),
- enabled_(true),
- is_visible_(false),
- is_dragging_(false),
- is_drag_within_tap_region_(false) {
- DCHECK_NE(orientation, TOUCH_HANDLE_ORIENTATION_UNDEFINED);
- drawable_->SetEnabled(enabled_);
- drawable_->SetOrientation(orientation_);
- drawable_->SetAlpha(alpha_);
- drawable_->SetFocus(position_);
-}
-
-TouchHandle::~TouchHandle() {
-}
-
-void TouchHandle::SetEnabled(bool enabled) {
- if (enabled_ == enabled)
- return;
- if (!enabled) {
- EndDrag();
- EndFade();
- }
- enabled_ = enabled;
- drawable_->SetEnabled(enabled);
-}
-
-void TouchHandle::SetVisible(bool visible, AnimationStyle animation_style) {
- DCHECK(enabled_);
- if (is_visible_ == visible)
- return;
-
- is_visible_ = visible;
-
- // Handle repositioning may have been deferred while previously invisible.
- if (visible)
- drawable_->SetFocus(position_);
-
- bool animate = animation_style != ANIMATION_NONE;
- if (is_dragging_) {
- animate_deferred_fade_ = animate;
- return;
- }
-
- if (animate)
- BeginFade();
- else
- EndFade();
-}
-
-void TouchHandle::SetPosition(const gfx::PointF& position) {
- DCHECK(enabled_);
- if (position_ == position)
- return;
- position_ = position;
- // Suppress repositioning a handle while invisible or fading out to prevent it
- // from "ghosting" outside the visible bounds. The position will be pushed to
- // the drawable when the handle regains visibility (see |SetVisible()|).
- if (is_visible_)
- drawable_->SetFocus(position_);
-}
-
-void TouchHandle::SetOrientation(TouchHandleOrientation orientation) {
- DCHECK(enabled_);
- DCHECK_NE(orientation, TOUCH_HANDLE_ORIENTATION_UNDEFINED);
- if (is_dragging_) {
- deferred_orientation_ = orientation;
- return;
- }
- DCHECK_EQ(deferred_orientation_, TOUCH_HANDLE_ORIENTATION_UNDEFINED);
- if (orientation_ == orientation)
- return;
-
- orientation_ = orientation;
- drawable_->SetOrientation(orientation);
-}
-
-bool TouchHandle::WillHandleTouchEvent(const ui::MotionEvent& event) {
- if (!enabled_)
- return false;
-
- if (!is_dragging_ && event.GetAction() != ui::MotionEvent::ACTION_DOWN)
- return false;
-
- switch (event.GetAction()) {
- case ui::MotionEvent::ACTION_DOWN: {
- if (!is_visible_)
- return false;
- const float touch_size = std::max(
- kMinTouchMajorForHitTesting,
- std::min(kMaxTouchMajorForHitTesting, event.GetTouchMajor()));
- const gfx::RectF touch_rect(event.GetX() - touch_size * .5f,
- event.GetY() - touch_size * .5f,
- touch_size,
- touch_size);
- if (!drawable_->IntersectsWith(touch_rect))
- return false;
- touch_down_position_ = gfx::PointF(event.GetX(), event.GetY());
- touch_to_focus_offset_ = position_ - touch_down_position_;
- touch_down_time_ = event.GetEventTime();
- BeginDrag();
- } break;
-
- case ui::MotionEvent::ACTION_MOVE: {
- gfx::PointF touch_move_position(event.GetX(), event.GetY());
- if (is_drag_within_tap_region_) {
- const float tap_slop = client_->GetTapSlop();
- is_drag_within_tap_region_ =
- (touch_move_position - touch_down_position_).LengthSquared() <
- tap_slop * tap_slop;
- }
-
- // Note that we signal drag update even if we're inside the tap region,
- // as there are cases where characters are narrower than the slop length.
- client_->OnHandleDragUpdate(*this,
- touch_move_position + touch_to_focus_offset_);
- } break;
-
- case ui::MotionEvent::ACTION_UP: {
- if (is_drag_within_tap_region_ &&
- (event.GetEventTime() - touch_down_time_) <
- client_->GetTapTimeout()) {
- client_->OnHandleTapped(*this);
- }
-
- EndDrag();
- } break;
-
- case ui::MotionEvent::ACTION_CANCEL:
- EndDrag();
- break;
-
- default:
- break;
- };
- return true;
-}
-
-bool TouchHandle::Animate(base::TimeTicks frame_time) {
- if (fade_end_time_ == base::TimeTicks())
- return false;
-
- DCHECK(enabled_);
-
- float time_u =
- 1.f - (fade_end_time_ - frame_time).InMillisecondsF() / kFadeDurationMs;
- float position_u =
- (position_ - fade_start_position_).LengthSquared() / kFadeDistanceSquared;
- float u = std::max(time_u, position_u);
- SetAlpha(is_visible_ ? u : 1.f - u);
-
- if (u >= 1.f) {
- EndFade();
- return false;
- }
-
- return true;
-}
-
-void TouchHandle::BeginDrag() {
- DCHECK(enabled_);
- if (is_dragging_)
- return;
- EndFade();
- is_dragging_ = true;
- is_drag_within_tap_region_ = true;
- client_->OnHandleDragBegin(*this);
-}
-
-void TouchHandle::EndDrag() {
- DCHECK(enabled_);
- if (!is_dragging_)
- return;
-
- is_dragging_ = false;
- is_drag_within_tap_region_ = false;
- client_->OnHandleDragEnd(*this);
-
- if (deferred_orientation_ != TOUCH_HANDLE_ORIENTATION_UNDEFINED) {
- TouchHandleOrientation deferred_orientation = deferred_orientation_;
- deferred_orientation_ = TOUCH_HANDLE_ORIENTATION_UNDEFINED;
- SetOrientation(deferred_orientation);
- }
-
- if (animate_deferred_fade_) {
- BeginFade();
- } else {
- // As drawable visibility assignment is deferred while dragging, push the
- // change by forcing fade completion.
- EndFade();
- }
-}
-
-void TouchHandle::BeginFade() {
- DCHECK(enabled_);
- DCHECK(!is_dragging_);
- animate_deferred_fade_ = false;
- const float target_alpha = is_visible_ ? 1.f : 0.f;
- if (target_alpha == alpha_) {
- EndFade();
- return;
- }
-
- fade_end_time_ = base::TimeTicks::Now() +
- base::TimeDelta::FromMillisecondsD(
- kFadeDurationMs * std::abs(target_alpha - alpha_));
- fade_start_position_ = position_;
- client_->SetNeedsAnimate();
-}
-
-void TouchHandle::EndFade() {
- DCHECK(enabled_);
- animate_deferred_fade_ = false;
- fade_end_time_ = base::TimeTicks();
- SetAlpha(is_visible_ ? 1.f : 0.f);
-}
-
-void TouchHandle::SetAlpha(float alpha) {
- alpha = std::max(0.f, std::min(1.f, alpha));
- if (alpha_ == alpha)
- return;
- alpha_ = alpha;
- drawable_->SetAlpha(alpha);
-}
-
-} // namespace content
« no previous file with comments | « content/browser/renderer_host/input/touch_handle.h ('k') | content/browser/renderer_host/input/touch_handle_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698