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

Unified Diff: ui/touch_selection/touch_selection_controller.cc

Issue 481683003: Support for Adaptive Handle Orientation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 5 years, 2 months 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: ui/touch_selection/touch_selection_controller.cc
diff --git a/ui/touch_selection/touch_selection_controller.cc b/ui/touch_selection/touch_selection_controller.cc
index 28ddbe1743d77ba2524a1bfe73d2f649bb7f64a5..c98d485160c4be3aa4e05dc3c1195e0ddbd1b9cd 100644
--- a/ui/touch_selection/touch_selection_controller.cc
+++ b/ui/touch_selection/touch_selection_controller.cc
@@ -43,6 +43,7 @@ TouchHandleOrientation ToTouchHandleOrientation(SelectionBound::Type type) {
TouchSelectionController::Config::Config()
: max_tap_duration(base::TimeDelta::FromMilliseconds(300)),
tap_slop(8),
+ enable_adaptive_handle_orientation(false),
enable_longpress_drag_selection(false),
show_on_tap_for_empty_editable(false) {}
@@ -143,6 +144,32 @@ void TouchSelectionController::OnSelectionBoundsChanged(
HideAndDisallowShowingAutomatically();
}
+void TouchSelectionController::OnViewportChanged(
+ const gfx::RectF viewport_rect) {
+ // Trigger a force update if the viewport is changed, so that
+ // it triggers a call to change the mirror values if required.
+ if (viewport_rect_ == viewport_rect)
+ return;
+
+ viewport_rect_ = viewport_rect;
+
+ if (active_status_ == INACTIVE)
+ return;
+
+ if (active_status_ == INSERTION_ACTIVE) {
+ DCHECK(insertion_handle_);
+ insertion_handle_->SetViewportRect(viewport_rect);
+ } else if (active_status_ == SELECTION_ACTIVE) {
+ DCHECK(start_selection_handle_);
+ DCHECK(end_selection_handle_);
+ start_selection_handle_->SetViewportRect(viewport_rect);
+ end_selection_handle_->SetViewportRect(viewport_rect);
+ }
+
+ // Update handle layout after setting the new Viewport size.
+ UpdateHandleLayoutIfNecessary();
+}
+
bool TouchSelectionController::WillHandleTouchEvent(const MotionEvent& event) {
if (config_.enable_longpress_drag_selection &&
longpress_drag_selector_.WillHandleTouchEvent(event)) {
@@ -387,6 +414,10 @@ base::TimeDelta TouchSelectionController::GetMaxTapDuration() const {
return config_.max_tap_duration;
}
+bool TouchSelectionController::IsAdaptiveHandleOrientationEnabled() const {
+ return config_.enable_adaptive_handle_orientation;
+}
+
void TouchSelectionController::OnLongPressDragActiveStateChanged() {
// The handles should remain hidden for the duration of a longpress drag,
// including the time between a longpress and the start of drag motion.
@@ -447,8 +478,10 @@ void TouchSelectionController::OnInsertionChanged() {
const bool activated = ActivateInsertionIfNecessary();
const TouchHandle::AnimationStyle animation = GetAnimationStyle(!activated);
+ insertion_handle_->SetFocus(start_.edge_top(), start_.edge_bottom());
insertion_handle_->SetVisible(GetStartVisible(), animation);
- insertion_handle_->SetPosition(GetStartPosition());
+
+ UpdateHandleLayoutIfNecessary();
client_->OnSelectionEvent(activated ? INSERTION_HANDLE_SHOWN
: INSERTION_HANDLE_MOVED);
@@ -463,10 +496,17 @@ void TouchSelectionController::OnSelectionChanged() {
const bool activated = ActivateSelectionIfNecessary();
const TouchHandle::AnimationStyle animation = GetAnimationStyle(!activated);
+
+ start_selection_handle_->SetFocus(start_.edge_top(), start_.edge_bottom());
+ end_selection_handle_->SetFocus(end_.edge_top(), end_.edge_bottom());
+
+ start_selection_handle_->SetOrientation(start_orientation_);
+ end_selection_handle_->SetOrientation(end_orientation_);
+
start_selection_handle_->SetVisible(GetStartVisible(), animation);
end_selection_handle_->SetVisible(GetEndVisible(), animation);
- start_selection_handle_->SetPosition(GetStartPosition());
- end_selection_handle_->SetPosition(GetEndPosition());
+
+ UpdateHandleLayoutIfNecessary();
client_->OnSelectionEvent(activated ? SELECTION_HANDLES_SHOWN
: SELECTION_HANDLES_MOVED);
@@ -477,12 +517,13 @@ bool TouchSelectionController::ActivateInsertionIfNecessary() {
if (!insertion_handle_) {
insertion_handle_.reset(
- new TouchHandle(this, TouchHandleOrientation::CENTER));
+ new TouchHandle(this, TouchHandleOrientation::CENTER, viewport_rect_));
}
if (active_status_ == INACTIVE) {
active_status_ = INSERTION_ACTIVE;
insertion_handle_->SetEnabled(true);
+ insertion_handle_->SetViewportRect(viewport_rect_);
return true;
}
return false;
@@ -501,17 +542,19 @@ bool TouchSelectionController::ActivateSelectionIfNecessary() {
DCHECK_NE(INSERTION_ACTIVE, active_status_);
if (!start_selection_handle_) {
- start_selection_handle_.reset(new TouchHandle(this, start_orientation_));
+ start_selection_handle_.reset(
+ new TouchHandle(this, start_orientation_, viewport_rect_));
} else {
start_selection_handle_->SetEnabled(true);
- start_selection_handle_->SetOrientation(start_orientation_);
+ start_selection_handle_->SetViewportRect(viewport_rect_);
}
if (!end_selection_handle_) {
- end_selection_handle_.reset(new TouchHandle(this, end_orientation_));
+ end_selection_handle_.reset(
+ new TouchHandle(this, end_orientation_, viewport_rect_));
} else {
end_selection_handle_->SetEnabled(true);
- end_selection_handle_->SetOrientation(end_orientation_);
+ end_selection_handle_->SetViewportRect(viewport_rect_);
}
// As a long press received while a selection is already active may trigger
@@ -559,6 +602,18 @@ void TouchSelectionController::ForceNextUpdateIfInactive() {
}
}
+void TouchSelectionController::UpdateHandleLayoutIfNecessary() {
+ if (active_status_ == INSERTION_ACTIVE) {
+ DCHECK(insertion_handle_);
+ insertion_handle_->UpdateHandleLayout();
+ } else if (active_status_ == SELECTION_ACTIVE) {
+ DCHECK(start_selection_handle_);
+ DCHECK(end_selection_handle_);
+ start_selection_handle_->UpdateHandleLayout();
+ end_selection_handle_->UpdateHandleLayout();
+ }
+}
+
void TouchSelectionController::RefreshHandleVisibility() {
TouchHandle::AnimationStyle animation_style = GetAnimationStyle(true);
if (active_status_ == SELECTION_ACTIVE) {
@@ -567,6 +622,9 @@ void TouchSelectionController::RefreshHandleVisibility() {
}
if (active_status_ == INSERTION_ACTIVE)
insertion_handle_->SetVisible(GetStartVisible(), animation_style);
+
+ // Update handle layout if handle visibility is explicitly changed.
+ UpdateHandleLayoutIfNecessary();
}
gfx::Vector2dF TouchSelectionController::GetStartLineOffset() const {
« no previous file with comments | « ui/touch_selection/touch_selection_controller.h ('k') | ui/touch_selection/touch_selection_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698