OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "athena/util/drag_handle.h" | |
6 | |
7 #include "ui/views/background.h" | |
8 #include "ui/views/view.h" | |
9 | |
10 namespace athena { | |
11 namespace { | |
12 | |
13 const SkColor kDragHandleColorNormal = SK_ColorGRAY; | |
14 const SkColor kDragHandleColorHot = SK_ColorWHITE; | |
15 | |
16 // This view notifies its delegate of the touch scroll gestures performed on it. | |
17 class DragHandleView : public views::View { | |
18 public: | |
19 DragHandleView(DragHandleScrollDirection scroll_direction, | |
20 DragHandleScrollDelegate* delegate, | |
21 int preferred_width, | |
22 int preferred_height); | |
23 ~DragHandleView() override; | |
24 | |
25 private: | |
26 void SetColor(SkColor color); | |
27 | |
28 void SetIsScrolling(bool scrolling); | |
29 | |
30 // views::View: | |
31 virtual gfx::Size GetPreferredSize() const override; | |
32 virtual void OnGestureEvent(ui::GestureEvent* event) override; | |
33 | |
34 bool scroll_in_progress_; | |
35 DragHandleScrollDelegate* delegate_; | |
36 DragHandleScrollDirection scroll_direction_; | |
37 SkColor color_; | |
38 float scroll_start_location_; | |
39 const int preferred_width_; | |
40 const int preferred_height_; | |
41 | |
42 DISALLOW_COPY_AND_ASSIGN(DragHandleView); | |
43 }; | |
44 | |
45 DragHandleView::DragHandleView(DragHandleScrollDirection scroll_direction, | |
46 DragHandleScrollDelegate* delegate, | |
47 int preferred_width, | |
48 int preferred_height) | |
49 : scroll_in_progress_(false), | |
50 delegate_(delegate), | |
51 scroll_direction_(scroll_direction), | |
52 color_(SK_ColorTRANSPARENT), | |
53 preferred_width_(preferred_width), | |
54 preferred_height_(preferred_height) { | |
55 SetColor(kDragHandleColorNormal); | |
56 } | |
57 | |
58 DragHandleView::~DragHandleView() { | |
59 } | |
60 | |
61 void DragHandleView::SetColor(SkColor color) { | |
62 if (color_ == color) | |
63 return; | |
64 color_ = color; | |
65 set_background(views::Background::CreateSolidBackground(color_)); | |
66 SchedulePaint(); | |
67 } | |
68 | |
69 void DragHandleView::SetIsScrolling(bool scrolling) { | |
70 if (scroll_in_progress_ == scrolling) | |
71 return; | |
72 scroll_in_progress_ = scrolling; | |
73 if (!scroll_in_progress_) | |
74 scroll_start_location_ = 0; | |
75 } | |
76 | |
77 // views::View: | |
78 gfx::Size DragHandleView::GetPreferredSize() const { | |
79 return gfx::Size(preferred_width_, preferred_height_); | |
80 } | |
81 | |
82 void DragHandleView::OnGestureEvent(ui::GestureEvent* event) { | |
83 SkColor change_color = SK_ColorTRANSPARENT; | |
84 if (event->type() == ui::ET_GESTURE_BEGIN && | |
85 event->details().touch_points() == 1) { | |
86 change_color = kDragHandleColorHot; | |
87 } else if (event->type() == ui::ET_GESTURE_END && | |
88 event->details().touch_points() == 1) { | |
89 change_color = kDragHandleColorNormal; | |
90 } | |
91 | |
92 if (change_color != SK_ColorTRANSPARENT) { | |
93 SetColor(change_color); | |
94 event->SetHandled(); | |
95 return; | |
96 } | |
97 | |
98 if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN) { | |
99 if (scroll_in_progress_) | |
100 return; | |
101 float delta; | |
102 if (scroll_direction_ == DRAG_HANDLE_VERTICAL) { | |
103 delta = event->details().scroll_y_hint(); | |
104 scroll_start_location_ = event->root_location().y(); | |
105 } else { | |
106 delta = event->details().scroll_x_hint(); | |
107 scroll_start_location_ = event->root_location().x(); | |
108 } | |
109 delegate_->HandleScrollBegin(delta); | |
110 SetIsScrolling(true); | |
111 event->SetHandled(); | |
112 } else if (event->type() == ui::ET_GESTURE_SCROLL_END || | |
113 event->type() == ui::ET_SCROLL_FLING_START) { | |
114 if (!scroll_in_progress_) | |
115 return; | |
116 float velocity = 0.0f; | |
117 if (event->type() == ui::ET_SCROLL_FLING_START) | |
118 velocity = event->details().velocity_x(); | |
119 delegate_->HandleScrollEnd(velocity); | |
120 SetColor(kDragHandleColorNormal); | |
121 SetIsScrolling(false); | |
122 event->SetHandled(); | |
123 } else if (event->type() == ui::ET_GESTURE_SCROLL_UPDATE) { | |
124 if (!scroll_in_progress_) | |
125 return; | |
126 float delta = scroll_direction_ == DRAG_HANDLE_VERTICAL | |
127 ? event->root_location().y() - scroll_start_location_ | |
128 : event->root_location().x() - scroll_start_location_; | |
129 delegate_->HandleScrollUpdate(delta); | |
130 event->SetHandled(); | |
131 } | |
132 } | |
133 | |
134 } // namespace | |
135 | |
136 views::View* CreateDragHandleView(DragHandleScrollDirection scroll_direction, | |
137 DragHandleScrollDelegate* delegate, | |
138 int preferred_width, | |
139 int preferred_height) { | |
140 views::View* view = new DragHandleView( | |
141 scroll_direction, delegate, preferred_width, preferred_height); | |
142 return view; | |
143 } | |
144 | |
145 } // namespace athena | |
OLD | NEW |