OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_button.h" | 5 #include "ash/shelf/shelf_button.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ash/ash_constants.h" | 9 #include "ash/ash_constants.h" |
10 #include "ash/ash_switches.h" | 10 #include "ash/ash_switches.h" |
11 #include "ash/shelf/shelf.h" | 11 #include "ash/shelf/shelf.h" |
12 #include "ash/shelf/shelf_button_host.h" | 12 #include "ash/shelf/shelf_view.h" |
13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
14 #include "grit/ash_resources.h" | 14 #include "grit/ash_resources.h" |
15 #include "skia/ext/image_operations.h" | 15 #include "skia/ext/image_operations.h" |
16 #include "ui/accessibility/ax_view_state.h" | 16 #include "ui/accessibility/ax_view_state.h" |
17 #include "ui/base/resource/resource_bundle.h" | 17 #include "ui/base/resource/resource_bundle.h" |
18 #include "ui/compositor/layer.h" | 18 #include "ui/compositor/layer.h" |
19 #include "ui/compositor/scoped_layer_animation_settings.h" | 19 #include "ui/compositor/scoped_layer_animation_settings.h" |
20 #include "ui/events/event_constants.h" | 20 #include "ui/events/event_constants.h" |
21 #include "ui/gfx/animation/animation_delegate.h" | 21 #include "ui/gfx/animation/animation_delegate.h" |
22 #include "ui/gfx/animation/throb_animation.h" | 22 #include "ui/gfx/animation/throb_animation.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 } // namespace | 108 } // namespace |
109 | 109 |
110 namespace ash { | 110 namespace ash { |
111 | 111 |
112 //////////////////////////////////////////////////////////////////////////////// | 112 //////////////////////////////////////////////////////////////////////////////// |
113 // ShelfButton::BarView | 113 // ShelfButton::BarView |
114 | 114 |
115 class ShelfButton::BarView : public views::ImageView, | 115 class ShelfButton::BarView : public views::ImageView, |
116 public ShelfButtonAnimation::Observer { | 116 public ShelfButtonAnimation::Observer { |
117 public: | 117 public: |
118 BarView(ShelfButton* host) | 118 BarView(Shelf* shelf) |
119 : host_(host), | 119 : shelf_(shelf), |
120 show_attention_(false), | 120 show_attention_(false), |
121 animation_end_time_(base::TimeTicks()), | 121 animation_end_time_(base::TimeTicks()), |
122 animating_(false) { | 122 animating_(false) { |
123 // Make sure the events reach the parent view for handling. | 123 // Make sure the events reach the parent view for handling. |
124 set_interactive(false); | 124 set_interactive(false); |
125 } | 125 } |
126 | 126 |
127 ~BarView() override { | 127 ~BarView() override { |
128 if (show_attention_) | 128 if (show_attention_) |
129 ShelfButtonAnimation::GetInstance()->RemoveObserver(this); | 129 ShelfButtonAnimation::GetInstance()->RemoveObserver(this); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 void UpdateBounds() { | 173 void UpdateBounds() { |
174 gfx::Rect bounds = base_bounds_; | 174 gfx::Rect bounds = base_bounds_; |
175 if (show_attention_) { | 175 if (show_attention_) { |
176 // Scale from .35 to 1.0 of the total width (which is wider than the | 176 // Scale from .35 to 1.0 of the total width (which is wider than the |
177 // visible width of the image), so the animation "rests" briefly at full | 177 // visible width of the image), so the animation "rests" briefly at full |
178 // visible width. Cap bounds length at kIconSize to prevent visual | 178 // visible width. Cap bounds length at kIconSize to prevent visual |
179 // flutter while centering bar within further expanding bounds. | 179 // flutter while centering bar within further expanding bounds. |
180 double animation = animating_ ? | 180 double animation = animating_ ? |
181 ShelfButtonAnimation::GetInstance()->GetAnimation() : 1.0; | 181 ShelfButtonAnimation::GetInstance()->GetAnimation() : 1.0; |
182 double scale = .35 + .65 * animation; | 182 double scale = .35 + .65 * animation; |
183 if (host_->shelf()->alignment() == SHELF_ALIGNMENT_BOTTOM) { | 183 if (shelf_->alignment() == SHELF_ALIGNMENT_BOTTOM) { |
184 int width = base_bounds_.width() * scale; | 184 int width = base_bounds_.width() * scale; |
185 bounds.set_width(std::min(width, kIconSize)); | 185 bounds.set_width(std::min(width, kIconSize)); |
186 int x_offset = (base_bounds_.width() - bounds.width()) / 2; | 186 int x_offset = (base_bounds_.width() - bounds.width()) / 2; |
187 bounds.set_x(base_bounds_.x() + x_offset); | 187 bounds.set_x(base_bounds_.x() + x_offset); |
188 UpdateAnimating(bounds.width() == kIconSize); | 188 UpdateAnimating(bounds.width() == kIconSize); |
189 } else { | 189 } else { |
190 int height = base_bounds_.height() * scale; | 190 int height = base_bounds_.height() * scale; |
191 bounds.set_height(std::min(height, kIconSize)); | 191 bounds.set_height(std::min(height, kIconSize)); |
192 int y_offset = (base_bounds_.height() - bounds.height()) / 2; | 192 int y_offset = (base_bounds_.height() - bounds.height()) / 2; |
193 bounds.set_y(base_bounds_.y() + y_offset); | 193 bounds.set_y(base_bounds_.y() + y_offset); |
194 UpdateAnimating(bounds.height() == kIconSize); | 194 UpdateAnimating(bounds.height() == kIconSize); |
195 } | 195 } |
196 } | 196 } |
197 SetBoundsRect(bounds); | 197 SetBoundsRect(bounds); |
198 } | 198 } |
199 | 199 |
200 void UpdateAnimating(bool max_length) { | 200 void UpdateAnimating(bool max_length) { |
201 if (!max_length) | 201 if (!max_length) |
202 return; | 202 return; |
203 if (base::TimeTicks::Now() > animation_end_time_) { | 203 if (base::TimeTicks::Now() > animation_end_time_) { |
204 animating_ = false; | 204 animating_ = false; |
205 ShelfButtonAnimation::GetInstance()->RemoveObserver(this); | 205 ShelfButtonAnimation::GetInstance()->RemoveObserver(this); |
206 } | 206 } |
207 } | 207 } |
208 | 208 |
209 ShelfButton* host_; | 209 Shelf* shelf_; |
210 bool show_attention_; | 210 bool show_attention_; |
211 base::TimeTicks animation_end_time_; // For attention throbbing underline. | 211 base::TimeTicks animation_end_time_; // For attention throbbing underline. |
212 bool animating_; // Is time-limited attention animation running? | 212 bool animating_; // Is time-limited attention animation running? |
213 gfx::Rect base_bounds_; | 213 gfx::Rect base_bounds_; |
214 | 214 |
215 DISALLOW_COPY_AND_ASSIGN(BarView); | 215 DISALLOW_COPY_AND_ASSIGN(BarView); |
216 }; | 216 }; |
217 | 217 |
218 //////////////////////////////////////////////////////////////////////////////// | 218 //////////////////////////////////////////////////////////////////////////////// |
219 // ShelfButton::IconView | |
220 | |
221 ShelfButton::IconView::IconView() : icon_size_(kIconSize) { | |
222 // Do not make this interactive, so that events are sent to ShelfView for | |
223 // handling. | |
224 set_interactive(false); | |
225 } | |
226 | |
227 ShelfButton::IconView::~IconView() { | |
228 } | |
229 | |
230 //////////////////////////////////////////////////////////////////////////////// | |
231 // ShelfButton | 219 // ShelfButton |
232 | 220 |
233 // static | 221 // static |
234 const char ShelfButton::kViewClassName[] = "ash/ShelfButton"; | 222 const char ShelfButton::kViewClassName[] = "ash/ShelfButton"; |
235 | 223 |
236 ShelfButton* ShelfButton::Create(views::ButtonListener* listener, | 224 ShelfButton::ShelfButton(ShelfView* shelf_view) |
237 ShelfButtonHost* host, | 225 : CustomButton(shelf_view), |
238 Shelf* shelf) { | 226 shelf_view_(shelf_view), |
239 ShelfButton* button = new ShelfButton(listener, host, shelf); | 227 icon_view_(new views::ImageView()), |
240 button->Init(); | 228 bar_(new BarView(shelf_view->shelf())), |
241 return button; | |
242 } | |
243 | |
244 ShelfButton::ShelfButton(views::ButtonListener* listener, | |
245 ShelfButtonHost* host, | |
246 Shelf* shelf) | |
247 : CustomButton(listener), | |
248 host_(host), | |
249 icon_view_(NULL), | |
250 bar_(new BarView(this)), | |
251 state_(STATE_NORMAL), | 229 state_(STATE_NORMAL), |
252 shelf_(shelf), | 230 destroyed_flag_(nullptr) { |
253 destroyed_flag_(NULL) { | |
254 SetAccessibilityFocusable(true); | 231 SetAccessibilityFocusable(true); |
255 | 232 |
256 const gfx::ShadowValue kShadows[] = { | 233 const gfx::ShadowValue kShadows[] = { |
257 gfx::ShadowValue(gfx::Vector2d(0, 2), 0, SkColorSetARGB(0x1A, 0, 0, 0)), | 234 gfx::ShadowValue(gfx::Vector2d(0, 2), 0, SkColorSetARGB(0x1A, 0, 0, 0)), |
258 gfx::ShadowValue(gfx::Vector2d(0, 3), 1, SkColorSetARGB(0x1A, 0, 0, 0)), | 235 gfx::ShadowValue(gfx::Vector2d(0, 3), 1, SkColorSetARGB(0x1A, 0, 0, 0)), |
259 gfx::ShadowValue(gfx::Vector2d(0, 0), 1, SkColorSetARGB(0x54, 0, 0, 0)), | 236 gfx::ShadowValue(gfx::Vector2d(0, 0), 1, SkColorSetARGB(0x54, 0, 0, 0)), |
260 }; | 237 }; |
261 icon_shadows_.assign(kShadows, kShadows + arraysize(kShadows)); | 238 icon_shadows_.assign(kShadows, kShadows + arraysize(kShadows)); |
262 | 239 |
| 240 // TODO: refactor the layers so each button doesn't require 2. |
| 241 icon_view_->SetPaintToLayer(true); |
| 242 icon_view_->layer()->SetFillsBoundsOpaquely(false); |
| 243 icon_view_->SetHorizontalAlignment(views::ImageView::CENTER); |
| 244 icon_view_->SetVerticalAlignment(views::ImageView::LEADING); |
| 245 // Do not make this interactive, so that events are sent to ShelfView. |
| 246 icon_view_->set_interactive(false); |
| 247 |
263 AddChildView(bar_); | 248 AddChildView(bar_); |
| 249 AddChildView(icon_view_); |
264 } | 250 } |
265 | 251 |
266 ShelfButton::~ShelfButton() { | 252 ShelfButton::~ShelfButton() { |
267 if (destroyed_flag_) | 253 if (destroyed_flag_) |
268 *destroyed_flag_ = true; | 254 *destroyed_flag_ = true; |
269 } | 255 } |
270 | 256 |
271 void ShelfButton::SetShadowedImage(const gfx::ImageSkia& image) { | 257 void ShelfButton::SetShadowedImage(const gfx::ImageSkia& image) { |
272 icon_view_->SetImage(gfx::ImageSkiaOperations::CreateImageWithDropShadow( | 258 icon_view_->SetImage(gfx::ImageSkiaOperations::CreateImageWithDropShadow( |
273 image, icon_shadows_)); | 259 image, icon_shadows_)); |
274 } | 260 } |
275 | 261 |
276 void ShelfButton::SetImage(const gfx::ImageSkia& image) { | 262 void ShelfButton::SetImage(const gfx::ImageSkia& image) { |
277 if (image.isNull()) { | 263 if (image.isNull()) { |
278 // TODO: need an empty image. | 264 // TODO: need an empty image. |
279 icon_view_->SetImage(image); | 265 icon_view_->SetImage(image); |
280 return; | 266 return; |
281 } | 267 } |
282 | 268 |
283 if (icon_view_->icon_size() == 0) { | |
284 SetShadowedImage(image); | |
285 return; | |
286 } | |
287 | |
288 // Resize the image maintaining our aspect ratio. | 269 // Resize the image maintaining our aspect ratio. |
289 int pref = icon_view_->icon_size(); | |
290 float aspect_ratio = | 270 float aspect_ratio = |
291 static_cast<float>(image.width()) / static_cast<float>(image.height()); | 271 static_cast<float>(image.width()) / static_cast<float>(image.height()); |
292 int height = pref; | 272 int height = kIconSize; |
293 int width = static_cast<int>(aspect_ratio * height); | 273 int width = static_cast<int>(aspect_ratio * height); |
294 if (width > pref) { | 274 if (width > kIconSize) { |
295 width = pref; | 275 width = kIconSize; |
296 height = static_cast<int>(width / aspect_ratio); | 276 height = static_cast<int>(width / aspect_ratio); |
297 } | 277 } |
298 | 278 |
299 if (width == image.width() && height == image.height()) { | 279 if (width == image.width() && height == image.height()) { |
300 SetShadowedImage(image); | 280 SetShadowedImage(image); |
301 return; | 281 return; |
302 } | 282 } |
303 | 283 |
304 SetShadowedImage(gfx::ImageSkiaOperations::CreateResizedImage(image, | 284 SetShadowedImage(gfx::ImageSkiaOperations::CreateResizedImage(image, |
305 skia::ImageOperations::RESIZE_BEST, gfx::Size(width, height))); | 285 skia::ImageOperations::RESIZE_BEST, gfx::Size(width, height))); |
(...skipping 29 matching lines...) Expand all Loading... |
335 ui::MenuSourceType source_type) { | 315 ui::MenuSourceType source_type) { |
336 if (!context_menu_controller()) | 316 if (!context_menu_controller()) |
337 return; | 317 return; |
338 | 318 |
339 bool destroyed = false; | 319 bool destroyed = false; |
340 destroyed_flag_ = &destroyed; | 320 destroyed_flag_ = &destroyed; |
341 | 321 |
342 CustomButton::ShowContextMenu(p, source_type); | 322 CustomButton::ShowContextMenu(p, source_type); |
343 | 323 |
344 if (!destroyed) { | 324 if (!destroyed) { |
345 destroyed_flag_ = NULL; | 325 destroyed_flag_ = nullptr; |
346 // The menu will not propagate mouse events while its shown. To address, | 326 // The menu will not propagate mouse events while its shown. To address, |
347 // the hover state gets cleared once the menu was shown (and this was not | 327 // the hover state gets cleared once the menu was shown (and this was not |
348 // destroyed). | 328 // destroyed). |
349 ClearState(STATE_HOVERED); | 329 ClearState(STATE_HOVERED); |
350 } | 330 } |
351 } | 331 } |
352 | 332 |
353 const char* ShelfButton::GetClassName() const { | 333 const char* ShelfButton::GetClassName() const { |
354 return kViewClassName; | 334 return kViewClassName; |
355 } | 335 } |
356 | 336 |
357 bool ShelfButton::OnMousePressed(const ui::MouseEvent& event) { | 337 bool ShelfButton::OnMousePressed(const ui::MouseEvent& event) { |
358 CustomButton::OnMousePressed(event); | 338 CustomButton::OnMousePressed(event); |
359 host_->PointerPressedOnButton(this, ShelfButtonHost::MOUSE, event); | 339 shelf_view_->PointerPressedOnButton(this, ShelfView::MOUSE, event); |
360 return true; | 340 return true; |
361 } | 341 } |
362 | 342 |
363 void ShelfButton::OnMouseReleased(const ui::MouseEvent& event) { | 343 void ShelfButton::OnMouseReleased(const ui::MouseEvent& event) { |
364 CustomButton::OnMouseReleased(event); | 344 CustomButton::OnMouseReleased(event); |
365 host_->PointerReleasedOnButton(this, ShelfButtonHost::MOUSE, false); | 345 shelf_view_->PointerReleasedOnButton(this, ShelfView::MOUSE, false); |
366 } | 346 } |
367 | 347 |
368 void ShelfButton::OnMouseCaptureLost() { | 348 void ShelfButton::OnMouseCaptureLost() { |
369 ClearState(STATE_HOVERED); | 349 ClearState(STATE_HOVERED); |
370 host_->PointerReleasedOnButton(this, ShelfButtonHost::MOUSE, true); | 350 shelf_view_->PointerReleasedOnButton(this, ShelfView::MOUSE, true); |
371 CustomButton::OnMouseCaptureLost(); | 351 CustomButton::OnMouseCaptureLost(); |
372 } | 352 } |
373 | 353 |
374 bool ShelfButton::OnMouseDragged(const ui::MouseEvent& event) { | 354 bool ShelfButton::OnMouseDragged(const ui::MouseEvent& event) { |
375 CustomButton::OnMouseDragged(event); | 355 CustomButton::OnMouseDragged(event); |
376 host_->PointerDraggedOnButton(this, ShelfButtonHost::MOUSE, event); | 356 shelf_view_->PointerDraggedOnButton(this, ShelfView::MOUSE, event); |
377 return true; | 357 return true; |
378 } | 358 } |
379 | 359 |
380 void ShelfButton::OnMouseMoved(const ui::MouseEvent& event) { | |
381 CustomButton::OnMouseMoved(event); | |
382 host_->MouseMovedOverButton(this); | |
383 } | |
384 | |
385 void ShelfButton::OnMouseEntered(const ui::MouseEvent& event) { | |
386 AddState(STATE_HOVERED); | |
387 CustomButton::OnMouseEntered(event); | |
388 host_->MouseEnteredButton(this); | |
389 } | |
390 | |
391 void ShelfButton::OnMouseExited(const ui::MouseEvent& event) { | |
392 ClearState(STATE_HOVERED); | |
393 CustomButton::OnMouseExited(event); | |
394 host_->MouseExitedButton(this); | |
395 } | |
396 | |
397 void ShelfButton::GetAccessibleState(ui::AXViewState* state) { | 360 void ShelfButton::GetAccessibleState(ui::AXViewState* state) { |
398 state->role = ui::AX_ROLE_BUTTON; | 361 state->role = ui::AX_ROLE_BUTTON; |
399 state->name = host_->GetAccessibleName(this); | 362 state->name = shelf_view_->GetTitleForView(this); |
400 } | 363 } |
401 | 364 |
402 void ShelfButton::Layout() { | 365 void ShelfButton::Layout() { |
403 const gfx::Rect button_bounds(GetContentsBounds()); | 366 const gfx::Rect button_bounds(GetContentsBounds()); |
404 int icon_pad = shelf_->IsHorizontalAlignment() ? kIconPad : kIconPadVertical; | 367 Shelf* shelf = shelf_view_->shelf(); |
405 int x_offset = shelf_->PrimaryAxisValue(0, icon_pad); | 368 int icon_pad = shelf->PrimaryAxisValue(kIconPad, kIconPadVertical); |
406 int y_offset = shelf_->PrimaryAxisValue(icon_pad, 0); | 369 int x_offset = shelf->PrimaryAxisValue(0, icon_pad); |
| 370 int y_offset = shelf->PrimaryAxisValue(icon_pad, 0); |
407 | 371 |
408 int icon_width = std::min(kIconSize, | 372 int icon_width = std::min(kIconSize, button_bounds.width() - x_offset); |
409 button_bounds.width() - x_offset); | 373 int icon_height = std::min(kIconSize, button_bounds.height() - y_offset); |
410 int icon_height = std::min(kIconSize, | |
411 button_bounds.height() - y_offset); | |
412 | 374 |
413 // If on the left or top 'invert' the inset so the constant gap is on | 375 // If on the left or top 'invert' the inset so the constant gap is on |
414 // the interior (towards the center of display) edge of the shelf. | 376 // the interior (towards the center of display) edge of the shelf. |
415 if (SHELF_ALIGNMENT_LEFT == shelf_->alignment()) | 377 if (SHELF_ALIGNMENT_LEFT == shelf->alignment()) |
416 x_offset = button_bounds.width() - (kIconSize + icon_pad); | 378 x_offset = button_bounds.width() - (kIconSize + icon_pad); |
417 | 379 |
418 if (SHELF_ALIGNMENT_TOP == shelf_->alignment()) | 380 if (SHELF_ALIGNMENT_TOP == shelf->alignment()) |
419 y_offset = button_bounds.height() - (kIconSize + icon_pad); | 381 y_offset = button_bounds.height() - (kIconSize + icon_pad); |
420 | 382 |
421 // Center icon with respect to the secondary axis, and ensure | 383 // Center icon with respect to the secondary axis, and ensure |
422 // that the icon doesn't occlude the bar highlight. | 384 // that the icon doesn't occlude the bar highlight. |
423 if (shelf_->IsHorizontalAlignment()) { | 385 if (shelf->IsHorizontalAlignment()) { |
424 x_offset = std::max(0, button_bounds.width() - icon_width) / 2; | 386 x_offset = std::max(0, button_bounds.width() - icon_width) / 2; |
425 if (y_offset + icon_height + kBarSize > button_bounds.height()) | 387 if (y_offset + icon_height + kBarSize > button_bounds.height()) |
426 icon_height = button_bounds.height() - (y_offset + kBarSize); | 388 icon_height = button_bounds.height() - (y_offset + kBarSize); |
427 } else { | 389 } else { |
428 y_offset = std::max(0, button_bounds.height() - icon_height) / 2; | 390 y_offset = std::max(0, button_bounds.height() - icon_height) / 2; |
429 if (x_offset + icon_width + kBarSize > button_bounds.width()) | 391 if (x_offset + icon_width + kBarSize > button_bounds.width()) |
430 icon_width = button_bounds.width() - (x_offset + kBarSize); | 392 icon_width = button_bounds.width() - (x_offset + kBarSize); |
431 } | 393 } |
432 | 394 |
433 // Expand bounds to include shadows. | 395 // Expand bounds to include shadows. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 | 439 |
478 void ShelfButton::OnGestureEvent(ui::GestureEvent* event) { | 440 void ShelfButton::OnGestureEvent(ui::GestureEvent* event) { |
479 switch (event->type()) { | 441 switch (event->type()) { |
480 case ui::ET_GESTURE_TAP_DOWN: | 442 case ui::ET_GESTURE_TAP_DOWN: |
481 AddState(STATE_HOVERED); | 443 AddState(STATE_HOVERED); |
482 return CustomButton::OnGestureEvent(event); | 444 return CustomButton::OnGestureEvent(event); |
483 case ui::ET_GESTURE_END: | 445 case ui::ET_GESTURE_END: |
484 ClearState(STATE_HOVERED); | 446 ClearState(STATE_HOVERED); |
485 return CustomButton::OnGestureEvent(event); | 447 return CustomButton::OnGestureEvent(event); |
486 case ui::ET_GESTURE_SCROLL_BEGIN: | 448 case ui::ET_GESTURE_SCROLL_BEGIN: |
487 host_->PointerPressedOnButton(this, ShelfButtonHost::TOUCH, *event); | 449 shelf_view_->PointerPressedOnButton(this, ShelfView::TOUCH, *event); |
488 event->SetHandled(); | 450 event->SetHandled(); |
489 return; | 451 return; |
490 case ui::ET_GESTURE_SCROLL_UPDATE: | 452 case ui::ET_GESTURE_SCROLL_UPDATE: |
491 host_->PointerDraggedOnButton(this, ShelfButtonHost::TOUCH, *event); | 453 shelf_view_->PointerDraggedOnButton(this, ShelfView::TOUCH, *event); |
492 event->SetHandled(); | 454 event->SetHandled(); |
493 return; | 455 return; |
494 case ui::ET_GESTURE_SCROLL_END: | 456 case ui::ET_GESTURE_SCROLL_END: |
495 case ui::ET_SCROLL_FLING_START: | 457 case ui::ET_SCROLL_FLING_START: |
496 host_->PointerReleasedOnButton(this, ShelfButtonHost::TOUCH, false); | 458 shelf_view_->PointerReleasedOnButton(this, ShelfView::TOUCH, false); |
497 event->SetHandled(); | 459 event->SetHandled(); |
498 return; | 460 return; |
499 default: | 461 default: |
500 return CustomButton::OnGestureEvent(event); | 462 return CustomButton::OnGestureEvent(event); |
501 } | 463 } |
502 } | 464 } |
503 | 465 |
504 void ShelfButton::Init() { | |
505 icon_view_ = CreateIconView(); | |
506 | |
507 // TODO: refactor the layers so each button doesn't require 2. | |
508 icon_view_->SetPaintToLayer(true); | |
509 icon_view_->layer()->SetFillsBoundsOpaquely(false); | |
510 icon_view_->SetHorizontalAlignment(views::ImageView::CENTER); | |
511 icon_view_->SetVerticalAlignment(views::ImageView::LEADING); | |
512 | |
513 AddChildView(icon_view_); | |
514 } | |
515 | |
516 ShelfButton::IconView* ShelfButton::CreateIconView() { | |
517 return new IconView; | |
518 } | |
519 | |
520 void ShelfButton::UpdateState() { | 466 void ShelfButton::UpdateState() { |
521 UpdateBar(); | 467 UpdateBar(); |
522 | 468 Shelf* shelf = shelf_view_->shelf(); |
523 icon_view_->SetHorizontalAlignment(shelf_->PrimaryAxisValue( | 469 icon_view_->SetHorizontalAlignment(shelf->PrimaryAxisValue( |
524 views::ImageView::CENTER, views::ImageView::LEADING)); | 470 views::ImageView::CENTER, views::ImageView::LEADING)); |
525 icon_view_->SetVerticalAlignment(shelf_->PrimaryAxisValue( | 471 icon_view_->SetVerticalAlignment(shelf->PrimaryAxisValue( |
526 views::ImageView::LEADING, views::ImageView::CENTER)); | 472 views::ImageView::LEADING, views::ImageView::CENTER)); |
527 SchedulePaint(); | 473 SchedulePaint(); |
528 } | 474 } |
529 | 475 |
530 void ShelfButton::UpdateBar() { | 476 void ShelfButton::UpdateBar() { |
531 if (state_ & STATE_HIDDEN) { | 477 if (state_ & STATE_HIDDEN) { |
532 bar_->SetVisible(false); | 478 bar_->SetVisible(false); |
533 return; | 479 return; |
534 } | 480 } |
535 | 481 |
536 int bar_id = 0; | 482 int bar_id = 0; |
537 if (state_ & (STATE_ACTIVE)) | 483 if (state_ & (STATE_ACTIVE)) |
538 bar_id = IDR_ASH_SHELF_UNDERLINE_ACTIVE; | 484 bar_id = IDR_ASH_SHELF_UNDERLINE_ACTIVE; |
539 else if (state_ & STATE_ATTENTION) | 485 else if (state_ & STATE_ATTENTION) |
540 bar_id = IDR_ASH_SHELF_UNDERLINE_ATTENTION; | 486 bar_id = IDR_ASH_SHELF_UNDERLINE_ATTENTION; |
541 else if (state_ & STATE_RUNNING) | 487 else if (state_ & STATE_RUNNING) |
542 bar_id = IDR_ASH_SHELF_UNDERLINE_RUNNING; | 488 bar_id = IDR_ASH_SHELF_UNDERLINE_RUNNING; |
543 | 489 |
544 if (bar_id != 0) { | 490 if (bar_id != 0) { |
545 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 491 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
546 const gfx::ImageSkia* image = rb.GetImageNamed(bar_id).ToImageSkia(); | 492 const gfx::ImageSkia* image = rb.GetImageNamed(bar_id).ToImageSkia(); |
547 if (shelf_->alignment() == SHELF_ALIGNMENT_BOTTOM) { | 493 |
| 494 Shelf* shelf = shelf_view_->shelf(); |
| 495 if (shelf->alignment() == SHELF_ALIGNMENT_BOTTOM) { |
548 bar_->SetImage(*image); | 496 bar_->SetImage(*image); |
549 } else { | 497 } else { |
550 bar_->SetImage(gfx::ImageSkiaOperations::CreateRotatedImage( | 498 bar_->SetImage(gfx::ImageSkiaOperations::CreateRotatedImage( |
551 *image, shelf_->SelectValueForShelfAlignment( | 499 *image, shelf->SelectValueForShelfAlignment( |
552 SkBitmapOperations::ROTATION_90_CW, | 500 SkBitmapOperations::ROTATION_90_CW, |
553 SkBitmapOperations::ROTATION_90_CW, | 501 SkBitmapOperations::ROTATION_90_CW, |
554 SkBitmapOperations::ROTATION_270_CW, | 502 SkBitmapOperations::ROTATION_270_CW, |
555 SkBitmapOperations::ROTATION_180_CW))); | 503 SkBitmapOperations::ROTATION_180_CW))); |
556 } | 504 } |
557 bar_->SetHorizontalAlignment(shelf_->SelectValueForShelfAlignment( | 505 bar_->SetHorizontalAlignment(shelf->SelectValueForShelfAlignment( |
558 views::ImageView::CENTER, views::ImageView::LEADING, | 506 views::ImageView::CENTER, views::ImageView::LEADING, |
559 views::ImageView::TRAILING, views::ImageView::CENTER)); | 507 views::ImageView::TRAILING, views::ImageView::CENTER)); |
560 bar_->SetVerticalAlignment(shelf_->SelectValueForShelfAlignment( | 508 bar_->SetVerticalAlignment(shelf->SelectValueForShelfAlignment( |
561 views::ImageView::TRAILING, views::ImageView::CENTER, | 509 views::ImageView::TRAILING, views::ImageView::CENTER, |
562 views::ImageView::CENTER, views::ImageView::LEADING)); | 510 views::ImageView::CENTER, views::ImageView::LEADING)); |
563 bar_->SchedulePaint(); | 511 bar_->SchedulePaint(); |
564 } | 512 } |
565 | 513 |
566 bar_->SetVisible(bar_id != 0 && state_ != STATE_NORMAL); | 514 bar_->SetVisible(bar_id != 0 && state_ != STATE_NORMAL); |
567 } | 515 } |
568 | 516 |
569 } // namespace ash | 517 } // namespace ash |
OLD | NEW |