OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ash/shelf/shelf_layout_manager.h" | 5 #include "ash/shelf/shelf_layout_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <cstring> | 9 #include <cstring> |
10 #include <string> | 10 #include <string> |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 void OnGestureEvent(ui::GestureEvent* event) override; | 106 void OnGestureEvent(ui::GestureEvent* event) override; |
107 | 107 |
108 private: | 108 private: |
109 ShelfLayoutManager* shelf_; | 109 ShelfLayoutManager* shelf_; |
110 bool in_mouse_drag_; | 110 bool in_mouse_drag_; |
111 DISALLOW_COPY_AND_ASSIGN(AutoHideEventFilter); | 111 DISALLOW_COPY_AND_ASSIGN(AutoHideEventFilter); |
112 }; | 112 }; |
113 | 113 |
114 ShelfLayoutManager::AutoHideEventFilter::AutoHideEventFilter( | 114 ShelfLayoutManager::AutoHideEventFilter::AutoHideEventFilter( |
115 ShelfLayoutManager* shelf) | 115 ShelfLayoutManager* shelf) |
116 : shelf_(shelf), | 116 : shelf_(shelf), in_mouse_drag_(false) { |
117 in_mouse_drag_(false) { | |
118 Shell::GetInstance()->AddPreTargetHandler(this); | 117 Shell::GetInstance()->AddPreTargetHandler(this); |
119 } | 118 } |
120 | 119 |
121 ShelfLayoutManager::AutoHideEventFilter::~AutoHideEventFilter() { | 120 ShelfLayoutManager::AutoHideEventFilter::~AutoHideEventFilter() { |
122 Shell::GetInstance()->RemovePreTargetHandler(this); | 121 Shell::GetInstance()->RemovePreTargetHandler(this); |
123 } | 122 } |
124 | 123 |
125 void ShelfLayoutManager::AutoHideEventFilter::OnMouseEvent( | 124 void ShelfLayoutManager::AutoHideEventFilter::OnMouseEvent( |
126 ui::MouseEvent* event) { | 125 ui::MouseEvent* event) { |
127 // This also checks IsShelfWindow() to make sure we don't attempt to hide the | 126 // This also checks IsShelfWindow() to make sure we don't attempt to hide the |
128 // shelf if the mouse down occurs on the shelf. | 127 // shelf if the mouse down occurs on the shelf. |
129 in_mouse_drag_ = (event->type() == ui::ET_MOUSE_DRAGGED || | 128 in_mouse_drag_ = |
130 (in_mouse_drag_ && event->type() != ui::ET_MOUSE_RELEASED && | 129 (event->type() == ui::ET_MOUSE_DRAGGED || |
131 event->type() != ui::ET_MOUSE_CAPTURE_CHANGED)) && | 130 (in_mouse_drag_ && event->type() != ui::ET_MOUSE_RELEASED && |
| 131 event->type() != ui::ET_MOUSE_CAPTURE_CHANGED)) && |
132 !shelf_->IsShelfWindow(static_cast<aura::Window*>(event->target())); | 132 !shelf_->IsShelfWindow(static_cast<aura::Window*>(event->target())); |
133 shelf_->UpdateAutoHideForMouseEvent(event); | 133 shelf_->UpdateAutoHideForMouseEvent(event); |
134 } | 134 } |
135 | 135 |
136 void ShelfLayoutManager::AutoHideEventFilter::OnGestureEvent( | 136 void ShelfLayoutManager::AutoHideEventFilter::OnGestureEvent( |
137 ui::GestureEvent* event) { | 137 ui::GestureEvent* event) { |
138 shelf_->UpdateAutoHideForGestureEvent(event); | 138 shelf_->UpdateAutoHideForGestureEvent(event); |
139 } | 139 } |
140 | 140 |
141 // ShelfLayoutManager:UpdateShelfObserver -------------------------------------- | 141 // ShelfLayoutManager:UpdateShelfObserver -------------------------------------- |
142 | 142 |
143 // UpdateShelfObserver is used to delay updating the background until the | 143 // UpdateShelfObserver is used to delay updating the background until the |
144 // animation completes. | 144 // animation completes. |
145 class ShelfLayoutManager::UpdateShelfObserver | 145 class ShelfLayoutManager::UpdateShelfObserver |
146 : public ui::ImplicitAnimationObserver { | 146 : public ui::ImplicitAnimationObserver { |
147 public: | 147 public: |
148 explicit UpdateShelfObserver(ShelfLayoutManager* shelf) : shelf_(shelf) { | 148 explicit UpdateShelfObserver(ShelfLayoutManager* shelf) : shelf_(shelf) { |
149 shelf_->update_shelf_observer_ = this; | 149 shelf_->update_shelf_observer_ = this; |
150 } | 150 } |
151 | 151 |
152 void Detach() { | 152 void Detach() { shelf_ = NULL; } |
153 shelf_ = NULL; | |
154 } | |
155 | 153 |
156 void OnImplicitAnimationsCompleted() override { | 154 void OnImplicitAnimationsCompleted() override { |
157 if (shelf_) | 155 if (shelf_) |
158 shelf_->UpdateShelfBackground(BACKGROUND_CHANGE_ANIMATE); | 156 shelf_->UpdateShelfBackground(BACKGROUND_CHANGE_ANIMATE); |
159 delete this; | 157 delete this; |
160 } | 158 } |
161 | 159 |
162 private: | 160 private: |
163 ~UpdateShelfObserver() override { | 161 ~UpdateShelfObserver() override { |
164 if (shelf_) | 162 if (shelf_) |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 } | 228 } |
231 | 229 |
232 ShelfLayoutManager::~ShelfLayoutManager() { | 230 ShelfLayoutManager::~ShelfLayoutManager() { |
233 if (update_shelf_observer_) | 231 if (update_shelf_observer_) |
234 update_shelf_observer_->Detach(); | 232 update_shelf_observer_->Detach(); |
235 | 233 |
236 FOR_EACH_OBSERVER(ShelfLayoutManagerObserver, observers_, | 234 FOR_EACH_OBSERVER(ShelfLayoutManagerObserver, observers_, |
237 WillDeleteShelfLayoutManager()); | 235 WillDeleteShelfLayoutManager()); |
238 WmShell::Get()->RemoveShellObserver(this); | 236 WmShell::Get()->RemoveShellObserver(this); |
239 Shell::GetInstance()->lock_state_controller()->RemoveObserver(this); | 237 Shell::GetInstance()->lock_state_controller()->RemoveObserver(this); |
240 Shell::GetInstance()-> | 238 Shell::GetInstance()->session_state_delegate()->RemoveSessionStateObserver( |
241 session_state_delegate()->RemoveSessionStateObserver(this); | 239 this); |
242 if (root_window_controller_observer_) { | 240 if (root_window_controller_observer_) { |
243 WmWindowAura::Get(root_window_) | 241 WmWindowAura::Get(root_window_) |
244 ->GetRootWindowController() | 242 ->GetRootWindowController() |
245 ->RemoveObserver(root_window_controller_observer_.get()); | 243 ->RemoveObserver(root_window_controller_observer_.get()); |
246 } | 244 } |
247 } | 245 } |
248 | 246 |
249 void ShelfLayoutManager::PrepareForShutdown() { | 247 void ShelfLayoutManager::PrepareForShutdown() { |
250 in_shutdown_ = true; | 248 in_shutdown_ = true; |
251 // Clear all event filters, otherwise sometimes those filters may catch | 249 // Clear all event filters, otherwise sometimes those filters may catch |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 SetState(SHELF_VISIBLE); | 314 SetState(SHELF_VISIBLE); |
317 } else if (WmShell::Get()->IsPinned()) { | 315 } else if (WmShell::Get()->IsPinned()) { |
318 SetState(SHELF_HIDDEN); | 316 SetState(SHELF_HIDDEN); |
319 } else { | 317 } else { |
320 // TODO(zelidrag): Verify shelf drag animation still shows on the device | 318 // TODO(zelidrag): Verify shelf drag animation still shows on the device |
321 // when we are in SHELF_AUTO_HIDE_ALWAYS_HIDDEN. | 319 // when we are in SHELF_AUTO_HIDE_ALWAYS_HIDDEN. |
322 wm::WorkspaceWindowState window_state( | 320 wm::WorkspaceWindowState window_state( |
323 workspace_controller_->GetWindowState()); | 321 workspace_controller_->GetWindowState()); |
324 switch (window_state) { | 322 switch (window_state) { |
325 case wm::WORKSPACE_WINDOW_STATE_FULL_SCREEN: { | 323 case wm::WORKSPACE_WINDOW_STATE_FULL_SCREEN: { |
326 const aura::Window* fullscreen_window = GetRootWindowController( | 324 const aura::Window* fullscreen_window = |
327 root_window_)->GetWindowForFullscreenMode(); | 325 GetRootWindowController(root_window_)->GetWindowForFullscreenMode(); |
328 if (fullscreen_window && wm::GetWindowState(fullscreen_window)-> | 326 if (fullscreen_window && |
329 hide_shelf_when_fullscreen()) { | 327 wm::GetWindowState(fullscreen_window) |
| 328 ->hide_shelf_when_fullscreen()) { |
330 SetState(SHELF_HIDDEN); | 329 SetState(SHELF_HIDDEN); |
331 } else { | 330 } else { |
332 // The shelf is sometimes not hidden when in immersive fullscreen. | 331 // The shelf is sometimes not hidden when in immersive fullscreen. |
333 // Force the shelf to be auto hidden in this case. | 332 // Force the shelf to be auto hidden in this case. |
334 SetState(SHELF_AUTO_HIDE); | 333 SetState(SHELF_AUTO_HIDE); |
335 } | 334 } |
336 break; | 335 break; |
337 } | 336 } |
338 | 337 |
339 case wm::WORKSPACE_WINDOW_STATE_MAXIMIZED: | 338 case wm::WORKSPACE_WINDOW_STATE_MAXIMIZED: |
(...skipping 17 matching lines...) Expand all Loading... |
357 if (auto_hide_state == SHELF_AUTO_HIDE_HIDDEN) { | 356 if (auto_hide_state == SHELF_AUTO_HIDE_HIDDEN) { |
358 // Hides happen immediately. | 357 // Hides happen immediately. |
359 SetState(state_.visibility_state); | 358 SetState(state_.visibility_state); |
360 } else { | 359 } else { |
361 if (!auto_hide_timer_.IsRunning()) { | 360 if (!auto_hide_timer_.IsRunning()) { |
362 mouse_over_shelf_when_auto_hide_timer_started_ = | 361 mouse_over_shelf_when_auto_hide_timer_started_ = |
363 shelf_widget_->GetWindowBoundsInScreen().Contains( | 362 shelf_widget_->GetWindowBoundsInScreen().Contains( |
364 display::Screen::GetScreen()->GetCursorScreenPoint()); | 363 display::Screen::GetScreen()->GetCursorScreenPoint()); |
365 } | 364 } |
366 auto_hide_timer_.Start( | 365 auto_hide_timer_.Start( |
367 FROM_HERE, | 366 FROM_HERE, base::TimeDelta::FromMilliseconds(kAutoHideDelayMS), this, |
368 base::TimeDelta::FromMilliseconds(kAutoHideDelayMS), | 367 &ShelfLayoutManager::UpdateAutoHideStateNow); |
369 this, &ShelfLayoutManager::UpdateAutoHideStateNow); | |
370 } | 368 } |
371 } else { | 369 } else { |
372 StopAutoHideTimer(); | 370 StopAutoHideTimer(); |
373 } | 371 } |
374 } | 372 } |
375 | 373 |
376 void ShelfLayoutManager::UpdateAutoHideForMouseEvent(ui::MouseEvent* event) { | 374 void ShelfLayoutManager::UpdateAutoHideForMouseEvent(ui::MouseEvent* event) { |
377 // Don't update during shutdown because synthetic mouse events (e.g. mouse | 375 // Don't update during shutdown because synthetic mouse events (e.g. mouse |
378 // exit) may be generated during status area widget teardown. | 376 // exit) may be generated during status area widget teardown. |
379 if (visibility_state() != SHELF_AUTO_HIDE || in_shutdown_) | 377 if (visibility_state() != SHELF_AUTO_HIDE || in_shutdown_) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 gesture_drag_auto_hide_state_ = SHELF_AUTO_HIDE_SHOWN; | 417 gesture_drag_auto_hide_state_ = SHELF_AUTO_HIDE_SHOWN; |
420 gesture_drag_status_ = GESTURE_DRAG_COMPLETE_IN_PROGRESS; | 418 gesture_drag_status_ = GESTURE_DRAG_COMPLETE_IN_PROGRESS; |
421 UpdateVisibilityState(); | 419 UpdateVisibilityState(); |
422 gesture_drag_status_ = GESTURE_DRAG_NONE; | 420 gesture_drag_status_ = GESTURE_DRAG_NONE; |
423 } | 421 } |
424 } | 422 } |
425 | 423 |
426 void ShelfLayoutManager::StartGestureDrag(const ui::GestureEvent& gesture) { | 424 void ShelfLayoutManager::StartGestureDrag(const ui::GestureEvent& gesture) { |
427 gesture_drag_status_ = GESTURE_DRAG_IN_PROGRESS; | 425 gesture_drag_status_ = GESTURE_DRAG_IN_PROGRESS; |
428 gesture_drag_amount_ = 0.f; | 426 gesture_drag_amount_ = 0.f; |
429 gesture_drag_auto_hide_state_ = visibility_state() == SHELF_AUTO_HIDE ? | 427 gesture_drag_auto_hide_state_ = visibility_state() == SHELF_AUTO_HIDE |
430 auto_hide_state() : SHELF_AUTO_HIDE_SHOWN; | 428 ? auto_hide_state() |
| 429 : SHELF_AUTO_HIDE_SHOWN; |
431 UpdateShelfBackground(BACKGROUND_CHANGE_ANIMATE); | 430 UpdateShelfBackground(BACKGROUND_CHANGE_ANIMATE); |
432 } | 431 } |
433 | 432 |
434 void ShelfLayoutManager::UpdateGestureDrag(const ui::GestureEvent& gesture) { | 433 void ShelfLayoutManager::UpdateGestureDrag(const ui::GestureEvent& gesture) { |
435 gesture_drag_amount_ += PrimaryAxisValue(gesture.details().scroll_y(), | 434 gesture_drag_amount_ += PrimaryAxisValue(gesture.details().scroll_y(), |
436 gesture.details().scroll_x()); | 435 gesture.details().scroll_x()); |
437 LayoutShelf(); | 436 LayoutShelf(); |
438 } | 437 } |
439 | 438 |
440 void ShelfLayoutManager::CompleteGestureDrag(const ui::GestureEvent& gesture) { | 439 void ShelfLayoutManager::CompleteGestureDrag(const ui::GestureEvent& gesture) { |
(...skipping 18 matching lines...) Expand all Loading... |
459 correct_direction = gesture_drag_amount_ < 0; | 458 correct_direction = gesture_drag_amount_ < 0; |
460 break; | 459 break; |
461 case SHELF_ALIGNMENT_LEFT: | 460 case SHELF_ALIGNMENT_LEFT: |
462 correct_direction = gesture_drag_amount_ > 0; | 461 correct_direction = gesture_drag_amount_ > 0; |
463 break; | 462 break; |
464 } | 463 } |
465 should_change = correct_direction && drag_ratio > kDragHideThreshold; | 464 should_change = correct_direction && drag_ratio > kDragHideThreshold; |
466 } | 465 } |
467 } else if (gesture.type() == ui::ET_SCROLL_FLING_START) { | 466 } else if (gesture.type() == ui::ET_SCROLL_FLING_START) { |
468 if (gesture_drag_auto_hide_state_ == SHELF_AUTO_HIDE_SHOWN) { | 467 if (gesture_drag_auto_hide_state_ == SHELF_AUTO_HIDE_SHOWN) { |
469 should_change = horizontal ? fabs(gesture.details().velocity_y()) > 0 : | 468 should_change = horizontal ? fabs(gesture.details().velocity_y()) > 0 |
470 fabs(gesture.details().velocity_x()) > 0; | 469 : fabs(gesture.details().velocity_x()) > 0; |
471 } else { | 470 } else { |
472 should_change = | 471 should_change = |
473 SelectValueForShelfAlignment(gesture.details().velocity_y() < 0, | 472 SelectValueForShelfAlignment(gesture.details().velocity_y() < 0, |
474 gesture.details().velocity_x() > 0, | 473 gesture.details().velocity_x() > 0, |
475 gesture.details().velocity_x() < 0); | 474 gesture.details().velocity_x() < 0); |
476 } | 475 } |
477 } else { | 476 } else { |
478 NOTREACHED(); | 477 NOTREACHED(); |
479 } | 478 } |
480 | 479 |
481 if (!should_change) { | 480 if (!should_change) { |
482 CancelGestureDrag(); | 481 CancelGestureDrag(); |
483 return; | 482 return; |
484 } | 483 } |
485 if (shelf_widget_) { | 484 if (shelf_widget_) { |
486 shelf_widget_->Deactivate(); | 485 shelf_widget_->Deactivate(); |
487 shelf_widget_->status_area_widget()->Deactivate(); | 486 shelf_widget_->status_area_widget()->Deactivate(); |
488 } | 487 } |
489 gesture_drag_auto_hide_state_ = | 488 gesture_drag_auto_hide_state_ = |
490 gesture_drag_auto_hide_state_ == SHELF_AUTO_HIDE_SHOWN ? | 489 gesture_drag_auto_hide_state_ == SHELF_AUTO_HIDE_SHOWN |
491 SHELF_AUTO_HIDE_HIDDEN : SHELF_AUTO_HIDE_SHOWN; | 490 ? SHELF_AUTO_HIDE_HIDDEN |
| 491 : SHELF_AUTO_HIDE_SHOWN; |
492 ShelfAutoHideBehavior new_auto_hide_behavior = | 492 ShelfAutoHideBehavior new_auto_hide_behavior = |
493 gesture_drag_auto_hide_state_ == SHELF_AUTO_HIDE_SHOWN ? | 493 gesture_drag_auto_hide_state_ == SHELF_AUTO_HIDE_SHOWN |
494 SHELF_AUTO_HIDE_BEHAVIOR_NEVER : SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS; | 494 ? SHELF_AUTO_HIDE_BEHAVIOR_NEVER |
| 495 : SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS; |
495 | 496 |
496 // When in fullscreen and the shelf is forced to be auto hidden, the auto hide | 497 // When in fullscreen and the shelf is forced to be auto hidden, the auto hide |
497 // behavior affects neither the visibility state nor the auto hide state. Set | 498 // behavior affects neither the visibility state nor the auto hide state. Set |
498 // |gesture_drag_status_| to GESTURE_DRAG_COMPLETE_IN_PROGRESS to set the auto | 499 // |gesture_drag_status_| to GESTURE_DRAG_COMPLETE_IN_PROGRESS to set the auto |
499 // hide state to |gesture_drag_auto_hide_state_|. | 500 // hide state to |gesture_drag_auto_hide_state_|. |
500 gesture_drag_status_ = GESTURE_DRAG_COMPLETE_IN_PROGRESS; | 501 gesture_drag_status_ = GESTURE_DRAG_COMPLETE_IN_PROGRESS; |
501 Shelf* shelf = shelf_widget_->shelf(); | 502 Shelf* shelf = shelf_widget_->shelf(); |
502 if (shelf->auto_hide_behavior() != new_auto_hide_behavior) | 503 if (shelf->auto_hide_behavior() != new_auto_hide_behavior) |
503 shelf->SetAutoHideBehavior(new_auto_hide_behavior); | 504 shelf->SetAutoHideBehavior(new_auto_hide_behavior); |
504 else | 505 else |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
656 } else { | 657 } else { |
657 UpdateShelfBackground(change_type); | 658 UpdateShelfBackground(change_type); |
658 } | 659 } |
659 | 660 |
660 shelf_widget_->SetDimsShelf(state.visibility_state == SHELF_VISIBLE && | 661 shelf_widget_->SetDimsShelf(state.visibility_state == SHELF_VISIBLE && |
661 state.window_state == | 662 state.window_state == |
662 wm::WORKSPACE_WINDOW_STATE_MAXIMIZED); | 663 wm::WORKSPACE_WINDOW_STATE_MAXIMIZED); |
663 | 664 |
664 TargetBounds target_bounds; | 665 TargetBounds target_bounds; |
665 CalculateTargetBounds(state_, &target_bounds); | 666 CalculateTargetBounds(state_, &target_bounds); |
666 UpdateBoundsAndOpacity(target_bounds, true, | 667 UpdateBoundsAndOpacity(target_bounds, true, delay_background_change |
667 delay_background_change ? update_shelf_observer_ : NULL); | 668 ? update_shelf_observer_ |
| 669 : NULL); |
668 | 670 |
669 // The delegate must be notified after |state_| is updated so that it can | 671 // The delegate must be notified after |state_| is updated so that it can |
670 // query the new target bounds. | 672 // query the new target bounds. |
671 ShelfDelegate* shelf_delegate = Shell::GetInstance()->GetShelfDelegate(); | 673 ShelfDelegate* shelf_delegate = Shell::GetInstance()->GetShelfDelegate(); |
672 if (old_state.visibility_state != state_.visibility_state) | 674 if (old_state.visibility_state != state_.visibility_state) |
673 shelf_delegate->OnShelfVisibilityStateChanged(shelf_widget_->shelf()); | 675 shelf_delegate->OnShelfVisibilityStateChanged(shelf_widget_->shelf()); |
674 | 676 |
675 // OnAutoHideStateChanged Should be emitted when: | 677 // OnAutoHideStateChanged Should be emitted when: |
676 // - firstly state changed to auto-hide from other state | 678 // - firstly state changed to auto-hide from other state |
677 // - or, auto_hide_state has changed | 679 // - or, auto_hide_state has changed |
(...skipping 10 matching lines...) Expand all Loading... |
688 const TargetBounds& target_bounds, | 690 const TargetBounds& target_bounds, |
689 bool animate, | 691 bool animate, |
690 ui::ImplicitAnimationObserver* observer) { | 692 ui::ImplicitAnimationObserver* observer) { |
691 base::AutoReset<bool> auto_reset_updating_bounds(&updating_bounds_, true); | 693 base::AutoReset<bool> auto_reset_updating_bounds(&updating_bounds_, true); |
692 { | 694 { |
693 ui::ScopedLayerAnimationSettings shelf_animation_setter( | 695 ui::ScopedLayerAnimationSettings shelf_animation_setter( |
694 GetLayer(shelf_widget_)->GetAnimator()); | 696 GetLayer(shelf_widget_)->GetAnimator()); |
695 ui::ScopedLayerAnimationSettings status_animation_setter( | 697 ui::ScopedLayerAnimationSettings status_animation_setter( |
696 GetLayer(shelf_widget_->status_area_widget())->GetAnimator()); | 698 GetLayer(shelf_widget_->status_area_widget())->GetAnimator()); |
697 if (animate) { | 699 if (animate) { |
698 int duration = duration_override_in_ms_ ? duration_override_in_ms_ : | 700 int duration = duration_override_in_ms_ ? duration_override_in_ms_ |
699 kCrossFadeDurationMS; | 701 : kCrossFadeDurationMS; |
700 shelf_animation_setter.SetTransitionDuration( | 702 shelf_animation_setter.SetTransitionDuration( |
701 base::TimeDelta::FromMilliseconds(duration)); | 703 base::TimeDelta::FromMilliseconds(duration)); |
702 shelf_animation_setter.SetTweenType(gfx::Tween::EASE_OUT); | 704 shelf_animation_setter.SetTweenType(gfx::Tween::EASE_OUT); |
703 shelf_animation_setter.SetPreemptionStrategy( | 705 shelf_animation_setter.SetPreemptionStrategy( |
704 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 706 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
705 status_animation_setter.SetTransitionDuration( | 707 status_animation_setter.SetTransitionDuration( |
706 base::TimeDelta::FromMilliseconds(duration)); | 708 base::TimeDelta::FromMilliseconds(duration)); |
707 status_animation_setter.SetTweenType(gfx::Tween::EASE_OUT); | 709 status_animation_setter.SetTweenType(gfx::Tween::EASE_OUT); |
708 status_animation_setter.SetPreemptionStrategy( | 710 status_animation_setter.SetPreemptionStrategy( |
709 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 711 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 gfx::Rect(shelf_origin.x(), shelf_origin.y(), shelf_width, shelf_height); | 809 gfx::Rect(shelf_origin.x(), shelf_origin.y(), shelf_width, shelf_height); |
808 | 810 |
809 gfx::Size status_size( | 811 gfx::Size status_size( |
810 shelf_widget_->status_area_widget()->GetWindowBoundsInScreen().size()); | 812 shelf_widget_->status_area_widget()->GetWindowBoundsInScreen().size()); |
811 if (IsHorizontalAlignment()) | 813 if (IsHorizontalAlignment()) |
812 status_size.set_height(GetShelfConstant(SHELF_SIZE)); | 814 status_size.set_height(GetShelfConstant(SHELF_SIZE)); |
813 else | 815 else |
814 status_size.set_width(GetShelfConstant(SHELF_SIZE)); | 816 status_size.set_width(GetShelfConstant(SHELF_SIZE)); |
815 | 817 |
816 gfx::Point status_origin = SelectValueForShelfAlignment( | 818 gfx::Point status_origin = SelectValueForShelfAlignment( |
817 gfx::Point(0, 0), | 819 gfx::Point(0, 0), gfx::Point(shelf_width - status_size.width(), |
818 gfx::Point(shelf_width - status_size.width(), | 820 shelf_height - status_size.height()), |
819 shelf_height - status_size.height()), | |
820 gfx::Point(0, shelf_height - status_size.height())); | 821 gfx::Point(0, shelf_height - status_size.height())); |
821 if (IsHorizontalAlignment() && !base::i18n::IsRTL()) | 822 if (IsHorizontalAlignment() && !base::i18n::IsRTL()) |
822 status_origin.set_x(shelf_width - status_size.width()); | 823 status_origin.set_x(shelf_width - status_size.width()); |
823 target_bounds->status_bounds_in_shelf = gfx::Rect(status_origin, status_size); | 824 target_bounds->status_bounds_in_shelf = gfx::Rect(status_origin, status_size); |
824 | 825 |
825 target_bounds->work_area_insets = SelectValueForShelfAlignment( | 826 target_bounds->work_area_insets = SelectValueForShelfAlignment( |
826 gfx::Insets(0, 0, GetWorkAreaInsets(state, shelf_height), 0), | 827 gfx::Insets(0, 0, GetWorkAreaInsets(state, shelf_height), 0), |
827 gfx::Insets(0, GetWorkAreaInsets(state, shelf_width), 0, 0), | 828 gfx::Insets(0, GetWorkAreaInsets(state, shelf_width), 0, 0), |
828 gfx::Insets(0, 0, 0, GetWorkAreaInsets(state, shelf_width))); | 829 gfx::Insets(0, 0, 0, GetWorkAreaInsets(state, shelf_width))); |
829 | 830 |
830 // TODO(varkha): The functionality of managing insets for display areas | 831 // TODO(varkha): The functionality of managing insets for display areas |
831 // should probably be pushed to a separate component. This would simplify or | 832 // should probably be pushed to a separate component. This would simplify or |
832 // remove entirely the dependency on keyboard and dock. | 833 // remove entirely the dependency on keyboard and dock. |
833 | 834 |
834 if (!keyboard_bounds_.IsEmpty() && !keyboard::IsKeyboardOverscrollEnabled()) { | 835 if (!keyboard_bounds_.IsEmpty() && !keyboard::IsKeyboardOverscrollEnabled()) { |
835 // Also push in the work area inset for the keyboard if it is visible. | 836 // Also push in the work area inset for the keyboard if it is visible. |
836 gfx::Insets keyboard_insets(0, 0, keyboard_bounds_.height(), 0); | 837 gfx::Insets keyboard_insets(0, 0, keyboard_bounds_.height(), 0); |
837 target_bounds->work_area_insets += keyboard_insets; | 838 target_bounds->work_area_insets += keyboard_insets; |
838 } | 839 } |
839 | 840 |
840 // Also push in the work area inset for the dock if it is visible. | 841 // Also push in the work area inset for the dock if it is visible. |
841 if (!dock_bounds_.IsEmpty()) { | 842 if (!dock_bounds_.IsEmpty()) { |
842 gfx::Insets dock_insets( | 843 gfx::Insets dock_insets( |
843 0, (dock_bounds_.x() > 0 ? 0 : dock_bounds_.width()), | 844 0, (dock_bounds_.x() > 0 ? 0 : dock_bounds_.width()), 0, |
844 0, (dock_bounds_.x() > 0 ? dock_bounds_.width() : 0)); | 845 (dock_bounds_.x() > 0 ? dock_bounds_.width() : 0)); |
845 target_bounds->work_area_insets += dock_insets; | 846 target_bounds->work_area_insets += dock_insets; |
846 } | 847 } |
847 | 848 |
848 // Also push in the work area insets for the ChromeVox panel if it's visible. | 849 // Also push in the work area insets for the ChromeVox panel if it's visible. |
849 if (chromevox_panel_height_) { | 850 if (chromevox_panel_height_) { |
850 gfx::Insets chromevox_insets(chromevox_panel_height_, 0, 0, 0); | 851 gfx::Insets chromevox_insets(chromevox_panel_height_, 0, 0, 0); |
851 target_bounds->work_area_insets += chromevox_insets; | 852 target_bounds->work_area_insets += chromevox_insets; |
852 } | 853 } |
853 | 854 |
854 target_bounds->opacity = ComputeTargetOpacity(state); | 855 target_bounds->opacity = ComputeTargetOpacity(state); |
855 target_bounds->status_opacity = | 856 target_bounds->status_opacity = |
856 (state.visibility_state == SHELF_AUTO_HIDE && | 857 (state.visibility_state == SHELF_AUTO_HIDE && |
857 state.auto_hide_state == SHELF_AUTO_HIDE_HIDDEN && | 858 state.auto_hide_state == SHELF_AUTO_HIDE_HIDDEN && |
858 gesture_drag_status_ != GESTURE_DRAG_IN_PROGRESS) ? | 859 gesture_drag_status_ != GESTURE_DRAG_IN_PROGRESS) |
859 0.0f : target_bounds->opacity; | 860 ? 0.0f |
| 861 : target_bounds->opacity; |
860 | 862 |
861 if (gesture_drag_status_ == GESTURE_DRAG_IN_PROGRESS) | 863 if (gesture_drag_status_ == GESTURE_DRAG_IN_PROGRESS) |
862 UpdateTargetBoundsForGesture(target_bounds); | 864 UpdateTargetBoundsForGesture(target_bounds); |
863 | 865 |
864 // This needs to happen after calling UpdateTargetBoundsForGesture(), because | 866 // This needs to happen after calling UpdateTargetBoundsForGesture(), because |
865 // that can change the size of the shelf. | 867 // that can change the size of the shelf. |
866 target_bounds->shelf_bounds_in_shelf = SelectValueForShelfAlignment( | 868 target_bounds->shelf_bounds_in_shelf = SelectValueForShelfAlignment( |
867 gfx::Rect(0, 0, shelf_width - status_size.width(), | 869 gfx::Rect(0, 0, shelf_width - status_size.width(), |
868 target_bounds->shelf_bounds_in_root.height()), | 870 target_bounds->shelf_bounds_in_root.height()), |
869 gfx::Rect(0, 0, target_bounds->shelf_bounds_in_root.width(), | 871 gfx::Rect(0, 0, target_bounds->shelf_bounds_in_root.width(), |
(...skipping 19 matching lines...) Expand all Loading... |
889 visibility_state() == SHELF_AUTO_HIDE && | 891 visibility_state() == SHELF_AUTO_HIDE && |
890 auto_hide_state() != SHELF_AUTO_HIDE_SHOWN) { | 892 auto_hide_state() != SHELF_AUTO_HIDE_SHOWN) { |
891 // If the shelf was hidden when the drag started (and the state hasn't | 893 // If the shelf was hidden when the drag started (and the state hasn't |
892 // changed since then, e.g. because the tray-menu was shown because of the | 894 // changed since then, e.g. because the tray-menu was shown because of the |
893 // drag), then allow the drag some resistance-free region at first to make | 895 // drag), then allow the drag some resistance-free region at first to make |
894 // sure the shelf sticks with the finger until the shelf is visible. | 896 // sure the shelf sticks with the finger until the shelf is visible. |
895 resistance_free_region = GetShelfConstant(SHELF_SIZE) - kShelfAutoHideSize; | 897 resistance_free_region = GetShelfConstant(SHELF_SIZE) - kShelfAutoHideSize; |
896 } | 898 } |
897 | 899 |
898 bool resist = SelectValueForShelfAlignment( | 900 bool resist = SelectValueForShelfAlignment( |
899 gesture_drag_amount_ < -resistance_free_region, | 901 gesture_drag_amount_<-resistance_free_region, gesture_drag_amount_> |
900 gesture_drag_amount_ > resistance_free_region, | 902 resistance_free_region, |
901 gesture_drag_amount_ < -resistance_free_region); | 903 gesture_drag_amount_ < -resistance_free_region); |
902 | 904 |
903 float translate = 0.f; | 905 float translate = 0.f; |
904 if (resist) { | 906 if (resist) { |
905 float diff = fabsf(gesture_drag_amount_) - resistance_free_region; | 907 float diff = fabsf(gesture_drag_amount_) - resistance_free_region; |
906 diff = std::min(diff, sqrtf(diff)); | 908 diff = std::min(diff, sqrtf(diff)); |
907 if (gesture_drag_amount_ < 0) | 909 if (gesture_drag_amount_ < 0) |
908 translate = -resistance_free_region - diff; | 910 translate = -resistance_free_region - diff; |
909 else | 911 else |
910 translate = resistance_free_region + diff; | 912 translate = resistance_free_region + diff; |
911 } else { | 913 } else { |
912 translate = gesture_drag_amount_; | 914 translate = gesture_drag_amount_; |
913 } | 915 } |
914 int shelf_insets = GetShelfConstant(SHELF_INSETS_FOR_AUTO_HIDE); | 916 int shelf_insets = GetShelfConstant(SHELF_INSETS_FOR_AUTO_HIDE); |
915 if (horizontal) { | 917 if (horizontal) { |
916 // Move and size the shelf with the gesture. | 918 // Move and size the shelf with the gesture. |
917 int shelf_height = target_bounds->shelf_bounds_in_root.height() - translate; | 919 int shelf_height = target_bounds->shelf_bounds_in_root.height() - translate; |
918 shelf_height = std::max(shelf_height, shelf_insets); | 920 shelf_height = std::max(shelf_height, shelf_insets); |
919 target_bounds->shelf_bounds_in_root.set_height(shelf_height); | 921 target_bounds->shelf_bounds_in_root.set_height(shelf_height); |
920 if (IsHorizontalAlignment()) { | 922 if (IsHorizontalAlignment()) { |
921 target_bounds->shelf_bounds_in_root.set_y( | 923 target_bounds->shelf_bounds_in_root.set_y(available_bounds.bottom() - |
922 available_bounds.bottom() - shelf_height); | 924 shelf_height); |
923 } | 925 } |
924 | 926 |
925 target_bounds->status_bounds_in_shelf.set_y(0); | 927 target_bounds->status_bounds_in_shelf.set_y(0); |
926 } else { | 928 } else { |
927 // Move and size the shelf with the gesture. | 929 // Move and size the shelf with the gesture. |
928 int shelf_width = target_bounds->shelf_bounds_in_root.width(); | 930 int shelf_width = target_bounds->shelf_bounds_in_root.width(); |
929 bool right_aligned = GetAlignment() == SHELF_ALIGNMENT_RIGHT; | 931 bool right_aligned = GetAlignment() == SHELF_ALIGNMENT_RIGHT; |
930 if (right_aligned) | 932 if (right_aligned) |
931 shelf_width -= translate; | 933 shelf_width -= translate; |
932 else | 934 else |
933 shelf_width += translate; | 935 shelf_width += translate; |
934 shelf_width = std::max(shelf_width, shelf_insets); | 936 shelf_width = std::max(shelf_width, shelf_insets); |
935 target_bounds->shelf_bounds_in_root.set_width(shelf_width); | 937 target_bounds->shelf_bounds_in_root.set_width(shelf_width); |
936 if (right_aligned) { | 938 if (right_aligned) { |
937 target_bounds->shelf_bounds_in_root.set_x( | 939 target_bounds->shelf_bounds_in_root.set_x(available_bounds.right() - |
938 available_bounds.right() - shelf_width); | 940 shelf_width); |
939 } | 941 } |
940 | 942 |
941 if (right_aligned) { | 943 if (right_aligned) { |
942 target_bounds->status_bounds_in_shelf.set_x(0); | 944 target_bounds->status_bounds_in_shelf.set_x(0); |
943 } else { | 945 } else { |
944 target_bounds->status_bounds_in_shelf.set_x( | 946 target_bounds->status_bounds_in_shelf.set_x( |
945 target_bounds->shelf_bounds_in_root.width() - | 947 target_bounds->shelf_bounds_in_root.width() - |
946 GetShelfConstant(SHELF_SIZE)); | 948 GetShelfConstant(SHELF_SIZE)); |
947 } | 949 } |
948 } | 950 } |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 if (ash::MaterialDesignController::IsShelfMaterial()) { | 1207 if (ash::MaterialDesignController::IsShelfMaterial()) { |
1206 return (state.visibility_state == SHELF_AUTO_HIDE && | 1208 return (state.visibility_state == SHELF_AUTO_HIDE && |
1207 state.auto_hide_state == SHELF_AUTO_HIDE_SHOWN) | 1209 state.auto_hide_state == SHELF_AUTO_HIDE_SHOWN) |
1208 ? 1.0f | 1210 ? 1.0f |
1209 : 0.0f; | 1211 : 0.0f; |
1210 } | 1212 } |
1211 return (state.visibility_state == SHELF_AUTO_HIDE) ? 1.0f : 0.0f; | 1213 return (state.visibility_state == SHELF_AUTO_HIDE) ? 1.0f : 0.0f; |
1212 } | 1214 } |
1213 | 1215 |
1214 } // namespace ash | 1216 } // namespace ash |
OLD | NEW |