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/system/status_area_widget.h" | 5 #include "ash/system/status_area_widget.h" |
6 | 6 |
7 #include "ash/common/material_design/material_design_controller.h" | |
8 #include "ash/common/shelf/shelf_constants.h" | |
7 #include "ash/common/shelf/wm_shelf.h" | 9 #include "ash/common/shelf/wm_shelf.h" |
10 #include "ash/common/shelf/wm_shelf_util.h" | |
8 #include "ash/common/shell_window_ids.h" | 11 #include "ash/common/shell_window_ids.h" |
9 #include "ash/common/system/tray/system_tray_delegate.h" | 12 #include "ash/common/system/tray/system_tray_delegate.h" |
13 #include "ash/common/system/tray/tray_constants.h" | |
10 #include "ash/common/system/web_notification/web_notification_tray.h" | 14 #include "ash/common/system/web_notification/web_notification_tray.h" |
11 #include "ash/common/wm_lookup.h" | 15 #include "ash/common/wm_lookup.h" |
12 #include "ash/common/wm_root_window_controller.h" | 16 #include "ash/common/wm_root_window_controller.h" |
13 #include "ash/common/wm_shell.h" | 17 #include "ash/common/wm_shell.h" |
14 #include "ash/common/wm_window.h" | 18 #include "ash/common/wm_window.h" |
15 #include "ash/system/overview/overview_button_tray.h" | 19 #include "ash/system/overview/overview_button_tray.h" |
16 #include "ash/system/status_area_widget_delegate.h" | 20 #include "ash/system/status_area_widget_delegate.h" |
17 #include "ash/system/tray/system_tray.h" | 21 #include "ash/system/tray/system_tray.h" |
18 #include "base/i18n/time_formatting.h" | 22 #include "base/i18n/time_formatting.h" |
19 | 23 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
55 AddOverviewButtonTray(); | 59 AddOverviewButtonTray(); |
56 AddSystemTray(); | 60 AddSystemTray(); |
57 AddWebNotificationTray(); | 61 AddWebNotificationTray(); |
58 #if defined(OS_CHROMEOS) | 62 #if defined(OS_CHROMEOS) |
59 AddLogoutButtonTray(); | 63 AddLogoutButtonTray(); |
60 AddVirtualKeyboardTray(); | 64 AddVirtualKeyboardTray(); |
61 #endif | 65 #endif |
62 | 66 |
63 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate(); | 67 SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate(); |
64 DCHECK(delegate); | 68 DCHECK(delegate); |
65 // Initialize after all trays have been created. | 69 |
66 system_tray_->InitializeTrayItems(delegate, web_notification_tray_); | 70 if (MaterialDesignController::IsShelfMaterial()) { |
67 web_notification_tray_->Initialize(); | 71 gfx::Insets edge_border; |
72 gfx::Insets no_edge_border; | |
73 CalculateBorderMD(&edge_border, system_tray_->shelf_alignment(), true); | |
74 CalculateBorderMD(&no_edge_border, system_tray_->shelf_alignment(), false); | |
tdanderson
2016/06/29 17:46:19
The generally preferred pattern in a case like thi
yiyix
2016/06/29 18:56:39
Done.
| |
75 // Initialize after all trays have been created. | |
76 system_tray_->InitializeTrayItems( | |
77 delegate, web_notification_tray_, | |
78 overview_button_tray_->visible() ? no_edge_border : edge_border); | |
79 web_notification_tray_->Initialize(no_edge_border); | |
68 #if defined(OS_CHROMEOS) | 80 #if defined(OS_CHROMEOS) |
69 logout_button_tray_->Initialize(); | 81 logout_button_tray_->Initialize(no_edge_border); |
70 virtual_keyboard_tray_->Initialize(); | 82 virtual_keyboard_tray_->Initialize(no_edge_border); |
71 #endif | 83 #endif |
72 overview_button_tray_->Initialize(); | 84 overview_button_tray_->Initialize(edge_border); |
85 } else { | |
86 gfx::Insets border; | |
87 gfx::Insets overview_border; | |
88 CalculateBorderNonMD(&border, system_tray_->shelf_alignment(), false); | |
89 CalculateBorderNonMD(&overview_border, system_tray_->shelf_alignment(), | |
90 true); | |
91 // Initialize after all trays have been created. | |
92 system_tray_->InitializeTrayItems(delegate, web_notification_tray_, border); | |
93 web_notification_tray_->Initialize(border); | |
94 #if defined(OS_CHROMEOS) | |
95 logout_button_tray_->Initialize(border); | |
96 virtual_keyboard_tray_->Initialize(border); | |
97 #endif | |
98 overview_button_tray_->Initialize(overview_border); | |
99 } | |
100 | |
73 SetShelfAlignment(system_tray_->shelf_alignment()); | 101 SetShelfAlignment(system_tray_->shelf_alignment()); |
74 UpdateAfterLoginStatusChange(delegate->GetUserLoginStatus()); | 102 UpdateAfterLoginStatusChange(delegate->GetUserLoginStatus()); |
75 } | 103 } |
76 | 104 |
77 void StatusAreaWidget::Shutdown() { | 105 void StatusAreaWidget::Shutdown() { |
78 system_tray_->Shutdown(); | 106 system_tray_->Shutdown(); |
79 // Destroy the trays early, causing them to be removed from the view | 107 // Destroy the trays early, causing them to be removed from the view |
80 // hierarchy. Do not used scoped pointers since we don't want to destroy them | 108 // hierarchy. Do not used scoped pointers since we don't want to destroy them |
81 // in the destructor if Shutdown() is not called (e.g. in tests). | 109 // in the destructor if Shutdown() is not called (e.g. in tests). |
82 delete web_notification_tray_; | 110 delete web_notification_tray_; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
165 virtual_keyboard_tray_ = new VirtualKeyboardTray(wm_shelf_); | 193 virtual_keyboard_tray_ = new VirtualKeyboardTray(wm_shelf_); |
166 status_area_widget_delegate_->AddTray(virtual_keyboard_tray_); | 194 status_area_widget_delegate_->AddTray(virtual_keyboard_tray_); |
167 } | 195 } |
168 #endif | 196 #endif |
169 | 197 |
170 void StatusAreaWidget::AddOverviewButtonTray() { | 198 void StatusAreaWidget::AddOverviewButtonTray() { |
171 overview_button_tray_ = new OverviewButtonTray(wm_shelf_); | 199 overview_button_tray_ = new OverviewButtonTray(wm_shelf_); |
172 status_area_widget_delegate_->AddTray(overview_button_tray_); | 200 status_area_widget_delegate_->AddTray(overview_button_tray_); |
173 } | 201 } |
174 | 202 |
203 // TODO(yiyix): Once Chrome OS material design is enabled by default, | |
204 // remove all code related to Non Md Border setup code. See crbug.com/614453. | |
tdanderson
2016/06/29 17:46:19
Thanks for adding this. Though in this specific ca
yiyix
2016/06/29 18:56:39
I will remove this comment
| |
175 void StatusAreaWidget::SetShelfAlignment(ShelfAlignment alignment) { | 205 void StatusAreaWidget::SetShelfAlignment(ShelfAlignment alignment) { |
176 status_area_widget_delegate_->set_alignment(alignment); | 206 status_area_widget_delegate_->set_alignment(alignment); |
177 if (system_tray_) | 207 |
178 system_tray_->SetShelfAlignment(alignment); | 208 if (MaterialDesignController::IsShelfMaterial()) { |
179 if (web_notification_tray_) | 209 gfx::Insets insets_on_edge; |
180 web_notification_tray_->SetShelfAlignment(alignment); | 210 gfx::Insets insets_not_on_edge; |
211 CalculateBorderMD(&insets_on_edge, alignment, true); | |
212 CalculateBorderMD(&insets_not_on_edge, alignment, false); | |
213 if (system_tray_) | |
214 system_tray_->SetShelfAlignment( | |
215 alignment, overview_button_tray_->visible() ? insets_not_on_edge | |
216 : insets_on_edge); | |
217 if (web_notification_tray_) | |
218 web_notification_tray_->SetShelfAlignment(alignment, insets_not_on_edge); | |
181 #if defined(OS_CHROMEOS) | 219 #if defined(OS_CHROMEOS) |
182 if (logout_button_tray_) | 220 if (logout_button_tray_) |
183 logout_button_tray_->SetShelfAlignment(alignment); | 221 logout_button_tray_->SetShelfAlignment(alignment, insets_not_on_edge); |
184 if (virtual_keyboard_tray_) | 222 if (virtual_keyboard_tray_) |
185 virtual_keyboard_tray_->SetShelfAlignment(alignment); | 223 virtual_keyboard_tray_->SetShelfAlignment(alignment, insets_not_on_edge); |
186 #endif | 224 #endif |
187 if (overview_button_tray_) | 225 if (overview_button_tray_) |
188 overview_button_tray_->SetShelfAlignment(alignment); | 226 overview_button_tray_->SetShelfAlignment(alignment, insets_on_edge); |
227 } else { | |
228 gfx::Insets insets; | |
229 gfx::Insets insets_overview; | |
230 CalculateBorderNonMD(&insets, alignment, false); | |
231 CalculateBorderNonMD(&insets_overview, alignment, true); | |
tdanderson
2016/06/29 17:46:19
Consider only performing this calculation inside t
yiyix
2016/06/29 18:56:39
Done.
| |
232 if (system_tray_) | |
233 system_tray_->SetShelfAlignment(alignment, insets); | |
234 if (web_notification_tray_) | |
235 web_notification_tray_->SetShelfAlignment(alignment, insets); | |
236 #if defined(OS_CHROMEOS) | |
237 if (logout_button_tray_) | |
238 logout_button_tray_->SetShelfAlignment(alignment, insets); | |
239 if (virtual_keyboard_tray_) | |
240 virtual_keyboard_tray_->SetShelfAlignment(alignment, insets); | |
241 #endif | |
242 if (overview_button_tray_) | |
243 overview_button_tray_->SetShelfAlignment(alignment, insets_overview); | |
244 } | |
245 | |
189 status_area_widget_delegate_->UpdateLayout(); | 246 status_area_widget_delegate_->UpdateLayout(); |
190 } | 247 } |
191 | 248 |
192 void StatusAreaWidget::UpdateAfterLoginStatusChange(LoginStatus login_status) { | 249 void StatusAreaWidget::UpdateAfterLoginStatusChange(LoginStatus login_status) { |
193 if (login_status_ == login_status) | 250 if (login_status_ == login_status) |
194 return; | 251 return; |
195 login_status_ = login_status; | 252 login_status_ = login_status; |
196 if (system_tray_) | 253 if (system_tray_) |
197 system_tray_->UpdateAfterLoginStatusChange(login_status); | 254 system_tray_->UpdateAfterLoginStatusChange(login_status); |
198 if (web_notification_tray_) | 255 if (web_notification_tray_) |
199 web_notification_tray_->UpdateAfterLoginStatusChange(login_status); | 256 web_notification_tray_->UpdateAfterLoginStatusChange(login_status); |
200 #if defined(OS_CHROMEOS) | 257 #if defined(OS_CHROMEOS) |
201 if (logout_button_tray_) | 258 if (logout_button_tray_) |
202 logout_button_tray_->UpdateAfterLoginStatusChange(login_status); | 259 logout_button_tray_->UpdateAfterLoginStatusChange(login_status); |
203 #endif | 260 #endif |
204 if (overview_button_tray_) | 261 if (overview_button_tray_) |
205 overview_button_tray_->UpdateAfterLoginStatusChange(login_status); | 262 overview_button_tray_->UpdateAfterLoginStatusChange(login_status); |
206 } | 263 } |
207 | 264 |
265 void StatusAreaWidget::CalculateBorderMD(gfx::Insets* insets, | |
266 ShelfAlignment alignment, | |
267 bool is_on_edge) { | |
268 const int shelf_size = GetShelfConstant(SHELF_SIZE); | |
269 const int item_height = GetTrayConstant(TRAY_ITEM_HEIGHT_LEGACY); | |
270 int top_edge, left_edge, bottom_edge, right_edge; | |
271 | |
272 // Tray views are laid out right-to-left or bottom-to-top. | |
273 const bool horizontal_alignment = IsHorizontalAlignment(alignment); | |
274 const int padding = (shelf_size - item_height) / 2; | |
275 const int extended_padding = GetTrayConstant(TRAY_PADDING_FROM_EDGE_OF_SHELF); | |
276 | |
277 top_edge = horizontal_alignment ? padding : 0; | |
278 left_edge = horizontal_alignment ? 0 : padding; | |
279 bottom_edge = | |
280 horizontal_alignment ? padding : (is_on_edge ? extended_padding : 0); | |
281 right_edge = | |
282 horizontal_alignment ? (is_on_edge ? extended_padding : 0) : padding; | |
283 | |
284 insets->Set(top_edge, left_edge, bottom_edge, right_edge); | |
285 } | |
286 | |
287 void StatusAreaWidget::CalculateBorderNonMD(gfx::Insets* insets, | |
288 ShelfAlignment alignment, | |
289 bool is_overview) { | |
290 const int shelf_size = GetShelfConstant(SHELF_SIZE); | |
291 const int item_height = GetTrayConstant(TRAY_ITEM_HEIGHT_LEGACY); | |
292 int top_edge, left_edge, bottom_edge, right_edge; | |
293 if (IsHorizontalAlignment(alignment)) { | |
294 top_edge = kShelfItemInset; | |
295 left_edge = 0; | |
296 bottom_edge = shelf_size - kShelfItemInset - item_height; | |
297 right_edge = | |
298 is_overview ? GetTrayConstant(TRAY_PADDING_FROM_EDGE_OF_SHELF) : 0; | |
299 } else if (alignment == SHELF_ALIGNMENT_LEFT) { | |
300 top_edge = 0; | |
301 left_edge = shelf_size - kShelfItemInset - item_height; | |
302 bottom_edge = | |
303 is_overview ? GetTrayConstant(TRAY_PADDING_FROM_EDGE_OF_SHELF) : 0; | |
304 right_edge = kShelfItemInset; | |
305 } else { // SHELF_ALIGNMENT_RIGHT | |
306 top_edge = 0; | |
307 left_edge = kShelfItemInset; | |
308 bottom_edge = | |
309 is_overview ? GetTrayConstant(TRAY_PADDING_FROM_EDGE_OF_SHELF) : 0; | |
310 right_edge = shelf_size - kShelfItemInset - item_height; | |
311 } | |
312 insets->Set(top_edge, left_edge, bottom_edge, right_edge); | |
tdanderson
2016/06/29 17:46:19
Some refactoring may be advisable here, but I will
yiyix
2016/06/29 18:56:39
Ok, I agree that some trick we used in space calcu
| |
313 } | |
314 | |
208 } // namespace ash | 315 } // namespace ash |
OLD | NEW |