Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "athena/common/closure_animation_observer.h" | 11 #include "athena/common/closure_animation_observer.h" |
| 12 #include "athena/wm/overview_toolbar.h" | |
| 12 #include "athena/wm/public/window_list_provider.h" | 13 #include "athena/wm/public/window_list_provider.h" |
| 13 #include "base/bind.h" | 14 #include "base/bind.h" |
| 14 #include "base/macros.h" | 15 #include "base/macros.h" |
| 15 #include "ui/aura/scoped_window_targeter.h" | 16 #include "ui/aura/scoped_window_targeter.h" |
| 16 #include "ui/aura/window.h" | 17 #include "ui/aura/window.h" |
| 17 #include "ui/aura/window_delegate.h" | 18 #include "ui/aura/window_delegate.h" |
| 18 #include "ui/aura/window_property.h" | 19 #include "ui/aura/window_property.h" |
| 19 #include "ui/aura/window_targeter.h" | 20 #include "ui/aura/window_targeter.h" |
| 20 #include "ui/aura/window_tree_host.h" | 21 #include "ui/aura/window_tree_host.h" |
| 21 #include "ui/compositor/compositor.h" | 22 #include "ui/compositor/compositor.h" |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 293 | 294 |
| 294 void RemoveAnimationObserver() { | 295 void RemoveAnimationObserver() { |
| 295 ui::Compositor* compositor = container_->GetHost()->compositor(); | 296 ui::Compositor* compositor = container_->GetHost()->compositor(); |
| 296 if (compositor->HasAnimationObserver(this)) | 297 if (compositor->HasAnimationObserver(this)) |
| 297 compositor->RemoveAnimationObserver(this); | 298 compositor->RemoveAnimationObserver(this); |
| 298 } | 299 } |
| 299 | 300 |
| 300 void DragWindow(const ui::GestureEvent& event) { | 301 void DragWindow(const ui::GestureEvent& event) { |
| 301 CHECK(dragged_window_); | 302 CHECK(dragged_window_); |
| 302 CHECK_EQ(ui::ET_GESTURE_SCROLL_UPDATE, event.type()); | 303 CHECK_EQ(ui::ET_GESTURE_SCROLL_UPDATE, event.type()); |
| 304 CHECK(overview_toolbar_); | |
| 303 gfx::Vector2dF dragged_distance = | 305 gfx::Vector2dF dragged_distance = |
| 304 dragged_start_location_ - event.location(); | 306 dragged_start_location_ - event.location(); |
| 305 WindowOverviewState* dragged_state = | 307 WindowOverviewState* dragged_state = |
| 306 dragged_window_->GetProperty(kWindowOverviewState); | 308 dragged_window_->GetProperty(kWindowOverviewState); |
| 307 CHECK(dragged_state); | 309 CHECK(dragged_state); |
| 308 gfx::Transform transform = GetTransformForState(dragged_state); | 310 gfx::Transform transform = GetTransformForState(dragged_state); |
| 309 transform.Translate(-dragged_distance.x(), 0); | 311 transform.Translate(-dragged_distance.x(), 0); |
| 310 dragged_window_->SetTransform(transform); | 312 dragged_window_->SetTransform(transform); |
| 311 | 313 |
| 314 // Update the toolbar. | |
| 315 const int kMinDistanceForActionButtons = 20; | |
| 316 if (fabs(dragged_distance.x()) > kMinDistanceForActionButtons) | |
| 317 overview_toolbar_->ShowActionButtons(); | |
| 318 else | |
| 319 overview_toolbar_->HideActionButtons(); | |
| 320 | |
| 321 // See if the touch-point is above one of the action-buttons. | |
| 322 OverviewToolbar::ActionType new_action = | |
| 323 overview_toolbar_->GetHighlightAction(event); | |
| 324 | |
| 325 // If the touch-point is not above any of the action buttons, then highlight | |
| 326 // the close-button by default, if the user has dragged enough to close the | |
| 327 // window. | |
| 328 if (new_action == OverviewToolbar::ACTION_TYPE_NONE) { | |
| 329 if (fabs(dragged_distance.x()) > kMinDistanceForDismissal) | |
| 330 new_action = OverviewToolbar::ACTION_TYPE_CLOSE; | |
| 331 else | |
| 332 new_action = OverviewToolbar::ACTION_TYPE_NONE; | |
| 333 } | |
| 334 OverviewToolbar::ActionType previous_action = | |
| 335 overview_toolbar_->current_action(); | |
| 336 overview_toolbar_->SetHighlightAction(new_action); | |
| 337 | |
| 338 // If the user has selected to get into split-view mode, then show the | |
| 339 // window with full opacity. Otherwise, fade it out as it closes. Animate | |
| 340 // the opacity if transitioning to/from the split-view button. | |
| 341 bool animate_opacity = | |
| 342 (new_action != previous_action) && | |
| 343 ((new_action == OverviewToolbar::ACTION_TYPE_SPLIT) || | |
| 344 (previous_action == OverviewToolbar::ACTION_TYPE_SPLIT)); | |
| 312 float ratio = std::min( | 345 float ratio = std::min( |
| 313 1.f, std::abs(dragged_distance.x()) / kMinDistanceForDismissal); | 346 1.f, std::abs(dragged_distance.x()) / kMinDistanceForDismissal); |
| 314 float opacity = | 347 float opacity = |
| 315 gfx::Tween::FloatValueBetween(ratio, kMaxOpacity, kMinOpacity); | 348 (new_action == OverviewToolbar::ACTION_TYPE_SPLIT) |
| 316 dragged_window_->layer()->SetOpacity(opacity); | 349 ? 1 |
| 350 : gfx::Tween::FloatValueBetween(ratio, kMaxOpacity, kMinOpacity); | |
| 351 if (animate_opacity) { | |
| 352 ui::ScopedLayerAnimationSettings settings( | |
| 353 dragged_window_->layer()->GetAnimator()); | |
| 354 dragged_window_->layer()->SetOpacity(opacity); | |
| 355 } else { | |
| 356 dragged_window_->layer()->SetOpacity(opacity); | |
| 357 } | |
| 317 } | 358 } |
| 318 | 359 |
| 319 bool ShouldCloseDragWindow(const ui::GestureEvent& event) const { | 360 bool ShouldCloseDragWindow(const ui::GestureEvent& event) const { |
| 320 gfx::Vector2dF dragged_distance = | 361 gfx::Vector2dF dragged_distance = |
| 321 dragged_start_location_ - event.location(); | 362 dragged_start_location_ - event.location(); |
| 322 if (event.type() == ui::ET_GESTURE_SCROLL_END) | 363 if (event.type() == ui::ET_GESTURE_SCROLL_END) |
| 323 return std::abs(dragged_distance.x()) >= kMinDistanceForDismissal; | 364 return std::abs(dragged_distance.x()) >= kMinDistanceForDismissal; |
| 324 CHECK_EQ(ui::ET_SCROLL_FLING_START, event.type()); | 365 CHECK_EQ(ui::ET_SCROLL_FLING_START, event.type()); |
| 325 const bool dragging_towards_right = dragged_distance.x() < 0; | 366 const bool dragging_towards_right = dragged_distance.x() < 0; |
| 326 const bool swipe_towards_right = event.details().velocity_x() > 0; | 367 const bool swipe_towards_right = event.details().velocity_x() > 0; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 | 426 |
| 386 ui::ScopedLayerAnimationSettings settings( | 427 ui::ScopedLayerAnimationSettings settings( |
| 387 dragged_window_->layer()->GetAnimator()); | 428 dragged_window_->layer()->GetAnimator()); |
| 388 settings.SetPreemptionStrategy( | 429 settings.SetPreemptionStrategy( |
| 389 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 430 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
| 390 dragged_window_->SetTransform(GetTransformForState(dragged_state)); | 431 dragged_window_->SetTransform(GetTransformForState(dragged_state)); |
| 391 dragged_window_->layer()->SetOpacity(1.f); | 432 dragged_window_->layer()->SetOpacity(1.f); |
| 392 dragged_window_ = NULL; | 433 dragged_window_ = NULL; |
| 393 } | 434 } |
| 394 | 435 |
| 436 void EndDragWindow(const ui::GestureEvent& gesture) { | |
| 437 CHECK(dragged_window_); | |
| 438 CHECK(overview_toolbar_); | |
| 439 OverviewToolbar::ActionType action = overview_toolbar_->current_action(); | |
| 440 overview_toolbar_.reset(); | |
| 441 if (action == OverviewToolbar::ACTION_TYPE_SPLIT) | |
| 442 delegate_->OnSplitViewMode(NULL, dragged_window_); | |
|
mfomitchev
2014/08/13 15:12:31
Why not pass the left window here as well? The bot
sadrul
2014/08/13 16:20:12
The purpose here is to tell the delegate that the
mfomitchev
2014/08/13 17:42:52
Acknowledged.
| |
| 443 else if (ShouldCloseDragWindow(gesture)) | |
| 444 CloseDragWindow(gesture); | |
| 445 else | |
| 446 RestoreDragWindow(); | |
| 447 } | |
| 448 | |
| 395 // ui::EventHandler: | 449 // ui::EventHandler: |
| 396 virtual void OnMouseEvent(ui::MouseEvent* mouse) OVERRIDE { | 450 virtual void OnMouseEvent(ui::MouseEvent* mouse) OVERRIDE { |
| 397 if (mouse->type() == ui::ET_MOUSE_PRESSED) { | 451 if (mouse->type() == ui::ET_MOUSE_PRESSED) { |
| 398 aura::Window* select = SelectWindowAt(mouse); | 452 aura::Window* select = SelectWindowAt(mouse); |
| 399 if (select) { | 453 if (select) { |
| 400 mouse->SetHandled(); | 454 mouse->SetHandled(); |
| 401 delegate_->OnSelectWindow(select); | 455 delegate_->OnSelectWindow(select); |
| 402 } | 456 } |
| 403 } else if (mouse->type() == ui::ET_MOUSEWHEEL) { | 457 } else if (mouse->type() == ui::ET_MOUSEWHEEL) { |
| 404 DoScroll(static_cast<ui::MouseWheelEvent*>(mouse)->y_offset()); | 458 DoScroll(static_cast<ui::MouseWheelEvent*>(mouse)->y_offset()); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 415 aura::Window* select = SelectWindowAt(gesture); | 469 aura::Window* select = SelectWindowAt(gesture); |
| 416 if (select) { | 470 if (select) { |
| 417 gesture->SetHandled(); | 471 gesture->SetHandled(); |
| 418 delegate_->OnSelectWindow(select); | 472 delegate_->OnSelectWindow(select); |
| 419 } | 473 } |
| 420 } else if (gesture->type() == ui::ET_GESTURE_SCROLL_BEGIN) { | 474 } else if (gesture->type() == ui::ET_GESTURE_SCROLL_BEGIN) { |
| 421 if (std::abs(gesture->details().scroll_x_hint()) > | 475 if (std::abs(gesture->details().scroll_x_hint()) > |
| 422 std::abs(gesture->details().scroll_y_hint()) * 2) { | 476 std::abs(gesture->details().scroll_y_hint()) * 2) { |
| 423 dragged_start_location_ = gesture->location(); | 477 dragged_start_location_ = gesture->location(); |
| 424 dragged_window_ = SelectWindowAt(gesture); | 478 dragged_window_ = SelectWindowAt(gesture); |
| 479 if (dragged_window_) | |
| 480 overview_toolbar_.reset(new OverviewToolbar(container_)); | |
| 425 } | 481 } |
| 426 } else if (gesture->type() == ui::ET_GESTURE_SCROLL_UPDATE) { | 482 } else if (gesture->type() == ui::ET_GESTURE_SCROLL_UPDATE) { |
| 427 if (dragged_window_) | 483 if (dragged_window_) |
| 428 DragWindow(*gesture); | 484 DragWindow(*gesture); |
| 429 else | 485 else |
| 430 DoScroll(gesture->details().scroll_y()); | 486 DoScroll(gesture->details().scroll_y()); |
| 431 gesture->SetHandled(); | 487 gesture->SetHandled(); |
| 432 } else if (gesture->type() == ui::ET_GESTURE_SCROLL_END) { | 488 } else if (gesture->type() == ui::ET_GESTURE_SCROLL_END) { |
| 433 if (dragged_window_) { | 489 if (dragged_window_) |
| 434 if (ShouldCloseDragWindow(*gesture)) | 490 EndDragWindow(*gesture); |
| 435 CloseDragWindow(*gesture); | |
| 436 else | |
| 437 RestoreDragWindow(); | |
| 438 } | |
| 439 gesture->SetHandled(); | 491 gesture->SetHandled(); |
| 440 } else if (gesture->type() == ui::ET_SCROLL_FLING_START) { | 492 } else if (gesture->type() == ui::ET_SCROLL_FLING_START) { |
| 441 if (dragged_window_) { | 493 if (dragged_window_) { |
| 442 if (ShouldCloseDragWindow(*gesture)) | 494 EndDragWindow(*gesture); |
| 443 CloseDragWindow(*gesture); | |
| 444 else | |
| 445 RestoreDragWindow(); | |
| 446 } else { | 495 } else { |
| 447 CreateFlingerFor(*gesture); | 496 CreateFlingerFor(*gesture); |
| 448 AddAnimationObserver(); | 497 AddAnimationObserver(); |
| 449 } | 498 } |
| 450 gesture->SetHandled(); | 499 gesture->SetHandled(); |
| 451 } else if (gesture->type() == ui::ET_GESTURE_TAP_DOWN) { | 500 } else if (gesture->type() == ui::ET_GESTURE_TAP_DOWN) { |
| 452 if (fling_) { | 501 if (fling_) { |
| 453 fling_.reset(); | 502 fling_.reset(); |
| 454 RemoveAnimationObserver(); | 503 RemoveAnimationObserver(); |
| 455 gesture->SetHandled(); | 504 gesture->SetHandled(); |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 480 | 529 |
| 481 aura::Window* container_; | 530 aura::Window* container_; |
| 482 // Provider of the stack of windows to show in the overview mode. Not owned. | 531 // Provider of the stack of windows to show in the overview mode. Not owned. |
| 483 const WindowListProvider* window_list_provider_; | 532 const WindowListProvider* window_list_provider_; |
| 484 WindowOverviewModeDelegate* delegate_; | 533 WindowOverviewModeDelegate* delegate_; |
| 485 scoped_ptr<aura::ScopedWindowTargeter> scoped_targeter_; | 534 scoped_ptr<aura::ScopedWindowTargeter> scoped_targeter_; |
| 486 scoped_ptr<ui::FlingCurve> fling_; | 535 scoped_ptr<ui::FlingCurve> fling_; |
| 487 | 536 |
| 488 aura::Window* dragged_window_; | 537 aura::Window* dragged_window_; |
| 489 gfx::Point dragged_start_location_; | 538 gfx::Point dragged_start_location_; |
| 539 scoped_ptr<OverviewToolbar> overview_toolbar_; | |
| 490 | 540 |
| 491 DISALLOW_COPY_AND_ASSIGN(WindowOverviewModeImpl); | 541 DISALLOW_COPY_AND_ASSIGN(WindowOverviewModeImpl); |
| 492 }; | 542 }; |
| 493 | 543 |
| 494 } // namespace | 544 } // namespace |
| 495 | 545 |
| 496 // static | 546 // static |
| 497 scoped_ptr<WindowOverviewMode> WindowOverviewMode::Create( | 547 scoped_ptr<WindowOverviewMode> WindowOverviewMode::Create( |
| 498 aura::Window* container, | 548 aura::Window* container, |
| 499 const WindowListProvider* window_list_provider, | 549 const WindowListProvider* window_list_provider, |
| 500 WindowOverviewModeDelegate* delegate) { | 550 WindowOverviewModeDelegate* delegate) { |
| 501 return scoped_ptr<WindowOverviewMode>( | 551 return scoped_ptr<WindowOverviewMode>( |
| 502 new WindowOverviewModeImpl(container, window_list_provider, delegate)); | 552 new WindowOverviewModeImpl(container, window_list_provider, delegate)); |
| 503 } | 553 } |
| 504 | 554 |
| 505 } // namespace athena | 555 } // namespace athena |
| OLD | NEW |