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

Side by Side Diff: athena/wm/window_overview_mode.cc

Issue 633623002: Handle transient children as a part of transient parent (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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 unified diff | Download patch
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 "athena/wm/window_overview_mode.h" 5 #include "athena/wm/window_overview_mode.h"
6 6
7 #include <algorithm> 7 #include <complex>
8 #include <functional>
9 #include <vector> 8 #include <vector>
10 9
11 #include "athena/wm/overview_toolbar.h" 10 #include "athena/wm/overview_toolbar.h"
12 #include "athena/wm/public/window_list_provider.h" 11 #include "athena/wm/public/window_list_provider.h"
13 #include "athena/wm/public/window_list_provider_observer.h" 12 #include "athena/wm/public/window_list_provider_observer.h"
14 #include "athena/wm/split_view_controller.h" 13 #include "athena/wm/split_view_controller.h"
15 #include "base/bind.h" 14 #include "base/bind.h"
16 #include "base/macros.h" 15 #include "base/memory/scoped_vector.h"
17 #include "ui/aura/scoped_window_targeter.h" 16 #include "ui/aura/scoped_window_targeter.h"
18 #include "ui/aura/window.h" 17 #include "ui/aura/window.h"
19 #include "ui/aura/window_delegate.h" 18 #include "ui/aura/window_delegate.h"
20 #include "ui/aura/window_property.h" 19 #include "ui/aura/window_property.h"
21 #include "ui/aura/window_targeter.h" 20 #include "ui/aura/window_targeter.h"
22 #include "ui/aura/window_tree_host.h" 21 #include "ui/aura/window_tree_host.h"
23 #include "ui/compositor/closure_animation_observer.h" 22 #include "ui/compositor/closure_animation_observer.h"
24 #include "ui/compositor/compositor.h" 23 #include "ui/compositor/compositor.h"
25 #include "ui/compositor/compositor_animation_observer.h" 24 #include "ui/compositor/compositor_animation_observer.h"
26 #include "ui/compositor/scoped_layer_animation_settings.h" 25 #include "ui/compositor/scoped_layer_animation_settings.h"
27 #include "ui/events/event_handler.h" 26 #include "ui/events/event_handler.h"
28 #include "ui/events/gestures/fling_curve.h" 27 #include "ui/events/gestures/fling_curve.h"
29 #include "ui/gfx/frame_time.h" 28 #include "ui/gfx/frame_time.h"
30 #include "ui/gfx/transform.h" 29 #include "ui/gfx/transform.h"
31 #include "ui/wm/core/shadow_types.h" 30 #include "ui/wm/core/shadow_types.h"
32 #include "ui/wm/core/window_animations.h" 31 #include "ui/wm/core/window_animations.h"
33 #include "ui/wm/core/window_util.h" 32 #include "ui/wm/core/window_util.h"
33 #include "ui/wm/public/activation_client.h"
34 34
35 namespace { 35 namespace {
36 36
37 const float kOverviewDefaultScale = 0.75f;
38
39 struct WindowOverviewState { 37 struct WindowOverviewState {
40 // The current overview state of the window. 0.f means the window is at the 38 // The current overview state of the window. 0.f means the window is at the
41 // topmost position. 1.f means the window is at the bottom-most position. 39 // topmost position. 1.f means the window is at the bottom-most position.
42 float progress; 40 float progress;
43 41
44 // The top-most and bottom-most vertical position of the window in overview 42 // The top-most and bottom-most vertical position of the window in overview
45 // mode. 43 // mode.
46 float max_y; 44 float max_y;
47 float min_y; 45 float min_y;
48 46
49 // |split| is set if this window is one of the two split windows in split-view 47 // |split| is set if this window is one of the two split windows in split-view
50 // mode. 48 // mode.
51 bool split; 49 bool split;
52 }; 50 };
53 51
54 } // namespace 52 } // namespace
55 53
56 DECLARE_WINDOW_PROPERTY_TYPE(WindowOverviewState*) 54 DECLARE_WINDOW_PROPERTY_TYPE(WindowOverviewState*);
57 DEFINE_OWNED_WINDOW_PROPERTY_KEY(WindowOverviewState, 55 DEFINE_OWNED_WINDOW_PROPERTY_KEY(WindowOverviewState,
58 kWindowOverviewState, 56 kWindowOverviewState,
59 NULL) 57 NULL);
58
60 namespace athena { 59 namespace athena {
61 60
62 namespace { 61 namespace {
63 62
63 const float kOverviewDefaultScale = 0.75f;
64
64 gfx::Transform GetTransformForSplitWindow(aura::Window* window, float scale) { 65 gfx::Transform GetTransformForSplitWindow(aura::Window* window, float scale) {
65 const float kScrollWindowPositionInOverview = 0.65f; 66 const float kScrollWindowPositionInOverview = 0.65f;
66 int x_translate = window->bounds().width() * (1 - scale) / 2; 67 int x_translate = window->bounds().width() * (1 - scale) / 2;
67 gfx::Transform transform; 68 gfx::Transform transform;
68 transform.Translate( 69 transform.Translate(
69 x_translate, window->bounds().height() * kScrollWindowPositionInOverview); 70 x_translate, window->bounds().height() * kScrollWindowPositionInOverview);
70 transform.Scale(scale, scale); 71 transform.Scale(scale, scale);
71 return transform; 72 return transform;
72 } 73 }
73 74
(...skipping 18 matching lines...) Expand all
92 int window_x = window->bounds().x(); 93 int window_x = window->bounds().x();
93 float x_translate = (container_width - (window_width * scale)) / 2 - window_x; 94 float x_translate = (container_width - (window_width * scale)) / 2 - window_x;
94 float y_translate = gfx::Tween::FloatValueBetween( 95 float y_translate = gfx::Tween::FloatValueBetween(
95 state->progress, state->min_y, state->max_y); 96 state->progress, state->min_y, state->max_y);
96 gfx::Transform transform; 97 gfx::Transform transform;
97 transform.Translate(x_translate, y_translate); 98 transform.Translate(x_translate, y_translate);
98 transform.Scale(scale, scale); 99 transform.Scale(scale, scale);
99 return transform; 100 return transform;
100 } 101 }
101 102
102 // Sets the progress-state for the window in the overview mode. 103 // A utility class used to set the transform/opacity to the window and
103 void SetWindowProgress(aura::Window* window, float progress) { 104 // its transient children.
104 WindowOverviewState* state = window->GetProperty(kWindowOverviewState); 105 class TransientGroupSetter {
105 state->progress = progress; 106 public:
107 explicit TransientGroupSetter(aura::Window* window)
108 : window_(window) {
Mr4D (OOO till 08-26) 2014/10/08 15:32:29 This would fit into one line.
oshima 2014/10/08 19:05:30 Done.
109 }
110 ~TransientGroupSetter() {}
106 111
107 gfx::Transform transform = GetTransformForState(window, state); 112 // Aborts all animations including its transient children.
108 window->SetTransform(transform); 113 void AbortAllAnimations() {
109 } 114 window_->layer()->GetAnimator()->AbortAllAnimations();
115 for (auto* transient_child : wm::GetTransientChildren(window_))
116 transient_child->layer()->GetAnimator()->AbortAllAnimations();
117 }
118
119 // Applys transform to the window and its transient children.
120 // Transient children gets a tranfrorm with the offset relateive
121 // it its transient parent.
122 void SetTransform(const gfx::Transform& transform) {
123 window_->SetTransform(transform);
124 for (auto* transient_child : wm::GetTransientChildren(window_)) {
125 gfx::Rect window_bounds = window_->bounds();
126 gfx::Rect child_bounds = transient_child->bounds();
127 gfx::Transform transient_window_transform(TranslateTransformOrigin(
128 child_bounds.origin() - window_bounds.origin(), transform));
129 transient_child->SetTransform(transient_window_transform);
130 }
131 }
132
133 // Sets the opacity to the window and its transient children.
134 void SetOpacity(float opacity) {
135 window_->layer()->SetOpacity(opacity);
136 for (auto* transient_child : wm::GetTransientChildren(window_)) {
137 transient_child->layer()->SetOpacity(opacity);
138 }
139 }
140
141 // Apply the transform with the overview scroll |progress|.
142 void SetWindowProgress(float progress) {
143 WindowOverviewState* state = window_->GetProperty(kWindowOverviewState);
144 state->progress = progress;
145
146 SetTransform(GetTransformForState(window_, state));
147 }
148
149 private:
150 static gfx::Transform TranslateTransformOrigin(
151 const gfx::Vector2d& new_origin,
152 const gfx::Transform& transform) {
153 gfx::Transform result;
154 result.Translate(-new_origin.x(), -new_origin.y());
155 result.PreconcatTransform(transform);
156 result.Translate(new_origin.x(), new_origin.y());
157 return result;
158 }
159
160 aura::Window* window_;
161
162 DISALLOW_COPY_AND_ASSIGN(TransientGroupSetter);
163 };
164
165 // TransientGroupSetter with animation.
166 class AnimateTransientGroupSetter : public TransientGroupSetter {
167 public:
168 explicit AnimateTransientGroupSetter(aura::Window* window)
169 : TransientGroupSetter(window) {
170 animation_settings_.push_back(CreateScopedLayerAnimationSettings(window));
171 for (auto* transient_child : wm::GetTransientChildren(window)) {
172 animation_settings_.push_back(
173 CreateScopedLayerAnimationSettings(transient_child));
174 }
175 }
176 ~AnimateTransientGroupSetter() {}
177
178 ui::ScopedLayerAnimationSettings* GetMainWindowAnimationSettings() {
179 CHECK(animation_settings_.size());
180 return animation_settings_[0];
181 }
182
183 private:
184 static ui::ScopedLayerAnimationSettings* CreateScopedLayerAnimationSettings(
185 aura::Window* window) {
186 const int kTransitionMs = 250;
187
188 ui::ScopedLayerAnimationSettings* settings =
189 new ui::ScopedLayerAnimationSettings(window->layer()->GetAnimator());
190 settings->SetPreemptionStrategy(
191 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
192 settings->SetTransitionDuration(
193 base::TimeDelta::FromMilliseconds(kTransitionMs));
194 return settings;
195 }
196
197 ScopedVector<ui::ScopedLayerAnimationSettings> animation_settings_;
198 DISALLOW_COPY_AND_ASSIGN(AnimateTransientGroupSetter);
199 };
110 200
111 void HideWindowIfNotVisible(aura::Window* window, 201 void HideWindowIfNotVisible(aura::Window* window,
112 SplitViewController* split_view_controller) { 202 SplitViewController* split_view_controller) {
113 bool should_hide = true; 203 bool should_hide = true;
114 if (split_view_controller->IsSplitViewModeActive()) { 204 if (split_view_controller->IsSplitViewModeActive()) {
115 should_hide = window != split_view_controller->left_window() && 205 should_hide = window != split_view_controller->left_window() &&
116 window != split_view_controller->right_window(); 206 window != split_view_controller->right_window();
117 } else { 207 } else {
118 should_hide = !wm::IsActiveWindow(window); 208 aura::Window* active = aura::client::GetActivationClient(
209 window->GetRootWindow())->GetActiveWindow();
210 should_hide = active != window && wm::GetTransientParent(active) != window;
119 } 211 }
120 if (should_hide) 212 if (should_hide)
121 window->Hide(); 213 window->Hide();
122 } 214 }
123 215
124 // Resets the overview-related state for |window|. 216 // Resets the overview-related state for |window|.
125 void RestoreWindowState(aura::Window* window, 217 void RestoreWindowState(aura::Window* window,
126 SplitViewController* split_view_controller) { 218 SplitViewController* split_view_controller) {
127 window->ClearProperty(kWindowOverviewState); 219 window->ClearProperty(kWindowOverviewState);
128 220
129 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); 221 AnimateTransientGroupSetter setter(window);
130 settings.SetPreemptionStrategy(
131 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
132 settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(250));
133 222
134 settings.AddObserver(new ui::ClosureAnimationObserver( 223 setter.GetMainWindowAnimationSettings()->AddObserver(
135 base::Bind(&HideWindowIfNotVisible, window, split_view_controller))); 224 new ui::ClosureAnimationObserver(
225 base::Bind(&HideWindowIfNotVisible, window, split_view_controller)));
136 226
137 window->SetTransform(gfx::Transform()); 227 setter.SetTransform(gfx::Transform());
138
139 // Reset the window opacity in case the user is dragging a window. 228 // Reset the window opacity in case the user is dragging a window.
140 window->layer()->SetOpacity(1.0f); 229 setter.SetOpacity(1.0f);
141 230
142 wm::SetShadowType(window, wm::SHADOW_TYPE_NONE); 231 wm::SetShadowType(window, wm::SHADOW_TYPE_NONE);
143 } 232 }
144 233
145 gfx::RectF GetTransformedBounds(aura::Window* window) { 234 gfx::RectF GetTransformedBounds(aura::Window* window) {
146 gfx::Transform transform; 235 gfx::Transform transform;
147 gfx::RectF bounds = window->bounds(); 236 gfx::RectF bounds = window->bounds();
148 transform.Translate(bounds.x(), bounds.y()); 237 transform.Translate(bounds.x(), bounds.y());
149 transform.PreconcatTransform(window->layer()->transform()); 238 transform.PreconcatTransform(window->layer()->transform());
150 transform.Translate(-bounds.x(), -bounds.y()); 239 transform.Translate(-bounds.x(), -bounds.y());
151 transform.TransformRect(&bounds); 240 transform.TransformRect(&bounds);
152 return bounds; 241 return bounds;
153 } 242 }
154 243
155 void TransformSplitWindowScale(aura::Window* window, float scale) { 244 void TransformSplitWindowScale(aura::Window* window, float scale) {
156 gfx::Transform transform = window->layer()->GetTargetTransform(); 245 gfx::Transform transform = window->layer()->GetTargetTransform();
157 if (transform.Scale2d() == gfx::Vector2dF(scale, scale)) 246 if (transform.Scale2d() == gfx::Vector2dF(scale, scale))
158 return; 247 return;
159 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); 248 AnimateTransientGroupSetter setter(window);
160 window->SetTransform(GetTransformForSplitWindow(window, scale)); 249 setter.SetTransform(GetTransformForSplitWindow(window, scale));
161 } 250 }
162 251
163 void AnimateWindowTo(aura::Window* animate_window, 252 void AnimateWindowTo(aura::Window* animate_window,
164 aura::Window* target_window) { 253 aura::Window* target_window) {
165 ui::ScopedLayerAnimationSettings settings( 254 AnimateTransientGroupSetter setter(animate_window);
166 animate_window->layer()->GetAnimator()); 255
167 settings.SetPreemptionStrategy(
168 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
169 WindowOverviewState* target_state = 256 WindowOverviewState* target_state =
170 target_window->GetProperty(kWindowOverviewState); 257 target_window->GetProperty(kWindowOverviewState);
171 SetWindowProgress(animate_window, target_state->progress); 258 setter.SetWindowProgress(target_state->progress);
172 } 259 }
173 260
174 // Always returns the same target. 261 // Always returns the same target.
175 class StaticWindowTargeter : public aura::WindowTargeter { 262 class StaticWindowTargeter : public aura::WindowTargeter {
176 public: 263 public:
177 explicit StaticWindowTargeter(aura::Window* target) : target_(target) {} 264 explicit StaticWindowTargeter(aura::Window* target) : target_(target) {}
178 virtual ~StaticWindowTargeter() {} 265 virtual ~StaticWindowTargeter() {}
179 266
180 private: 267 private:
181 // aura::WindowTargeter: 268 // aura::WindowTargeter:
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 } 311 }
225 312
226 virtual ~WindowOverviewModeImpl() { 313 virtual ~WindowOverviewModeImpl() {
227 window_list_provider_->RemoveObserver(this); 314 window_list_provider_->RemoveObserver(this);
228 container_->set_target_handler(container_->delegate()); 315 container_->set_target_handler(container_->delegate());
229 RemoveAnimationObserver(); 316 RemoveAnimationObserver();
230 const aura::Window::Windows& windows = 317 const aura::Window::Windows& windows =
231 window_list_provider_->GetWindowList(); 318 window_list_provider_->GetWindowList();
232 if (windows.empty()) 319 if (windows.empty())
233 return; 320 return;
234 std::for_each(windows.begin(), 321 for (auto* window : windows)
235 windows.end(), 322 RestoreWindowState(window, split_view_controller_);
236 std::bind2nd(std::ptr_fun(&RestoreWindowState),
237 split_view_controller_));
238 } 323 }
239 324
240 private: 325 private:
241 // Computes the transforms for all windows in both the topmost and bottom-most 326 // Computes the transforms for all windows in both the topmost and bottom-most
242 // positions. The transforms are set in the |kWindowOverviewState| property of 327 // positions. The transforms are set in the |kWindowOverviewState| property of
243 // the windows. 328 // the windows.
244 void ComputeTerminalStatesForAllWindows() { 329 void ComputeTerminalStatesForAllWindows() {
245 size_t index = 0; 330 size_t index = 0;
246 331
247 const aura::Window::Windows& windows = 332 const aura::Window::Windows& windows =
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 if (split_view_controller_->IsSplitViewModeActive() && 392 if (split_view_controller_->IsSplitViewModeActive() &&
308 (window == split_view_controller_->left_window() || 393 (window == split_view_controller_->left_window() ||
309 window == split_view_controller_->right_window())) { 394 window == split_view_controller_->right_window())) {
310 progress = 1; 395 progress = 1;
311 } else { 396 } else {
312 if (index < arraysize(kInitialProgress)) 397 if (index < arraysize(kInitialProgress))
313 progress = kInitialProgress[index]; 398 progress = kInitialProgress[index];
314 ++index; 399 ++index;
315 } 400 }
316 401
317 scoped_refptr<ui::LayerAnimator> animator = 402 TransientGroupSetter setter(window);
318 window->layer()->GetAnimator();
319 403
320 // Unset any in-progress animation. 404 // Unset any in-progress animation.
321 animator->AbortAllAnimations(); 405 setter.AbortAllAnimations();
406
407 // Showing transient parent will show the transient children if any.
322 window->Show(); 408 window->Show();
323 window->SetTransform(gfx::Transform()); 409
410 setter.SetTransform(gfx::Transform());
324 // Setup the animation. 411 // Setup the animation.
325 { 412 {
326 ui::ScopedLayerAnimationSettings settings(animator); 413 AnimateTransientGroupSetter setter(window);
327 settings.SetPreemptionStrategy( 414 setter.SetWindowProgress(progress);
328 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
329 settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(250));
330 SetWindowProgress(window, progress);
331 } 415 }
332 } 416 }
333 } 417 }
334 418
335 aura::Window* SelectWindowAt(ui::LocatedEvent* event) { 419 aura::Window* SelectWindowAt(ui::LocatedEvent* event) {
336 CHECK_EQ(container_, event->target()); 420 CHECK_EQ(container_, event->target());
337 // Find the old targeter to find the target of the event. 421 // Find the old targeter to find the target of the event.
338 ui::EventTarget* window = container_; 422 ui::EventTarget* window = container_;
339 ui::EventTargeter* targeter = scoped_targeter_->old_targeter(); 423 ui::EventTargeter* targeter = scoped_targeter_->old_targeter();
340 while (!targeter && window->GetParentTarget()) { 424 while (!targeter && window->GetParentTarget()) {
341 window = window->GetParentTarget(); 425 window = window->GetParentTarget();
342 targeter = window->GetEventTargeter(); 426 targeter = window->GetEventTargeter();
343 } 427 }
344 if (!targeter) 428 if (!targeter)
345 return NULL; 429 return NULL;
346 aura::Window* target = static_cast<aura::Window*>( 430 aura::Window* target = static_cast<aura::Window*>(
347 targeter->FindTargetForLocatedEvent(container_, event)); 431 targeter->FindTargetForLocatedEvent(container_, event));
348 while (target && target->parent() != container_) 432 while (target && target->parent() != container_)
349 target = target->parent(); 433 target = target->parent();
350 return target; 434 aura::Window* transient_parent = wm::GetTransientParent(target);
435 return transient_parent ? transient_parent : target;
351 } 436 }
352 437
353 // Scroll the window list by |delta_y| amount. |delta_y| is negative when 438 // Scroll the window list by |delta_y| amount. |delta_y| is negative when
354 // scrolling up; and positive when scrolling down. 439 // scrolling up; and positive when scrolling down.
355 void DoScroll(float delta_y) { 440 void DoScroll(float delta_y) {
356 const float kEpsilon = 1e-3f; 441 const float kEpsilon = 1e-3f;
357 float delta_y_p = std::abs(delta_y) / GetScrollableHeight(); 442 float delta_y_p = std::abs(delta_y) / GetScrollableHeight();
358 const aura::Window::Windows& windows = 443 const aura::Window::Windows& windows =
359 window_list_provider_->GetWindowList(); 444 window_list_provider_->GetWindowList();
360 if (delta_y < 0) { 445 if (delta_y < 0) {
361 // Scroll up. Start with the top-most (i.e. behind-most in terms of 446 // Scroll up. Start with the top-most (i.e. behind-most in terms of
362 // z-index) window, and try to scroll them up. 447 // z-index) window, and try to scroll them up.
363 for (aura::Window::Windows::const_iterator iter = windows.begin(); 448 for (aura::Window::Windows::const_iterator iter = windows.begin();
364 delta_y_p > kEpsilon && iter != windows.end(); 449 delta_y_p > kEpsilon && iter != windows.end();
365 ++iter) { 450 ++iter) {
366 aura::Window* window = (*iter); 451 aura::Window* window = (*iter);
367 WindowOverviewState* state = window->GetProperty(kWindowOverviewState); 452 WindowOverviewState* state = window->GetProperty(kWindowOverviewState);
368 if (state->progress > kEpsilon) { 453 if (state->progress > kEpsilon) {
369 // It is possible to scroll |window| up. Scroll it up, and update 454 // It is possible to scroll |window| up. Scroll it up, and update
370 // |delta_y_p| for the next window. 455 // |delta_y_p| for the next window.
371 float apply = delta_y_p * state->progress; 456 float apply = delta_y_p * state->progress;
372 SetWindowProgress(window, std::max(0.f, state->progress - apply * 3)); 457 TransientGroupSetter setter(window);
458 setter.SetWindowProgress(std::max(0.f, state->progress - apply * 3));
373 delta_y_p -= apply; 459 delta_y_p -= apply;
374 } 460 }
375 } 461 }
376 } else { 462 } else {
377 // Scroll down. Start with the bottom-most (i.e. front-most in terms of 463 // Scroll down. Start with the bottom-most (i.e. front-most in terms of
378 // z-index) window, and try to scroll them down. 464 // z-index) window, and try to scroll them down.
379 aura::Window::Windows::const_reverse_iterator iter; 465 aura::Window::Windows::const_reverse_iterator iter;
380 for (iter = windows.rbegin(); 466 for (iter = windows.rbegin();
381 delta_y_p > kEpsilon && iter != windows.rend(); 467 delta_y_p > kEpsilon && iter != windows.rend();
382 ++iter) { 468 ++iter) {
383 aura::Window* window = (*iter); 469 aura::Window* window = (*iter);
384 WindowOverviewState* state = window->GetProperty(kWindowOverviewState); 470 WindowOverviewState* state = window->GetProperty(kWindowOverviewState);
385 if (1.f - state->progress > kEpsilon) { 471 if (1.f - state->progress > kEpsilon) {
386 // It is possible to scroll |window| down. Scroll it down, and update 472 // It is possible to scroll |window| down. Scroll it down, and update
387 // |delta_y_p| for the next window. 473 // |delta_y_p| for the next window.
388 SetWindowProgress(window, std::min(1.f, state->progress + delta_y_p)); 474 TransientGroupSetter setter(window);
475 setter.SetWindowProgress(std::min(1.f, state->progress + delta_y_p));
389 delta_y_p /= 2.f; 476 delta_y_p /= 2.f;
390 } 477 }
391 } 478 }
392 } 479 }
393 } 480 }
394 481
395 int GetScrollableHeight() const { 482 int GetScrollableHeight() const {
396 const float kScrollableFraction = 0.85f; 483 const float kScrollableFraction = 0.85f;
397 const float kScrollableFractionInSplit = 0.5f; 484 const float kScrollableFractionInSplit = 0.5f;
398 const float fraction = split_view_controller_->IsSplitViewModeActive() 485 const float fraction = split_view_controller_->IsSplitViewModeActive()
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 CHECK_EQ(ui::ET_GESTURE_SCROLL_UPDATE, event.type()); 526 CHECK_EQ(ui::ET_GESTURE_SCROLL_UPDATE, event.type());
440 CHECK(overview_toolbar_); 527 CHECK(overview_toolbar_);
441 gfx::Vector2dF dragged_distance = 528 gfx::Vector2dF dragged_distance =
442 dragged_start_location_ - event.location(); 529 dragged_start_location_ - event.location();
443 WindowOverviewState* dragged_state = 530 WindowOverviewState* dragged_state =
444 dragged_window_->GetProperty(kWindowOverviewState); 531 dragged_window_->GetProperty(kWindowOverviewState);
445 CHECK(dragged_state); 532 CHECK(dragged_state);
446 gfx::Transform transform = 533 gfx::Transform transform =
447 GetTransformForState(dragged_window_, dragged_state); 534 GetTransformForState(dragged_window_, dragged_state);
448 transform.Translate(-dragged_distance.x(), 0); 535 transform.Translate(-dragged_distance.x(), 0);
449 dragged_window_->SetTransform(transform); 536 TransientGroupSetter setter(dragged_window_);
537 setter.SetTransform(transform);
450 538
451 // Update the toolbar. 539 // Update the toolbar.
452 const int kMinDistanceForActionButtons = 20; 540 const int kMinDistanceForActionButtons = 20;
453 if (fabs(dragged_distance.x()) > kMinDistanceForActionButtons) 541 if (fabs(dragged_distance.x()) > kMinDistanceForActionButtons)
454 overview_toolbar_->ShowActionButtons(); 542 overview_toolbar_->ShowActionButtons();
455 else 543 else
456 overview_toolbar_->HideActionButtons(); 544 overview_toolbar_->HideActionButtons();
457 545
458 // See if the touch-point is above one of the action-buttons. 546 // See if the touch-point is above one of the action-buttons.
459 OverviewToolbar::ActionType new_action = 547 OverviewToolbar::ActionType new_action =
(...skipping 21 matching lines...) Expand all
481 (new_action != previous_action) && 569 (new_action != previous_action) &&
482 ((new_action == OverviewToolbar::ACTION_TYPE_SPLIT) || 570 ((new_action == OverviewToolbar::ACTION_TYPE_SPLIT) ||
483 (previous_action == OverviewToolbar::ACTION_TYPE_SPLIT)); 571 (previous_action == OverviewToolbar::ACTION_TYPE_SPLIT));
484 float ratio = std::min( 572 float ratio = std::min(
485 1.f, std::abs(dragged_distance.x()) / kMinDistanceForDismissal); 573 1.f, std::abs(dragged_distance.x()) / kMinDistanceForDismissal);
486 float opacity = 574 float opacity =
487 (new_action == OverviewToolbar::ACTION_TYPE_SPLIT || split_drop) 575 (new_action == OverviewToolbar::ACTION_TYPE_SPLIT || split_drop)
488 ? 1 576 ? 1
489 : gfx::Tween::FloatValueBetween(ratio, kMaxOpacity, kMinOpacity); 577 : gfx::Tween::FloatValueBetween(ratio, kMaxOpacity, kMinOpacity);
490 if (animate_opacity) { 578 if (animate_opacity) {
491 ui::ScopedLayerAnimationSettings settings( 579 AnimateTransientGroupSetter setter(dragged_window_);
492 dragged_window_->layer()->GetAnimator()); 580 setter.SetOpacity(opacity);
493 dragged_window_->layer()->SetOpacity(opacity);
494 } else { 581 } else {
495 dragged_window_->layer()->SetOpacity(opacity); 582 TransientGroupSetter setter(dragged_window_);
583 setter.SetOpacity(opacity);
496 } 584 }
497 585
498 if (split_view_controller_->IsSplitViewModeActive()) { 586 if (split_view_controller_->IsSplitViewModeActive()) {
499 float scale = kOverviewDefaultScale; 587 float scale = kOverviewDefaultScale;
500 if (split_drop == split_view_controller_->left_window()) 588 if (split_drop == split_view_controller_->left_window())
501 scale = kMaxScaleForSplitTarget; 589 scale = kMaxScaleForSplitTarget;
502 TransformSplitWindowScale(split_view_controller_->left_window(), scale); 590 TransformSplitWindowScale(split_view_controller_->left_window(), scale);
503 591
504 scale = kOverviewDefaultScale; 592 scale = kOverviewDefaultScale;
505 if (split_drop == split_view_controller_->right_window()) 593 if (split_drop == split_view_controller_->right_window())
(...skipping 12 matching lines...) Expand all
518 const bool swipe_towards_right = event.details().velocity_x() > 0; 606 const bool swipe_towards_right = event.details().velocity_x() > 0;
519 if (dragging_towards_right != swipe_towards_right) 607 if (dragging_towards_right != swipe_towards_right)
520 return false; 608 return false;
521 const float kMinVelocityForDismissal = 500.f; 609 const float kMinVelocityForDismissal = 500.f;
522 return std::abs(event.details().velocity_x()) > kMinVelocityForDismissal; 610 return std::abs(event.details().velocity_x()) > kMinVelocityForDismissal;
523 } 611 }
524 612
525 void CloseDragWindow(const ui::GestureEvent& gesture) { 613 void CloseDragWindow(const ui::GestureEvent& gesture) {
526 // Animate |dragged_window_| offscreen first, then destroy it. 614 // Animate |dragged_window_| offscreen first, then destroy it.
527 { 615 {
528 wm::ScopedHidingAnimationSettings settings(dragged_window_); 616 AnimateTransientGroupSetter setter(dragged_window_);
529 settings.layer_animation_settings()->SetPreemptionStrategy(
530 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
531 617
532 WindowOverviewState* dragged_state = 618 WindowOverviewState* dragged_state =
533 dragged_window_->GetProperty(kWindowOverviewState); 619 dragged_window_->GetProperty(kWindowOverviewState);
534 CHECK(dragged_state); 620 CHECK(dragged_state);
535 gfx::Transform transform = dragged_window_->layer()->transform(); 621 gfx::Transform transform = dragged_window_->layer()->transform();
536 gfx::RectF transformed_bounds = dragged_window_->bounds(); 622 gfx::RectF transformed_bounds = dragged_window_->bounds();
537 transform.TransformRect(&transformed_bounds); 623 transform.TransformRect(&transformed_bounds);
538 float transform_x = 0.f; 624 float transform_x = 0.f;
539 if (gesture.location().x() > dragged_start_location_.x()) 625 if (gesture.location().x() > dragged_start_location_.x())
540 transform_x = container_->bounds().right() - transformed_bounds.x(); 626 transform_x = container_->bounds().right() - transformed_bounds.x();
541 else 627 else
542 transform_x = -(transformed_bounds.x() + transformed_bounds.width()); 628 transform_x = -(transformed_bounds.x() + transformed_bounds.width());
543 transform.Translate(transform_x / kOverviewDefaultScale, 0); 629 transform.Translate(transform_x / kOverviewDefaultScale, 0);
544 dragged_window_->SetTransform(transform); 630
545 dragged_window_->layer()->SetOpacity(kMinOpacity); 631 setter.SetOpacity(kMinOpacity);
546 } 632 }
547 delete dragged_window_; 633 delete dragged_window_;
548 dragged_window_ = NULL; 634 dragged_window_ = NULL;
549 } 635 }
550 636
551 void RestoreDragWindow() { 637 void RestoreDragWindow() {
552 CHECK(dragged_window_); 638 CHECK(dragged_window_);
553 WindowOverviewState* dragged_state = 639 WindowOverviewState* dragged_state =
554 dragged_window_->GetProperty(kWindowOverviewState); 640 dragged_window_->GetProperty(kWindowOverviewState);
555 CHECK(dragged_state); 641 CHECK(dragged_state);
556 642
557 ui::ScopedLayerAnimationSettings settings( 643 AnimateTransientGroupSetter setter(dragged_window_);
558 dragged_window_->layer()->GetAnimator()); 644 setter.SetTransform(GetTransformForState(dragged_window_, dragged_state));
559 settings.SetPreemptionStrategy( 645 setter.SetOpacity(1.0f);
560 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
561 dragged_window_->SetTransform(
562 GetTransformForState(dragged_window_, dragged_state));
563 dragged_window_->layer()->SetOpacity(1.f);
564 dragged_window_ = NULL; 646 dragged_window_ = NULL;
565 } 647 }
566 648
567 void EndDragWindow(const ui::GestureEvent& gesture) { 649 void EndDragWindow(const ui::GestureEvent& gesture) {
568 CHECK(dragged_window_); 650 CHECK(dragged_window_);
569 CHECK(overview_toolbar_); 651 CHECK(overview_toolbar_);
570 OverviewToolbar::ActionType action = overview_toolbar_->current_action(); 652 OverviewToolbar::ActionType action = overview_toolbar_->current_action();
571 overview_toolbar_.reset(); 653 overview_toolbar_.reset();
572 if (action == OverviewToolbar::ACTION_TYPE_SPLIT) { 654 if (action == OverviewToolbar::ACTION_TYPE_SPLIT) {
573 delegate_->OnSelectSplitViewWindow(NULL, 655 delegate_->OnSelectSplitViewWindow(NULL,
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 aura::Window* container, 858 aura::Window* container,
777 WindowListProvider* window_list_provider, 859 WindowListProvider* window_list_provider,
778 SplitViewController* split_view_controller, 860 SplitViewController* split_view_controller,
779 WindowOverviewModeDelegate* delegate) { 861 WindowOverviewModeDelegate* delegate) {
780 return scoped_ptr<WindowOverviewMode>( 862 return scoped_ptr<WindowOverviewMode>(
781 new WindowOverviewModeImpl(container, window_list_provider, 863 new WindowOverviewModeImpl(container, window_list_provider,
782 split_view_controller, delegate)); 864 split_view_controller, delegate));
783 } 865 }
784 866
785 } // namespace athena 867 } // namespace athena
OLDNEW
« athena/wm/window_list_provider_impl_unittest.cc ('K') | « athena/wm/window_manager_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698