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

Side by Side Diff: ui/views/view_targeter.cc

Issue 481433006: Support targeting for gestures in ViewTargeter (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: whitespace Created 6 years, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/view_targeter.h" 5 #include "ui/views/view_targeter.h"
6 6
7 #include "ui/events/event_target.h" 7 #include "ui/events/event_target.h"
8 #include "ui/views/focus/focus_manager.h" 8 #include "ui/views/focus/focus_manager.h"
9 #include "ui/views/view.h" 9 #include "ui/views/view.h"
10 #include "ui/views/view_targeter_delegate.h" 10 #include "ui/views/view_targeter_delegate.h"
11 #include "ui/views/views_switches.h"
12 #include "ui/views/widget/root_view.h"
13 #include "ui/views/widget/widget.h"
11 14
12 namespace views { 15 namespace views {
13 16
14 ViewTargeter::ViewTargeter(ViewTargeterDelegate* delegate) 17 ViewTargeter::ViewTargeter(ViewTargeterDelegate* delegate)
15 : delegate_(delegate) { 18 : delegate_(delegate) {
16 DCHECK(delegate_); 19 DCHECK(delegate_);
17 } 20 }
18 21
19 ViewTargeter::~ViewTargeter() {} 22 ViewTargeter::~ViewTargeter() {}
20 23
(...skipping 11 matching lines...) Expand all
32 View* view = static_cast<View*>(root); 35 View* view = static_cast<View*>(root);
33 36
34 if (event->IsKeyEvent()) 37 if (event->IsKeyEvent())
35 return FindTargetForKeyEvent(view, *static_cast<ui::KeyEvent*>(event)); 38 return FindTargetForKeyEvent(view, *static_cast<ui::KeyEvent*>(event));
36 39
37 if (event->IsScrollEvent()) { 40 if (event->IsScrollEvent()) {
38 return FindTargetForScrollEvent(view, 41 return FindTargetForScrollEvent(view,
39 *static_cast<ui::ScrollEvent*>(event)); 42 *static_cast<ui::ScrollEvent*>(event));
40 } 43 }
41 44
45 if (event->IsGestureEvent())
46 return FindTargetForGestureEvent(view, *(event->AsGestureEvent()));
47
42 NOTREACHED() << "ViewTargeter does not yet support this event type."; 48 NOTREACHED() << "ViewTargeter does not yet support this event type.";
43 return NULL; 49 return NULL;
44 } 50 }
45 51
46 ui::EventTarget* ViewTargeter::FindNextBestTarget( 52 ui::EventTarget* ViewTargeter::FindNextBestTarget(
47 ui::EventTarget* previous_target, 53 ui::EventTarget* previous_target,
48 ui::Event* event) { 54 ui::Event* event) {
55 if (!previous_target)
56 return NULL;
57
58 if (event->IsGestureEvent()) {
59 View* root =
60 static_cast<View*>(previous_target)->GetWidget()->GetRootView();
61 internal::RootView* root_view = static_cast<internal::RootView*>(root);
62
63 // If the default gesture handler was already established prior to |event|,
64 // only GESTURE_SCROLL_BEGIN events may be re-targeted.
65 if (root_view->dispatch_to_gesture_handler_ &&
66 event->type() != ui::ET_GESTURE_SCROLL_BEGIN) {
67 return NULL;
68 }
69
70 // If |gesture_handler_| is NULL, it is either because the view was removed
71 // from the tree by the previous dispatch of |event| or because |event| is
72 // the GESTURE_END event corresponding to the removal of the last touch
73 // point. In either case, no further re-targeting of |event| should be
74 // permitted.
75 if (!root_view->gesture_handler_)
76 return NULL;
77 }
78
49 return previous_target->GetParentTarget(); 79 return previous_target->GetParentTarget();
50 } 80 }
51 81
52 bool ViewTargeter::SubtreeCanAcceptEvent( 82 bool ViewTargeter::SubtreeCanAcceptEvent(
53 ui::EventTarget* target, 83 ui::EventTarget* target,
54 const ui::LocatedEvent& event) const { 84 const ui::LocatedEvent& event) const {
55 NOTREACHED(); 85 NOTREACHED();
56 return false; 86 return false;
57 } 87 }
58 88
59 bool ViewTargeter::EventLocationInsideBounds( 89 bool ViewTargeter::EventLocationInsideBounds(
60 ui::EventTarget* target, 90 ui::EventTarget* target,
61 const ui::LocatedEvent& event) const { 91 const ui::LocatedEvent& event) const {
62 NOTREACHED(); 92 NOTREACHED();
63 return false; 93 return false;
64 } 94 }
65 95
66 View* ViewTargeter::FindTargetForKeyEvent(View* root, const ui::KeyEvent& key) { 96 View* ViewTargeter::FindTargetForKeyEvent(View* root, const ui::KeyEvent& key) {
67 if (root->GetFocusManager()) 97 if (root->GetFocusManager())
68 return root->GetFocusManager()->GetFocusedView(); 98 return root->GetFocusManager()->GetFocusedView();
69 return NULL; 99 return NULL;
70 } 100 }
71 101
72 View* ViewTargeter::FindTargetForScrollEvent(View* root, 102 View* ViewTargeter::FindTargetForScrollEvent(View* root,
73 const ui::ScrollEvent& scroll) { 103 const ui::ScrollEvent& scroll) {
74 gfx::Rect rect(scroll.location(), gfx::Size(1, 1)); 104 gfx::Rect rect(scroll.location(), gfx::Size(1, 1));
75 return root->GetEffectiveViewTargeter()->TargetForRect(root, rect); 105 return root->GetEffectiveViewTargeter()->TargetForRect(root, rect);
76 } 106 }
77 107
108 View* ViewTargeter::FindTargetForGestureEvent(View* root,
109 const ui::GestureEvent& gesture) {
110 CHECK(!root->parent());
111 internal::RootView* root_view = static_cast<internal::RootView*>(root);
sadrul 2014/08/26 16:21:44 This is pretty ugly. How about have a RootViewTar
tdanderson 2014/08/26 20:21:14 Done.
112
113 // Return the default gesture handler if one is already set.
114 if (root_view->gesture_handler_) {
115 CHECK(root_view->dispatch_to_gesture_handler_);
116 return root_view->gesture_handler_;
117 }
118
119 // If rect-based targeting is enabled, use the gesture's bounding box to
120 // determine the target. Otherwise use the center point of the gesture's
121 // bounding box to determine the target.
122 gfx::Rect rect(gesture.location(), gfx::Size(1, 1));
123 if (views::switches::IsRectBasedTargetingEnabled() &&
124 !gesture.details().bounding_box().IsEmpty()) {
125 // TODO(tdanderson): Pass in the bounding box to GetEventHandlerForRect()
126 // once crbug.com/313392 is resolved.
127 rect = gfx::Rect(gesture.details().bounding_box());
128 rect.set_origin(gesture.location());
129 rect.Offset(-rect.width() / 2, -rect.height() / 2);
130 }
131
132 return root->GetEffectiveViewTargeter()->TargetForRect(root, rect);
133 }
134
78 } // namespace views 135 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698