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

Side by Side Diff: ui/app_list/presenter/app_list_presenter_impl.cc

Issue 2534953006: Fix shelf auto-hide calculation for app-list visibility. (Closed)
Patch Set: Cleanup. Created 4 years 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "ui/app_list/presenter/app_list_presenter_impl.h" 5 #include "ui/app_list/presenter/app_list_presenter_impl.h"
6 6
7 #include "ui/app_list/app_list_constants.h" 7 #include "ui/app_list/app_list_constants.h"
8 #include "ui/app_list/app_list_switches.h" 8 #include "ui/app_list/app_list_switches.h"
9 #include "ui/app_list/pagination_model.h" 9 #include "ui/app_list/pagination_model.h"
10 #include "ui/app_list/presenter/app_list_presenter_delegate_factory.h" 10 #include "ui/app_list/presenter/app_list_presenter_delegate_factory.h"
11 #include "ui/app_list/views/app_list_view.h" 11 #include "ui/app_list/views/app_list_view.h"
12 #include "ui/aura/client/focus_client.h" 12 #include "ui/aura/client/focus_client.h"
13 #include "ui/aura/window.h" 13 #include "ui/aura/window.h"
14 #include "ui/compositor/layer.h" 14 #include "ui/compositor/layer.h"
15 #include "ui/compositor/scoped_layer_animation_settings.h" 15 #include "ui/compositor/scoped_layer_animation_settings.h"
16 #include "ui/display/display.h"
17 #include "ui/display/screen.h"
16 #include "ui/views/widget/widget.h" 18 #include "ui/views/widget/widget.h"
17 19
18 namespace app_list { 20 namespace app_list {
19 namespace { 21 namespace {
20 22
21 // Duration for show/hide animation in milliseconds. 23 // Duration for show/hide animation in milliseconds.
22 const int kAnimationDurationMs = 200; 24 const int kAnimationDurationMs = 200;
23 25
24 // The maximum shift in pixels when over-scroll happens. 26 // The maximum shift in pixels when over-scroll happens.
25 const int kMaxOverScrollShift = 48; 27 const int kMaxOverScrollShift = 48;
(...skipping 16 matching lines...) Expand all
42 // Ensures app list view goes before the controller since pagination model 44 // Ensures app list view goes before the controller since pagination model
43 // lives in the controller and app list view would access it on destruction. 45 // lives in the controller and app list view would access it on destruction.
44 if (view_) { 46 if (view_) {
45 view_->GetAppsPaginationModel()->RemoveObserver(this); 47 view_->GetAppsPaginationModel()->RemoveObserver(this);
46 if (view_->GetWidget()) 48 if (view_->GetWidget())
47 view_->GetWidget()->CloseNow(); 49 view_->GetWidget()->CloseNow();
48 } 50 }
49 } 51 }
50 52
51 aura::Window* AppListPresenterImpl::GetWindow() { 53 aura::Window* AppListPresenterImpl::GetWindow() {
52 return is_visible_ && view_ ? view_->GetWidget()->GetNativeWindow() : nullptr; 54 return (GetTargetVisibility() && view_)
55 ? view_->GetWidget()->GetNativeWindow()
56 : nullptr;
53 } 57 }
54 58
55 void AppListPresenterImpl::Show(int64_t display_id) { 59 void AppListPresenterImpl::Show(int64_t display_id) {
56 if (is_visible_) 60 if (GetTargetVisibility())
57 return; 61 return;
58 62
59 is_visible_ = true; 63 target_display_id_ = display_id;
60 if (view_) { 64 if (view_) {
61 ScheduleAnimation(); 65 ScheduleAnimation();
62 } else { 66 } else {
63 presenter_delegate_ = factory_->GetDelegate(this); 67 presenter_delegate_ = factory_->GetDelegate(this);
64 AppListViewDelegate* view_delegate = presenter_delegate_->GetViewDelegate(); 68 AppListViewDelegate* view_delegate = presenter_delegate_->GetViewDelegate();
65 DCHECK(view_delegate); 69 DCHECK(view_delegate);
66 // Note the AppListViewDelegate outlives the AppListView. For Ash, the view 70 // Note the AppListViewDelegate outlives the AppListView. For Ash, the view
67 // is destroyed when dismissed. 71 // is destroyed when dismissed.
68 AppListView* view = new AppListView(view_delegate); 72 AppListView* view = new AppListView(view_delegate);
69 presenter_delegate_->Init(view, display_id, current_apps_page_); 73 presenter_delegate_->Init(view, display_id, current_apps_page_);
70 SetView(view); 74 SetView(view);
71 } 75 }
72 presenter_delegate_->OnShown(display_id); 76 presenter_delegate_->OnShown(display_id);
73 } 77 }
74 78
75 void AppListPresenterImpl::Dismiss() { 79 void AppListPresenterImpl::Dismiss() {
76 if (!is_visible_) 80 if (!GetTargetVisibility())
77 return; 81 return;
78 82
79 // If the app list is currently visible, there should be an existing view. 83 // If the app list is currently visible, there should be an existing view.
80 DCHECK(view_); 84 DCHECK(view_);
81 85
82 is_visible_ = false; 86 target_display_id_ = display::kInvalidDisplayId;
83 87
84 // The dismissal may have occurred in response to the app list losing 88 // The dismissal may have occurred in response to the app list losing
85 // activation. Otherwise, our widget is currently active. When the animation 89 // activation. Otherwise, our widget is currently active. When the animation
86 // completes we'll hide the widget, changing activation. If a menu is shown 90 // completes we'll hide the widget, changing activation. If a menu is shown
87 // before the animation completes then the activation change triggers the menu 91 // before the animation completes then the activation change triggers the menu
88 // to close. By deactivating now we ensure there is no activation change when 92 // to close. By deactivating now we ensure there is no activation change when
89 // the animation completes and any menus stay open. 93 // the animation completes and any menus stay open.
90 if (view_->GetWidget()->IsActive()) 94 if (view_->GetWidget()->IsActive())
91 view_->GetWidget()->Deactivate(); 95 view_->GetWidget()->Deactivate();
92 96
93 presenter_delegate_->OnDismissed(); 97 presenter_delegate_->OnDismissed();
94 ScheduleAnimation(); 98 ScheduleAnimation();
95 } 99 }
96 100
97 void AppListPresenterImpl::ToggleAppList(int64_t display_id) { 101 void AppListPresenterImpl::ToggleAppList(int64_t display_id) {
98 if (IsVisible()) { 102 if (IsVisible()) {
99 Dismiss(); 103 Dismiss();
100 return; 104 return;
101 } 105 }
102 Show(display_id); 106 Show(display_id);
103 } 107 }
104 108
105 bool AppListPresenterImpl::IsVisible() const { 109 bool AppListPresenterImpl::IsVisible(int64_t display_id) const {
106 return view_ && view_->GetWidget()->IsVisible(); 110 views::Widget* widget = view_ ? view_->GetWidget() : nullptr;
111 return widget && widget->IsVisible() &&
112 (display_id == display::kInvalidDisplayId ||
113 display_id ==
114 display::Screen::GetScreen()
115 ->GetDisplayNearestWindow(widget->GetNativeWindow())
116 .id());
107 } 117 }
James Cook 2016/11/30 23:27:19 this function might be easier to read with some ea
108 118
109 bool AppListPresenterImpl::GetTargetVisibility() const { 119 bool AppListPresenterImpl::GetTargetVisibility(int64_t display_id) const {
110 return is_visible_; 120 return target_display_id_ != display::kInvalidDisplayId &&
James Cook 2016/11/30 23:27:19 nit: This might be clearer as: if (target_display
121 (display_id == display::kInvalidDisplayId ||
122 display_id == target_display_id_);
111 } 123 }
112 124
113 //////////////////////////////////////////////////////////////////////////////// 125 ////////////////////////////////////////////////////////////////////////////////
114 // AppListPresenterImpl, private: 126 // AppListPresenterImpl, private:
115 127
116 void AppListPresenterImpl::SetView(AppListView* view) { 128 void AppListPresenterImpl::SetView(AppListView* view) {
117 DCHECK(view_ == nullptr); 129 DCHECK_EQ(view_, nullptr);
118 DCHECK(is_visible_); 130 DCHECK(GetTargetVisibility());
119 131
120 view_ = view; 132 view_ = view;
121 views::Widget* widget = view_->GetWidget(); 133 views::Widget* widget = view_->GetWidget();
122 widget->AddObserver(this); 134 widget->AddObserver(this);
123 widget->GetNativeView()->GetRootWindow()->AddObserver(this); 135 widget->GetNativeView()->GetRootWindow()->AddObserver(this);
124 aura::client::GetFocusClient(widget->GetNativeView())->AddObserver(this); 136 aura::client::GetFocusClient(widget->GetNativeView())->AddObserver(this);
125 view_->GetAppsPaginationModel()->AddObserver(this); 137 view_->GetAppsPaginationModel()->AddObserver(this);
126 view_->ShowWhenReady(); 138 view_->ShowWhenReady();
127 } 139 }
128 140
(...skipping 17 matching lines...) Expand all
146 // Stop observing previous animation. 158 // Stop observing previous animation.
147 StopObservingImplicitAnimations(); 159 StopObservingImplicitAnimations();
148 160
149 views::Widget* widget = view_->GetWidget(); 161 views::Widget* widget = view_->GetWidget();
150 ui::Layer* layer = GetLayer(widget); 162 ui::Layer* layer = GetLayer(widget);
151 layer->GetAnimator()->StopAnimating(); 163 layer->GetAnimator()->StopAnimating();
152 164
153 gfx::Rect target_bounds; 165 gfx::Rect target_bounds;
154 gfx::Vector2d offset = presenter_delegate_->GetVisibilityAnimationOffset( 166 gfx::Vector2d offset = presenter_delegate_->GetVisibilityAnimationOffset(
155 widget->GetNativeView()->GetRootWindow()); 167 widget->GetNativeView()->GetRootWindow());
156 if (is_visible_) { 168 if (GetTargetVisibility()) {
157 target_bounds = widget->GetWindowBoundsInScreen(); 169 target_bounds = widget->GetWindowBoundsInScreen();
158 gfx::Rect start_bounds = gfx::Rect(target_bounds); 170 gfx::Rect start_bounds = gfx::Rect(target_bounds);
159 start_bounds.Offset(offset); 171 start_bounds.Offset(offset);
160 widget->SetBounds(start_bounds); 172 widget->SetBounds(start_bounds);
161 } else { 173 } else {
162 target_bounds = widget->GetWindowBoundsInScreen(); 174 target_bounds = widget->GetWindowBoundsInScreen();
163 target_bounds.Offset(offset); 175 target_bounds.Offset(offset);
164 } 176 }
165 177
166 ui::ScopedLayerAnimationSettings animation(layer->GetAnimator()); 178 ui::ScopedLayerAnimationSettings animation(layer->GetAnimator());
167 animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds( 179 animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
168 is_visible_ ? 0 : kAnimationDurationMs)); 180 GetTargetVisibility() ? 0 : kAnimationDurationMs));
169 animation.AddObserver(this); 181 animation.AddObserver(this);
170 182
171 layer->SetOpacity(is_visible_ ? 1.0 : 0.0); 183 layer->SetOpacity(GetTargetVisibility() ? 1.0 : 0.0);
172 widget->SetBounds(target_bounds); 184 widget->SetBounds(target_bounds);
173 } 185 }
174 186
175 //////////////////////////////////////////////////////////////////////////////// 187 ////////////////////////////////////////////////////////////////////////////////
176 // AppListPresenterImpl, aura::client::FocusChangeObserver implementation: 188 // AppListPresenterImpl, aura::client::FocusChangeObserver implementation:
177 189
178 void AppListPresenterImpl::OnWindowFocused(aura::Window* gained_focus, 190 void AppListPresenterImpl::OnWindowFocused(aura::Window* gained_focus,
179 aura::Window* lost_focus) { 191 aura::Window* lost_focus) {
180 if (view_ && is_visible_) { 192 if (view_ && GetTargetVisibility()) {
181 aura::Window* applist_window = view_->GetWidget()->GetNativeView(); 193 aura::Window* applist_window = view_->GetWidget()->GetNativeView();
182 aura::Window* applist_container = applist_window->parent(); 194 aura::Window* applist_container = applist_window->parent();
183 if (applist_container->Contains(lost_focus) && 195 if (applist_container->Contains(lost_focus) &&
184 (!gained_focus || !applist_container->Contains(gained_focus)) && 196 (!gained_focus || !applist_container->Contains(gained_focus)) &&
185 !switches::ShouldNotDismissOnBlur()) { 197 !switches::ShouldNotDismissOnBlur()) {
186 Dismiss(); 198 Dismiss();
187 } 199 }
188 } 200 }
189 } 201 }
190 202
191 //////////////////////////////////////////////////////////////////////////////// 203 ////////////////////////////////////////////////////////////////////////////////
192 // AppListPresenterImpl, aura::WindowObserver implementation: 204 // AppListPresenterImpl, aura::WindowObserver implementation:
193 void AppListPresenterImpl::OnWindowBoundsChanged(aura::Window* root, 205 void AppListPresenterImpl::OnWindowBoundsChanged(aura::Window* root,
194 const gfx::Rect& old_bounds, 206 const gfx::Rect& old_bounds,
195 const gfx::Rect& new_bounds) { 207 const gfx::Rect& new_bounds) {
196 if (presenter_delegate_) 208 if (presenter_delegate_)
197 presenter_delegate_->UpdateBounds(); 209 presenter_delegate_->UpdateBounds();
198 } 210 }
199 211
200 //////////////////////////////////////////////////////////////////////////////// 212 ////////////////////////////////////////////////////////////////////////////////
201 // AppListPresenterImpl, ui::ImplicitAnimationObserver implementation: 213 // AppListPresenterImpl, ui::ImplicitAnimationObserver implementation:
202 214
203 void AppListPresenterImpl::OnImplicitAnimationsCompleted() { 215 void AppListPresenterImpl::OnImplicitAnimationsCompleted() {
204 if (is_visible_) 216 if (GetTargetVisibility())
205 view_->GetWidget()->Activate(); 217 view_->GetWidget()->Activate();
206 else 218 else
207 view_->GetWidget()->Close(); 219 view_->GetWidget()->Close();
208 } 220 }
209 221
210 //////////////////////////////////////////////////////////////////////////////// 222 ////////////////////////////////////////////////////////////////////////////////
211 // AppListPresenterImpl, views::WidgetObserver implementation: 223 // AppListPresenterImpl, views::WidgetObserver implementation:
212 224
213 void AppListPresenterImpl::OnWidgetDestroying(views::Widget* widget) { 225 void AppListPresenterImpl::OnWidgetDestroying(views::Widget* widget) {
214 DCHECK(view_->GetWidget() == widget); 226 DCHECK(view_->GetWidget() == widget);
215 if (is_visible_) 227 if (GetTargetVisibility())
216 Dismiss(); 228 Dismiss();
217 ResetView(); 229 ResetView();
218 } 230 }
219 231
220 //////////////////////////////////////////////////////////////////////////////// 232 ////////////////////////////////////////////////////////////////////////////////
221 // AppListPresenterImpl, PaginationModelObserver implementation: 233 // AppListPresenterImpl, PaginationModelObserver implementation:
222 234
223 void AppListPresenterImpl::TotalPagesChanged() {} 235 void AppListPresenterImpl::TotalPagesChanged() {}
224 236
225 void AppListPresenterImpl::SelectedPageChanged(int old_selected, 237 void AppListPresenterImpl::SelectedPageChanged(int old_selected,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 } else if (should_snap_back_) { 277 } else if (should_snap_back_) {
266 should_snap_back_ = false; 278 should_snap_back_ = false;
267 ui::ScopedLayerAnimationSettings animation(widget_animator); 279 ui::ScopedLayerAnimationSettings animation(widget_animator);
268 animation.SetTransitionDuration( 280 animation.SetTransitionDuration(
269 base::TimeDelta::FromMilliseconds(kOverscrollPageTransitionDurationMs)); 281 base::TimeDelta::FromMilliseconds(kOverscrollPageTransitionDurationMs));
270 widget->SetBounds(view_bounds_); 282 widget->SetBounds(view_bounds_);
271 } 283 }
272 } 284 }
273 285
274 } // namespace app_list 286 } // namespace app_list
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698