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

Side by Side Diff: ash/wm/app_list_controller.cc

Issue 13993027: ash: Update app list button. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 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 | Annotate | Revision Log
OLDNEW
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/wm/app_list_controller.h" 5 #include "ash/wm/app_list_controller.h"
6 6
7 #include "ash/launcher/launcher.h" 7 #include "ash/launcher/launcher.h"
8 #include "ash/root_window_controller.h" 8 #include "ash/root_window_controller.h"
9 #include "ash/shelf/shelf_layout_manager.h" 9 #include "ash/shelf/shelf_layout_manager.h"
10 #include "ash/shell.h" 10 #include "ash/shell.h"
11 #include "ash/shell_delegate.h" 11 #include "ash/shell_delegate.h"
12 #include "ash/shell_window_ids.h" 12 #include "ash/shell_window_ids.h"
13 #include "ash/wm/app_list_controller_observer.h"
13 #include "ash/wm/property_util.h" 14 #include "ash/wm/property_util.h"
14 #include "ui/app_list/app_list_constants.h" 15 #include "ui/app_list/app_list_constants.h"
15 #include "ui/app_list/pagination_model.h" 16 #include "ui/app_list/pagination_model.h"
16 #include "ui/app_list/views/app_list_view.h" 17 #include "ui/app_list/views/app_list_view.h"
17 #include "ui/aura/client/focus_client.h" 18 #include "ui/aura/client/focus_client.h"
18 #include "ui/aura/root_window.h" 19 #include "ui/aura/root_window.h"
19 #include "ui/aura/window.h" 20 #include "ui/aura/window.h"
20 #include "ui/base/events/event.h" 21 #include "ui/base/events/event.h"
21 #include "ui/compositor/layer.h" 22 #include "ui/compositor/layer.h"
22 #include "ui/compositor/scoped_layer_animation_settings.h" 23 #include "ui/compositor/scoped_layer_animation_settings.h"
(...skipping 22 matching lines...) Expand all
45 views::BubbleBorder::Arrow GetBubbleArrow(aura::Window* window) { 46 views::BubbleBorder::Arrow GetBubbleArrow(aura::Window* window) {
46 DCHECK(Shell::HasInstance()); 47 DCHECK(Shell::HasInstance());
47 return ShelfLayoutManager::ForLauncher(window)-> 48 return ShelfLayoutManager::ForLauncher(window)->
48 SelectValueForShelfAlignment( 49 SelectValueForShelfAlignment(
49 views::BubbleBorder::BOTTOM_CENTER, 50 views::BubbleBorder::BOTTOM_CENTER,
50 views::BubbleBorder::LEFT_CENTER, 51 views::BubbleBorder::LEFT_CENTER,
51 views::BubbleBorder::RIGHT_CENTER, 52 views::BubbleBorder::RIGHT_CENTER,
52 views::BubbleBorder::TOP_CENTER); 53 views::BubbleBorder::TOP_CENTER);
53 } 54 }
54 55
55 // Offset given |rect| towards shelf. 56 // Offsets the given |rect| towards shelf.
56 gfx::Rect OffsetTowardsShelf(const gfx::Rect& rect, views::Widget* widget) { 57 gfx::Rect OffsetTowardsShelf(Shell* shell,
57 DCHECK(Shell::HasInstance()); 58 const gfx::Rect& rect,
58 ShelfAlignment shelf_alignment = Shell::GetInstance()->GetShelfAlignment( 59 views::Widget* widget) {
60 ShelfAlignment shelf_alignment = shell->GetShelfAlignment(
59 widget->GetNativeView()->GetRootWindow()); 61 widget->GetNativeView()->GetRootWindow());
60 gfx::Rect offseted(rect); 62 gfx::Rect offseted(rect);
61 switch (shelf_alignment) { 63 switch (shelf_alignment) {
62 case SHELF_ALIGNMENT_BOTTOM: 64 case SHELF_ALIGNMENT_BOTTOM:
63 offseted.Offset(0, kAnimationOffset); 65 offseted.Offset(0, kAnimationOffset);
64 break; 66 break;
65 case SHELF_ALIGNMENT_LEFT: 67 case SHELF_ALIGNMENT_LEFT:
66 offseted.Offset(-kAnimationOffset, 0); 68 offseted.Offset(-kAnimationOffset, 0);
67 break; 69 break;
68 case SHELF_ALIGNMENT_RIGHT: 70 case SHELF_ALIGNMENT_RIGHT:
69 offseted.Offset(kAnimationOffset, 0); 71 offseted.Offset(kAnimationOffset, 0);
70 break; 72 break;
71 case SHELF_ALIGNMENT_TOP: 73 case SHELF_ALIGNMENT_TOP:
72 offseted.Offset(0, -kAnimationOffset); 74 offseted.Offset(0, -kAnimationOffset);
73 break; 75 break;
74 } 76 }
75 77
76 return offseted; 78 return offseted;
77 } 79 }
78 80
79 } // namespace 81 } // namespace
80 82
81 //////////////////////////////////////////////////////////////////////////////// 83 ////////////////////////////////////////////////////////////////////////////////
82 // AppListController, public: 84 // AppListController, public:
83 85
84 AppListController::AppListController() 86 AppListController::AppListController(Shell* shell)
85 : pagination_model_(new app_list::PaginationModel), 87 : shell_(shell),
88 pagination_model_(new app_list::PaginationModel),
86 is_visible_(false), 89 is_visible_(false),
87 view_(NULL), 90 view_(NULL),
88 should_snap_back_(false) { 91 should_snap_back_(false) {
89 Shell::GetInstance()->AddShellObserver(this); 92 shell_->AddShellObserver(this);
90 pagination_model_->AddObserver(this); 93 pagination_model_->AddObserver(this);
91 } 94 }
92 95
93 AppListController::~AppListController() { 96 AppListController::~AppListController() {
97 Shutdown();
98 pagination_model_->RemoveObserver(this);
99 }
100
101 void AppListController::Shutdown() {
94 // Ensures app list view goes before the controller since pagination model 102 // Ensures app list view goes before the controller since pagination model
95 // lives in the controller and app list view would access it on destruction. 103 // lives in the controller and app list view would access it on destruction.
96 if (view_ && view_->GetWidget()) 104 if (view_ && view_->GetWidget())
97 view_->GetWidget()->CloseNow(); 105 view_->GetWidget()->CloseNow();
98 106
99 Shell::GetInstance()->RemoveShellObserver(this); 107 if (shell_) {
100 pagination_model_->RemoveObserver(this); 108 shell_->RemoveShellObserver(this);
109 shell_ = NULL;
110 }
101 } 111 }
102 112
103 void AppListController::SetVisible(bool visible, aura::Window* window) { 113 void AppListController::SetVisible(bool visible, aura::Window* window) {
104 if (visible == is_visible_) 114 if (visible == is_visible_)
105 return; 115 return;
106 116
107 is_visible_ = visible; 117 is_visible_ = visible;
108 118
109 // App list needs to know the new shelf layout in order to calculate its 119 // App list needs to know the new shelf layout in order to calculate its
110 // UI layout when AppListView visibility changes. 120 // UI layout when AppListView visibility changes.
111 Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()-> 121 Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
112 UpdateAutoHideState(); 122 UpdateAutoHideState();
113 123
124 // Determine the root window to show the UI.
125 aura::RootWindow* root_window =
126 window ? window->GetRootWindow() : Shell::GetActiveRootWindow();
127
114 if (view_) { 128 if (view_) {
115 ScheduleAnimation(); 129 ScheduleAnimation();
116 } else if (is_visible_) { 130 } else if (is_visible_) {
117 // AppListModel and AppListViewDelegate are owned by AppListView. They 131 // AppListModel and AppListViewDelegate are owned by AppListView. They
118 // will be released with AppListView on close. 132 // will be released with AppListView on close.
119 app_list::AppListView* view = new app_list::AppListView( 133 app_list::AppListView* view = new app_list::AppListView(
120 Shell::GetInstance()->delegate()->CreateAppListViewDelegate()); 134 shell_->delegate()->CreateAppListViewDelegate());
121 aura::Window* container = GetRootWindowController(window->GetRootWindow())-> 135 aura::Window* container = GetRootWindowController(root_window)->
122 GetContainer(kShellWindowId_AppListContainer); 136 GetContainer(kShellWindowId_AppListContainer);
123 view->InitAsBubble( 137 view->InitAsBubble(
124 container, 138 container,
125 pagination_model_.get(), 139 pagination_model_.get(),
126 Launcher::ForWindow(container)->GetAppListButtonView(), 140 Launcher::ForWindow(container)->GetAppListButtonView(),
127 gfx::Point(), 141 gfx::Point(),
128 GetBubbleArrow(container), 142 GetBubbleArrow(container),
129 true /* border_accepts_events */); 143 true /* border_accepts_events */);
130 SetView(view); 144 SetView(view);
131 } 145 }
146
147 FOR_EACH_OBSERVER(AppListControllerObserver,
148 observers_,
149 OnAppLauncherVisibilityChanged(is_visible_, root_window));
132 } 150 }
133 151
134 bool AppListController::IsVisible() const { 152 bool AppListController::IsVisible() const {
135 return view_ && view_->GetWidget()->IsVisible(); 153 return view_ && view_->GetWidget()->IsVisible();
136 } 154 }
137 155
156 void AppListController::Toggle(aura::Window* window) {
157 SetVisible(!IsVisible(), window);
158 }
159
138 aura::Window* AppListController::GetWindow() { 160 aura::Window* AppListController::GetWindow() {
139 return is_visible_ && view_ ? view_->GetWidget()->GetNativeWindow() : NULL; 161 return is_visible_ && view_ ? view_->GetWidget()->GetNativeWindow() : NULL;
140 } 162 }
141 163
164 void AppListController::AddObserver(AppListControllerObserver* observer) {
165 observers_.AddObserver(observer);
166 }
167
168 void AppListController::RemoveObserver(AppListControllerObserver* observer) {
169 observers_.RemoveObserver(observer);
170 }
171
142 //////////////////////////////////////////////////////////////////////////////// 172 ////////////////////////////////////////////////////////////////////////////////
143 // AppListController, private: 173 // AppListController, private:
144 174
145 void AppListController::SetView(app_list::AppListView* view) { 175 void AppListController::SetView(app_list::AppListView* view) {
146 DCHECK(view_ == NULL); 176 DCHECK(view_ == NULL);
147 DCHECK(is_visible_); 177 DCHECK(is_visible_);
148 178
149 view_ = view; 179 view_ = view;
150 views::Widget* widget = view_->GetWidget(); 180 views::Widget* widget = view_->GetWidget();
151 widget->AddObserver(this); 181 widget->AddObserver(this);
152 Shell::GetInstance()->AddPreTargetHandler(this); 182 shell_->AddPreTargetHandler(this);
153 Launcher::ForWindow(widget->GetNativeWindow())->AddIconObserver(this); 183 Launcher::ForWindow(widget->GetNativeWindow())->AddIconObserver(this);
154 widget->GetNativeView()->GetRootWindow()->AddRootWindowObserver(this); 184 widget->GetNativeView()->GetRootWindow()->AddRootWindowObserver(this);
155 aura::client::GetFocusClient(widget->GetNativeView())->AddObserver(this); 185 aura::client::GetFocusClient(widget->GetNativeView())->AddObserver(this);
156 186
157 view_->ShowWhenReady(); 187 view_->ShowWhenReady();
158 } 188 }
159 189
160 void AppListController::ResetView() { 190 void AppListController::ResetView() {
161 if (!view_) 191 if (!view_)
162 return; 192 return;
163 193
164 views::Widget* widget = view_->GetWidget(); 194 views::Widget* widget = view_->GetWidget();
165 widget->RemoveObserver(this); 195 widget->RemoveObserver(this);
166 GetLayer(widget)->GetAnimator()->RemoveObserver(this); 196 GetLayer(widget)->GetAnimator()->RemoveObserver(this);
167 Shell::GetInstance()->RemovePreTargetHandler(this); 197 shell_->RemovePreTargetHandler(this);
168 Launcher::ForWindow(widget->GetNativeWindow())->RemoveIconObserver(this); 198 Launcher::ForWindow(widget->GetNativeWindow())->RemoveIconObserver(this);
169 widget->GetNativeView()->GetRootWindow()->RemoveRootWindowObserver(this); 199 widget->GetNativeView()->GetRootWindow()->RemoveRootWindowObserver(this);
170 aura::client::GetFocusClient(widget->GetNativeView())->RemoveObserver(this); 200 aura::client::GetFocusClient(widget->GetNativeView())->RemoveObserver(this);
171 view_ = NULL; 201 view_ = NULL;
172 } 202 }
173 203
174 void AppListController::ScheduleAnimation() { 204 void AppListController::ScheduleAnimation() {
175 // Stop observing previous animation. 205 // Stop observing previous animation.
176 StopObservingImplicitAnimations(); 206 StopObservingImplicitAnimations();
177 207
178 views::Widget* widget = view_->GetWidget(); 208 views::Widget* widget = view_->GetWidget();
179 ui::Layer* layer = GetLayer(widget); 209 ui::Layer* layer = GetLayer(widget);
180 layer->GetAnimator()->StopAnimating(); 210 layer->GetAnimator()->StopAnimating();
181 211
182 gfx::Rect target_bounds; 212 gfx::Rect target_bounds;
183 if (is_visible_) { 213 if (is_visible_) {
184 target_bounds = widget->GetWindowBoundsInScreen(); 214 target_bounds = widget->GetWindowBoundsInScreen();
185 widget->SetBounds(OffsetTowardsShelf(target_bounds, widget)); 215 widget->SetBounds(OffsetTowardsShelf(shell_, target_bounds, widget));
186 } else { 216 } else {
187 target_bounds = OffsetTowardsShelf(widget->GetWindowBoundsInScreen(), 217 target_bounds = OffsetTowardsShelf(shell_,
218 widget->GetWindowBoundsInScreen(),
188 widget); 219 widget);
189 } 220 }
190 221
191 ui::ScopedLayerAnimationSettings animation(layer->GetAnimator()); 222 ui::ScopedLayerAnimationSettings animation(layer->GetAnimator());
192 animation.SetTransitionDuration( 223 animation.SetTransitionDuration(
193 base::TimeDelta::FromMilliseconds( 224 base::TimeDelta::FromMilliseconds(
194 is_visible_ ? 0 : kAnimationDurationMs)); 225 is_visible_ ? 0 : kAnimationDurationMs));
195 animation.AddObserver(this); 226 animation.AddObserver(this);
196 227
197 layer->SetOpacity(is_visible_ ? 1.0 : 0.0); 228 layer->SetOpacity(is_visible_ ? 1.0 : 0.0);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 should_snap_back_ = false; 371 should_snap_back_ = false;
341 ui::ScopedLayerAnimationSettings animation(widget_animator); 372 ui::ScopedLayerAnimationSettings animation(widget_animator);
342 animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds( 373 animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
343 app_list::kOverscrollPageTransitionDurationMs)); 374 app_list::kOverscrollPageTransitionDurationMs));
344 widget->SetBounds(view_bounds_); 375 widget->SetBounds(view_bounds_);
345 } 376 }
346 } 377 }
347 378
348 } // namespace internal 379 } // namespace internal
349 } // namespace ash 380 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698