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

Side by Side Diff: chrome/browser/ui/views/tabs/tab.cc

Issue 12328027: Audio indicator in each tab (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 10 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 "chrome/browser/ui/views/tabs/tab.h" 5 #include "chrome/browser/ui/views/tabs/tab.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/alias.h" 10 #include "base/debug/alias.h"
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 data_.crashed_status != base::TERMINATION_STATUS_PROCESS_WAS_KILLED) 507 data_.crashed_status != base::TERMINATION_STATUS_PROCESS_WAS_KILLED)
508 StartCrashAnimation(); 508 StartCrashAnimation();
509 #else 509 #else
510 StartCrashAnimation(); 510 StartCrashAnimation();
511 #endif 511 #endif
512 } 512 }
513 513
514 } else if ((data_.capture_state == TabRendererData::CAPTURE_STATE_NONE) && 514 } else if ((data_.capture_state == TabRendererData::CAPTURE_STATE_NONE) &&
515 (old.capture_state != TabRendererData::CAPTURE_STATE_NONE)) { 515 (old.capture_state != TabRendererData::CAPTURE_STATE_NONE)) {
516 StopRecordingAnimation(); 516 StopRecordingAnimation();
517 517
sky 2013/02/21 01:58:40 What's with all these empty lines. Can you nuke 51
cpu_(ooo_6.6-7.5) 2013/02/21 03:34:51 I know, it looked really funky but I was just goin
518 } else if ((data_.capture_state != TabRendererData::CAPTURE_STATE_NONE) && 518 } else if ((data_.capture_state != TabRendererData::CAPTURE_STATE_NONE) &&
519 (old.capture_state == TabRendererData::CAPTURE_STATE_NONE)) { 519 (old.capture_state == TabRendererData::CAPTURE_STATE_NONE)) {
520 StartRecordingAnimation(); 520 StartRecordingAnimation();
521 521
522 } else if ((data_.audio_state == TabRendererData::AUDIO_STATE_NONE) &&
523 (old.audio_state != TabRendererData::AUDIO_STATE_NONE)) {
524 StopAudioPlayingAnimation();
525
526 } else if ((data_.audio_state != TabRendererData::AUDIO_STATE_NONE) &&
527 (old.audio_state == TabRendererData::AUDIO_STATE_NONE)) {
528 StartAudioPlayingAnimation();
529
522 } else { 530 } else {
523 if (IsPerformingCrashAnimation()) 531 if (IsPerformingCrashAnimation())
524 StopCrashAnimation(); 532 StopCrashAnimation();
525 ResetCrashedFavicon(); 533 ResetCrashedFavicon();
526 } 534 }
527 535
528 if (old.mini != data_.mini) { 536 if (old.mini != data_.mini) {
529 if (tab_animation_.get() && tab_animation_->is_animating()) { 537 if (tab_animation_.get() && tab_animation_->is_animating()) {
530 tab_animation_->Stop(); 538 tab_animation_->Stop();
531 tab_animation_.reset(NULL); 539 tab_animation_.reset(NULL);
(...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after
1358 // Paint network activity (aka throbber) animation frame. 1366 // Paint network activity (aka throbber) animation frame.
1359 if (data().network_state != TabRendererData::NETWORK_STATE_NONE) { 1367 if (data().network_state != TabRendererData::NETWORK_STATE_NONE) {
1360 ui::ThemeProvider* tp = GetThemeProvider(); 1368 ui::ThemeProvider* tp = GetThemeProvider();
1361 gfx::ImageSkia frames(*tp->GetImageSkiaNamed( 1369 gfx::ImageSkia frames(*tp->GetImageSkiaNamed(
1362 (data().network_state == TabRendererData::NETWORK_STATE_WAITING) ? 1370 (data().network_state == TabRendererData::NETWORK_STATE_WAITING) ?
1363 IDR_THROBBER_WAITING : IDR_THROBBER)); 1371 IDR_THROBBER_WAITING : IDR_THROBBER));
1364 1372
1365 int icon_size = frames.height(); 1373 int icon_size = frames.height();
1366 int image_offset = loading_animation_frame_ * icon_size; 1374 int image_offset = loading_animation_frame_ * icon_size;
1367 DrawIconCenter(canvas, frames, image_offset, 1375 DrawIconCenter(canvas, frames, image_offset,
1368 icon_size, icon_size, bounds, false, SkPaint()); 1376 icon_size, icon_size,
1377 bounds, false, SkPaint());
1369 return; 1378 return;
1370 } 1379 }
1371 1380
1372 // Paint regular icon and potentially overlays. 1381 // Paint regular icon and potentially overlays.
1373 canvas->Save(); 1382 canvas->Save();
1374 canvas->ClipRect(GetLocalBounds()); 1383 canvas->ClipRect(GetLocalBounds());
1375 if (should_display_crashed_favicon_) { 1384 if (should_display_crashed_favicon_) {
1376 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 1385 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1377 gfx::ImageSkia crashed_favicon(*rb.GetImageSkiaNamed(IDR_SAD_FAVICON)); 1386 gfx::ImageSkia crashed_favicon(*rb.GetImageSkiaNamed(IDR_SAD_FAVICON));
1378 bounds.set_y(bounds.y() + favicon_hiding_offset_); 1387 bounds.set_y(bounds.y() + favicon_hiding_offset_);
1379 DrawIconCenter(canvas, crashed_favicon, 0, 1388 DrawIconCenter(canvas, crashed_favicon, 0,
1380 crashed_favicon.width(), 1389 crashed_favicon.width(),
1381 crashed_favicon.height(), bounds, true, SkPaint()); 1390 crashed_favicon.height(),
1391 bounds, true, SkPaint());
1382 } else { 1392 } else {
1383 if (!data().favicon.isNull()) { 1393 if (!data().favicon.isNull()) {
1384 if (data().capture_state == TabRendererData::CAPTURE_STATE_PROJECTING) { 1394 if (data().capture_state == TabRendererData::CAPTURE_STATE_PROJECTING) {
1385 // If projecting, shrink favicon and add projection screen instead. 1395 // If projecting, shrink favicon and add projection screen instead.
1386 gfx::ImageSkia resized_icon = 1396 gfx::ImageSkia resized_icon =
1387 gfx::ImageSkiaOperations::CreateResizedImage( 1397 gfx::ImageSkiaOperations::CreateResizedImage(
1388 data().favicon, 1398 data().favicon,
1389 skia::ImageOperations::RESIZE_BEST, 1399 skia::ImageOperations::RESIZE_BEST,
1390 gfx::Size(data().favicon.width() * 1400 gfx::Size(data().favicon.width() *
1391 kProjectingFaviconResizeScale, 1401 kProjectingFaviconResizeScale,
1392 data().favicon.height() * 1402 data().favicon.height() *
1393 kProjectingFaviconResizeScale)); 1403 kProjectingFaviconResizeScale));
1394 1404
1395 gfx::Rect resized_bounds(bounds); 1405 gfx::Rect resized_bounds(bounds);
1396 // Need to shift it up a bit vertically because the projection screen 1406 // Need to shift it up a bit vertically because the projection screen
1397 // is thinner on the top and bottom. 1407 // is thinner on the top and bottom.
1398 resized_bounds.set_y(resized_bounds.y() - 1); 1408 resized_bounds.set_y(resized_bounds.y() - 1);
1399 1409
1400 DrawIconCenter(canvas, resized_icon, 0, 1410 DrawIconCenter(canvas, resized_icon, 0,
1401 resized_icon.width(), 1411 resized_icon.width(),
1402 resized_icon.height(), 1412 resized_icon.height(),
1403 resized_bounds, true, SkPaint()); 1413 resized_bounds, true, SkPaint());
1404 1414
1405 ui::ThemeProvider* tp = GetThemeProvider(); 1415 ui::ThemeProvider* tp = GetThemeProvider();
1406 gfx::ImageSkia projection_screen( 1416 gfx::ImageSkia projection_screen(
1407 *tp->GetImageSkiaNamed(IDR_TAB_CAPTURE)); 1417 *tp->GetImageSkiaNamed(IDR_TAB_CAPTURE));
1418 DrawIconCenter(canvas, projection_screen, 0,
1419 data().favicon.width(),
1420 data().favicon.height(),
1421 bounds, true, SkPaint());
1422 } else {
1423 DrawIconCenter(canvas, data().favicon, 0,
1424 data().favicon.width(),
1425 data().favicon.height(),
1426 bounds, true, SkPaint());
1408 1427
1409 DrawIconCenter(canvas, projection_screen, 0, 1428 if (data().audio_state == TabRendererData::AUDIO_STATE_PLAYING) {
1410 data().favicon.width(), 1429 // If audio is playing, we draw on top of the icon the
1411 data().favicon.height(), 1430 // current equalizer animiation frame.
1412 bounds, true, SkPaint()); 1431 ui::ThemeProvider* tp = GetThemeProvider();
1413 } else { 1432 gfx::ImageSkia equalizer(*tp->GetImageSkiaNamed(IDR_AUDIO_ANIMATION));
1414 // TODO(pkasting): Use code in tab_icon_view.cc:PaintIcon() (or switch 1433 int icon_size = equalizer.height();
1415 // to using that class to render the favicon). 1434 int number_of_frames = equalizer.width() / icon_size;
1416 DrawIconCenter(canvas, data().favicon, 0, 1435 int frame = static_cast<int>(
1417 data().favicon.width(), 1436 icon_animation_->GetCurrentValue() * number_of_frames);
1418 data().favicon.height(), 1437 int image_offset = frame * icon_size;
1419 bounds, true, SkPaint()); 1438 DrawIconAtLocation(canvas, equalizer, image_offset,
1439 bounds.x(), bounds.y() + 1,
1440 icon_size, icon_size,
1441 false, SkPaint());
1442 }
1420 } 1443 }
1421 } 1444 }
1422 } 1445 }
1423 canvas->Restore(); 1446 canvas->Restore();
1424 1447
1425 // Paint recording or projecting animation overlay. 1448 // Paint recording or projecting animation overlay.
1426 if (data().capture_state != TabRendererData::CAPTURE_STATE_NONE) { 1449 if (data().capture_state != TabRendererData::CAPTURE_STATE_NONE) {
1427 SkPaint paint; 1450 SkPaint paint;
1428 paint.setAntiAlias(true); 1451 paint.setAntiAlias(true);
1429 U8CPU alpha = icon_animation_->GetCurrentValue() * 0xff; 1452 U8CPU alpha = icon_animation_->GetCurrentValue() * 0xff;
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1596 icon_animation_.reset(animation); 1619 icon_animation_.reset(animation);
1597 } 1620 }
1598 1621
1599 void Tab::StopRecordingAnimation() { 1622 void Tab::StopRecordingAnimation() {
1600 if (!icon_animation_.get()) 1623 if (!icon_animation_.get())
1601 return; 1624 return;
1602 icon_animation_->Stop(); 1625 icon_animation_->Stop();
1603 icon_animation_.reset(); 1626 icon_animation_.reset();
1604 } 1627 }
1605 1628
1629 void Tab::StartAudioPlayingAnimation() {
1630 ui::ThrobAnimation* animation = new ui::ThrobAnimation(this);
1631 animation->SetTweenType(ui::Tween::LINEAR);
1632 animation->SetThrobDuration(2000);
1633 animation->StartThrobbing(-1);
1634 icon_animation_.reset(animation);
1635 }
1636
1637 void Tab::StopAudioPlayingAnimation() {
1638 if (!icon_animation_.get())
1639 return;
1640 icon_animation_->Stop();
1641 icon_animation_.reset();
1642 }
1643
1606 bool Tab::IsPerformingCrashAnimation() const { 1644 bool Tab::IsPerformingCrashAnimation() const {
1607 return icon_animation_.get() && data_.IsCrashed(); 1645 return icon_animation_.get() && data_.IsCrashed();
1608 } 1646 }
1609 1647
1610 void Tab::ScheduleIconPaint() { 1648 void Tab::ScheduleIconPaint() {
1611 gfx::Rect bounds = GetIconBounds(); 1649 gfx::Rect bounds = GetIconBounds();
1612 if (bounds.IsEmpty()) 1650 if (bounds.IsEmpty())
1613 return; 1651 return;
1614 1652
1615 // Extends the area to the bottom when sad_favicon is 1653 // Extends the area to the bottom when sad_favicon is
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1682 const gfx::ImageSkia& image) { 1720 const gfx::ImageSkia& image) {
1683 DCHECK_NE(scale_factor, ui::SCALE_FACTOR_NONE); 1721 DCHECK_NE(scale_factor, ui::SCALE_FACTOR_NONE);
1684 ImageCacheEntry entry; 1722 ImageCacheEntry entry;
1685 entry.resource_id = resource_id; 1723 entry.resource_id = resource_id;
1686 entry.scale_factor = scale_factor; 1724 entry.scale_factor = scale_factor;
1687 entry.image = image; 1725 entry.image = image;
1688 image_cache_->push_front(entry); 1726 image_cache_->push_front(entry);
1689 if (image_cache_->size() > kMaxImageCacheSize) 1727 if (image_cache_->size() > kMaxImageCacheSize)
1690 image_cache_->pop_back(); 1728 image_cache_->pop_back();
1691 } 1729 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698