| 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 <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 bool ShelfLayoutManager::IsVisible() const { | 184 bool ShelfLayoutManager::IsVisible() const { |
| 185 // status_area_widget() may be nullptr during the shutdown. | 185 // status_area_widget() may be nullptr during the shutdown. |
| 186 return shelf_widget_->status_area_widget() && | 186 return shelf_widget_->status_area_widget() && |
| 187 shelf_widget_->status_area_widget()->IsVisible() && | 187 shelf_widget_->status_area_widget()->IsVisible() && |
| 188 (state_.visibility_state == SHELF_VISIBLE || | 188 (state_.visibility_state == SHELF_VISIBLE || |
| 189 (state_.visibility_state == SHELF_AUTO_HIDE && | 189 (state_.visibility_state == SHELF_AUTO_HIDE && |
| 190 state_.auto_hide_state == SHELF_AUTO_HIDE_SHOWN)); | 190 state_.auto_hide_state == SHELF_AUTO_HIDE_SHOWN)); |
| 191 } | 191 } |
| 192 | 192 |
| 193 gfx::Rect ShelfLayoutManager::GetIdealBounds() { | 193 gfx::Rect ShelfLayoutManager::GetIdealBounds() { |
| 194 const int shelf_size = GetShelfConstant(SHELF_SIZE); | |
| 195 WmWindow* shelf_window = WmWindow::Get(shelf_widget_->GetNativeWindow()); | 194 WmWindow* shelf_window = WmWindow::Get(shelf_widget_->GetNativeWindow()); |
| 196 gfx::Rect rect(wm::GetDisplayBoundsInParent(shelf_window)); | 195 gfx::Rect rect(wm::GetDisplayBoundsInParent(shelf_window)); |
| 197 return SelectValueForShelfAlignment( | 196 return SelectValueForShelfAlignment( |
| 198 gfx::Rect(rect.x(), rect.bottom() - shelf_size, rect.width(), shelf_size), | 197 gfx::Rect(rect.x(), rect.bottom() - kShelfSize, rect.width(), kShelfSize), |
| 199 gfx::Rect(rect.x(), rect.y(), shelf_size, rect.height()), | 198 gfx::Rect(rect.x(), rect.y(), kShelfSize, rect.height()), |
| 200 gfx::Rect(rect.right() - shelf_size, rect.y(), shelf_size, | 199 gfx::Rect(rect.right() - kShelfSize, rect.y(), kShelfSize, |
| 201 rect.height())); | 200 rect.height())); |
| 202 } | 201 } |
| 203 | 202 |
| 204 gfx::Size ShelfLayoutManager::GetPreferredSize() { | 203 gfx::Size ShelfLayoutManager::GetPreferredSize() { |
| 205 TargetBounds target_bounds; | 204 TargetBounds target_bounds; |
| 206 CalculateTargetBounds(state_, &target_bounds); | 205 CalculateTargetBounds(state_, &target_bounds); |
| 207 return target_bounds.shelf_bounds_in_root.size(); | 206 return target_bounds.shelf_bounds_in_root.size(); |
| 208 } | 207 } |
| 209 | 208 |
| 210 void ShelfLayoutManager::LayoutShelfAndUpdateBounds(bool change_work_area) { | 209 void ShelfLayoutManager::LayoutShelfAndUpdateBounds(bool change_work_area) { |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 652 shelf_widget_->status_area_widget()->Show(); | 651 shelf_widget_->status_area_widget()->Show(); |
| 653 } | 652 } |
| 654 | 653 |
| 655 void ShelfLayoutManager::StopAnimating() { | 654 void ShelfLayoutManager::StopAnimating() { |
| 656 GetLayer(shelf_widget_)->GetAnimator()->StopAnimating(); | 655 GetLayer(shelf_widget_)->GetAnimator()->StopAnimating(); |
| 657 GetLayer(shelf_widget_->status_area_widget())->GetAnimator()->StopAnimating(); | 656 GetLayer(shelf_widget_->status_area_widget())->GetAnimator()->StopAnimating(); |
| 658 } | 657 } |
| 659 | 658 |
| 660 void ShelfLayoutManager::CalculateTargetBounds(const State& state, | 659 void ShelfLayoutManager::CalculateTargetBounds(const State& state, |
| 661 TargetBounds* target_bounds) { | 660 TargetBounds* target_bounds) { |
| 662 int shelf_size = GetShelfConstant(SHELF_SIZE); | 661 int shelf_size = kShelfSize; |
| 663 if (state.visibility_state == SHELF_AUTO_HIDE && | 662 if (state.visibility_state == SHELF_AUTO_HIDE && |
| 664 state.auto_hide_state == SHELF_AUTO_HIDE_HIDDEN) { | 663 state.auto_hide_state == SHELF_AUTO_HIDE_HIDDEN) { |
| 665 // Auto-hidden shelf always starts with the default size. If a gesture-drag | 664 // Auto-hidden shelf always starts with the default size. If a gesture-drag |
| 666 // is in progress, then the call to UpdateTargetBoundsForGesture() below | 665 // is in progress, then the call to UpdateTargetBoundsForGesture() below |
| 667 // takes care of setting the height properly. | 666 // takes care of setting the height properly. |
| 668 shelf_size = kShelfAutoHideSize; | 667 shelf_size = kShelfAutoHideSize; |
| 669 } else if (state.visibility_state == SHELF_HIDDEN || | 668 } else if (state.visibility_state == SHELF_HIDDEN || |
| 670 (!keyboard_bounds_.IsEmpty() && | 669 (!keyboard_bounds_.IsEmpty() && |
| 671 !keyboard::IsKeyboardOverscrollEnabled())) { | 670 !keyboard::IsKeyboardOverscrollEnabled())) { |
| 672 shelf_size = 0; | 671 shelf_size = 0; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 686 gfx::Point shelf_origin = SelectValueForShelfAlignment( | 685 gfx::Point shelf_origin = SelectValueForShelfAlignment( |
| 687 gfx::Point(available_bounds.x(), bottom_shelf_vertical_offset), | 686 gfx::Point(available_bounds.x(), bottom_shelf_vertical_offset), |
| 688 gfx::Point(available_bounds.x(), available_bounds.y()), | 687 gfx::Point(available_bounds.x(), available_bounds.y()), |
| 689 gfx::Point(available_bounds.right() - shelf_width, available_bounds.y())); | 688 gfx::Point(available_bounds.right() - shelf_width, available_bounds.y())); |
| 690 target_bounds->shelf_bounds_in_root = | 689 target_bounds->shelf_bounds_in_root = |
| 691 gfx::Rect(shelf_origin.x(), shelf_origin.y(), shelf_width, shelf_height); | 690 gfx::Rect(shelf_origin.x(), shelf_origin.y(), shelf_width, shelf_height); |
| 692 | 691 |
| 693 gfx::Size status_size( | 692 gfx::Size status_size( |
| 694 shelf_widget_->status_area_widget()->GetWindowBoundsInScreen().size()); | 693 shelf_widget_->status_area_widget()->GetWindowBoundsInScreen().size()); |
| 695 if (wm_shelf_->IsHorizontalAlignment()) | 694 if (wm_shelf_->IsHorizontalAlignment()) |
| 696 status_size.set_height(GetShelfConstant(SHELF_SIZE)); | 695 status_size.set_height(kShelfSize); |
| 697 else | 696 else |
| 698 status_size.set_width(GetShelfConstant(SHELF_SIZE)); | 697 status_size.set_width(kShelfSize); |
| 699 | 698 |
| 700 gfx::Point status_origin = SelectValueForShelfAlignment( | 699 gfx::Point status_origin = SelectValueForShelfAlignment( |
| 701 gfx::Point(0, 0), gfx::Point(shelf_width - status_size.width(), | 700 gfx::Point(0, 0), gfx::Point(shelf_width - status_size.width(), |
| 702 shelf_height - status_size.height()), | 701 shelf_height - status_size.height()), |
| 703 gfx::Point(0, shelf_height - status_size.height())); | 702 gfx::Point(0, shelf_height - status_size.height())); |
| 704 if (wm_shelf_->IsHorizontalAlignment() && !base::i18n::IsRTL()) | 703 if (wm_shelf_->IsHorizontalAlignment() && !base::i18n::IsRTL()) |
| 705 status_origin.set_x(shelf_width - status_size.width()); | 704 status_origin.set_x(shelf_width - status_size.width()); |
| 706 target_bounds->status_bounds_in_shelf = gfx::Rect(status_origin, status_size); | 705 target_bounds->status_bounds_in_shelf = gfx::Rect(status_origin, status_size); |
| 707 | 706 |
| 708 target_bounds->work_area_insets = SelectValueForShelfAlignment( | 707 target_bounds->work_area_insets = SelectValueForShelfAlignment( |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 gfx::Rect available_bounds = wm::GetDisplayBoundsWithShelf(window); | 761 gfx::Rect available_bounds = wm::GetDisplayBoundsWithShelf(window); |
| 763 int resistance_free_region = 0; | 762 int resistance_free_region = 0; |
| 764 | 763 |
| 765 if (gesture_drag_auto_hide_state_ == SHELF_AUTO_HIDE_HIDDEN && | 764 if (gesture_drag_auto_hide_state_ == SHELF_AUTO_HIDE_HIDDEN && |
| 766 visibility_state() == SHELF_AUTO_HIDE && | 765 visibility_state() == SHELF_AUTO_HIDE && |
| 767 auto_hide_state() != SHELF_AUTO_HIDE_SHOWN) { | 766 auto_hide_state() != SHELF_AUTO_HIDE_SHOWN) { |
| 768 // If the shelf was hidden when the drag started (and the state hasn't | 767 // If the shelf was hidden when the drag started (and the state hasn't |
| 769 // changed since then, e.g. because the tray-menu was shown because of the | 768 // changed since then, e.g. because the tray-menu was shown because of the |
| 770 // drag), then allow the drag some resistance-free region at first to make | 769 // drag), then allow the drag some resistance-free region at first to make |
| 771 // sure the shelf sticks with the finger until the shelf is visible. | 770 // sure the shelf sticks with the finger until the shelf is visible. |
| 772 resistance_free_region = GetShelfConstant(SHELF_SIZE) - kShelfAutoHideSize; | 771 resistance_free_region = kShelfSize - kShelfAutoHideSize; |
| 773 } | 772 } |
| 774 | 773 |
| 775 bool resist = SelectValueForShelfAlignment( | 774 bool resist = SelectValueForShelfAlignment( |
| 776 gesture_drag_amount_<-resistance_free_region, gesture_drag_amount_> | 775 gesture_drag_amount_<-resistance_free_region, gesture_drag_amount_> |
| 777 resistance_free_region, | 776 resistance_free_region, |
| 778 gesture_drag_amount_ < -resistance_free_region); | 777 gesture_drag_amount_ < -resistance_free_region); |
| 779 | 778 |
| 780 float translate = 0.f; | 779 float translate = 0.f; |
| 781 if (resist) { | 780 if (resist) { |
| 782 float diff = fabsf(gesture_drag_amount_) - resistance_free_region; | 781 float diff = fabsf(gesture_drag_amount_) - resistance_free_region; |
| 783 diff = std::min(diff, sqrtf(diff)); | 782 diff = std::min(diff, sqrtf(diff)); |
| 784 if (gesture_drag_amount_ < 0) | 783 if (gesture_drag_amount_ < 0) |
| 785 translate = -resistance_free_region - diff; | 784 translate = -resistance_free_region - diff; |
| 786 else | 785 else |
| 787 translate = resistance_free_region + diff; | 786 translate = resistance_free_region + diff; |
| 788 } else { | 787 } else { |
| 789 translate = gesture_drag_amount_; | 788 translate = gesture_drag_amount_; |
| 790 } | 789 } |
| 791 int shelf_insets = GetShelfConstant(SHELF_INSETS_FOR_AUTO_HIDE); | |
| 792 if (horizontal) { | 790 if (horizontal) { |
| 793 // Move and size the shelf with the gesture. | 791 // Move and size the shelf with the gesture. |
| 794 int shelf_height = target_bounds->shelf_bounds_in_root.height() - translate; | 792 int shelf_height = target_bounds->shelf_bounds_in_root.height() - translate; |
| 795 shelf_height = std::max(shelf_height, shelf_insets); | 793 shelf_height = std::max(shelf_height, 0); |
| 796 target_bounds->shelf_bounds_in_root.set_height(shelf_height); | 794 target_bounds->shelf_bounds_in_root.set_height(shelf_height); |
| 797 if (wm_shelf_->IsHorizontalAlignment()) { | 795 if (wm_shelf_->IsHorizontalAlignment()) { |
| 798 target_bounds->shelf_bounds_in_root.set_y(available_bounds.bottom() - | 796 target_bounds->shelf_bounds_in_root.set_y(available_bounds.bottom() - |
| 799 shelf_height); | 797 shelf_height); |
| 800 } | 798 } |
| 801 | 799 |
| 802 target_bounds->status_bounds_in_shelf.set_y(0); | 800 target_bounds->status_bounds_in_shelf.set_y(0); |
| 803 } else { | 801 } else { |
| 804 // Move and size the shelf with the gesture. | 802 // Move and size the shelf with the gesture. |
| 805 int shelf_width = target_bounds->shelf_bounds_in_root.width(); | 803 int shelf_width = target_bounds->shelf_bounds_in_root.width(); |
| 806 bool right_aligned = wm_shelf_->GetAlignment() == SHELF_ALIGNMENT_RIGHT; | 804 bool right_aligned = wm_shelf_->GetAlignment() == SHELF_ALIGNMENT_RIGHT; |
| 807 if (right_aligned) | 805 if (right_aligned) |
| 808 shelf_width -= translate; | 806 shelf_width -= translate; |
| 809 else | 807 else |
| 810 shelf_width += translate; | 808 shelf_width += translate; |
| 811 shelf_width = std::max(shelf_width, shelf_insets); | 809 shelf_width = std::max(shelf_width, 0); |
| 812 target_bounds->shelf_bounds_in_root.set_width(shelf_width); | 810 target_bounds->shelf_bounds_in_root.set_width(shelf_width); |
| 813 if (right_aligned) { | 811 if (right_aligned) { |
| 814 target_bounds->shelf_bounds_in_root.set_x(available_bounds.right() - | 812 target_bounds->shelf_bounds_in_root.set_x(available_bounds.right() - |
| 815 shelf_width); | 813 shelf_width); |
| 816 } | 814 } |
| 817 | 815 |
| 818 if (right_aligned) { | 816 if (right_aligned) { |
| 819 target_bounds->status_bounds_in_shelf.set_x(0); | 817 target_bounds->status_bounds_in_shelf.set_x(0); |
| 820 } else { | 818 } else { |
| 821 target_bounds->status_bounds_in_shelf.set_x( | 819 target_bounds->status_bounds_in_shelf.set_x( |
| 822 target_bounds->shelf_bounds_in_root.width() - | 820 target_bounds->shelf_bounds_in_root.width() - kShelfSize); |
| 823 GetShelfConstant(SHELF_SIZE)); | |
| 824 } | 821 } |
| 825 } | 822 } |
| 826 } | 823 } |
| 827 | 824 |
| 828 void ShelfLayoutManager::MaybeUpdateShelfBackground(AnimationChangeType type) { | 825 void ShelfLayoutManager::MaybeUpdateShelfBackground(AnimationChangeType type) { |
| 829 const ShelfBackgroundType new_background_type(GetShelfBackgroundType()); | 826 const ShelfBackgroundType new_background_type(GetShelfBackgroundType()); |
| 830 | 827 |
| 831 if (new_background_type == shelf_background_type_) | 828 if (new_background_type == shelf_background_type_) |
| 832 return; | 829 return; |
| 833 | 830 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 969 WmWindow* shelf_window = WmWindow::Get(shelf_widget_->GetNativeWindow()); | 966 WmWindow* shelf_window = WmWindow::Get(shelf_widget_->GetNativeWindow()); |
| 970 WmWindow* status_window = | 967 WmWindow* status_window = |
| 971 WmWindow::Get(shelf_widget_->status_area_widget()->GetNativeWindow()); | 968 WmWindow::Get(shelf_widget_->status_area_widget()->GetNativeWindow()); |
| 972 return (shelf_window && shelf_window->Contains(window)) || | 969 return (shelf_window && shelf_window->Contains(window)) || |
| 973 (status_window && status_window->Contains(window)); | 970 (status_window && status_window->Contains(window)); |
| 974 } | 971 } |
| 975 | 972 |
| 976 int ShelfLayoutManager::GetWorkAreaInsets(const State& state, int size) const { | 973 int ShelfLayoutManager::GetWorkAreaInsets(const State& state, int size) const { |
| 977 if (state.visibility_state == SHELF_VISIBLE) | 974 if (state.visibility_state == SHELF_VISIBLE) |
| 978 return size; | 975 return size; |
| 979 if (state.visibility_state == SHELF_AUTO_HIDE) | |
| 980 return GetShelfConstant(SHELF_INSETS_FOR_AUTO_HIDE); | |
| 981 return 0; | 976 return 0; |
| 982 } | 977 } |
| 983 | 978 |
| 984 void ShelfLayoutManager::OnLockStateEvent(LockStateObserver::EventType event) { | 979 void ShelfLayoutManager::OnLockStateEvent(LockStateObserver::EventType event) { |
| 985 if (event == EVENT_LOCK_ANIMATION_STARTED) { | 980 if (event == EVENT_LOCK_ANIMATION_STARTED) { |
| 986 // Enter the screen locked state and update the visibility to avoid an odd | 981 // Enter the screen locked state and update the visibility to avoid an odd |
| 987 // animation when transitioning the orientation from L/R to bottom. | 982 // animation when transitioning the orientation from L/R to bottom. |
| 988 state_.pre_lock_screen_animation_active = true; | 983 state_.pre_lock_screen_animation_active = true; |
| 989 UpdateShelfVisibilityAfterLoginUIChange(); | 984 UpdateShelfVisibilityAfterLoginUIChange(); |
| 990 } else { | 985 } else { |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1142 gesture_drag_status_ = GESTURE_DRAG_NONE; | 1137 gesture_drag_status_ = GESTURE_DRAG_NONE; |
| 1143 } | 1138 } |
| 1144 | 1139 |
| 1145 void ShelfLayoutManager::CancelGestureDrag() { | 1140 void ShelfLayoutManager::CancelGestureDrag() { |
| 1146 gesture_drag_status_ = GESTURE_DRAG_CANCEL_IN_PROGRESS; | 1141 gesture_drag_status_ = GESTURE_DRAG_CANCEL_IN_PROGRESS; |
| 1147 UpdateVisibilityState(); | 1142 UpdateVisibilityState(); |
| 1148 gesture_drag_status_ = GESTURE_DRAG_NONE; | 1143 gesture_drag_status_ = GESTURE_DRAG_NONE; |
| 1149 } | 1144 } |
| 1150 | 1145 |
| 1151 } // namespace ash | 1146 } // namespace ash |
| OLD | NEW |