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

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

Issue 11236052: Indicate tab recording state in tab strip (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Always add capture devices Created 8 years, 2 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/base_tab.h" 5 #include "chrome/browser/ui/views/tabs/base_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 23 matching lines...) Expand all
34 #if defined(USE_ASH) 34 #if defined(USE_ASH)
35 #include "ui/aura/env.h" 35 #include "ui/aura/env.h"
36 #endif 36 #endif
37 37
38 // How long the pulse throb takes. 38 // How long the pulse throb takes.
39 static const int kPulseDurationMs = 200; 39 static const int kPulseDurationMs = 200;
40 40
41 // How long the hover state takes. 41 // How long the hover state takes.
42 static const int kHoverDurationMs = 400; 42 static const int kHoverDurationMs = 400;
43 43
44 // How long the recording button takes to fade in/out.
45 static const int kRecordingDurationMs = 1000;
46
44 //////////////////////////////////////////////////////////////////////////////// 47 ////////////////////////////////////////////////////////////////////////////////
45 // TabCloseButton 48 // TabCloseButton
46 // 49 //
47 // This is a Button subclass that causes middle clicks to be forwarded to the 50 // This is a Button subclass that causes middle clicks to be forwarded to the
48 // parent View by explicitly not handling them in OnMousePressed. 51 // parent View by explicitly not handling them in OnMousePressed.
49 class BaseTab::TabCloseButton : public views::ImageButton { 52 class BaseTab::TabCloseButton : public views::ImageButton {
50 public: 53 public:
51 explicit TabCloseButton(BaseTab* tab) : views::ImageButton(tab), tab_(tab) {} 54 explicit TabCloseButton(BaseTab* tab) : views::ImageButton(tab), tab_(tab) {}
52 virtual ~TabCloseButton() {} 55 virtual ~TabCloseButton() {}
53 56
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 110
108 namespace { 111 namespace {
109 112
110 // Draws the icon image at the center of |bounds|. 113 // Draws the icon image at the center of |bounds|.
111 void DrawIconCenter(gfx::Canvas* canvas, 114 void DrawIconCenter(gfx::Canvas* canvas,
112 const gfx::ImageSkia& image, 115 const gfx::ImageSkia& image,
113 int image_offset, 116 int image_offset,
114 int icon_width, 117 int icon_width,
115 int icon_height, 118 int icon_height,
116 const gfx::Rect& bounds, 119 const gfx::Rect& bounds,
117 bool filter) { 120 bool filter,
121 const SkPaint& paint) {
118 // Center the image within bounds. 122 // Center the image within bounds.
119 int dst_x = bounds.x() - (icon_width - bounds.width()) / 2; 123 int dst_x = bounds.x() - (icon_width - bounds.width()) / 2;
120 int dst_y = bounds.y() - (icon_height - bounds.height()) / 2; 124 int dst_y = bounds.y() - (icon_height - bounds.height()) / 2;
121 // NOTE: the clipping is a work around for 69528, it shouldn't be necessary. 125 // NOTE: the clipping is a work around for 69528, it shouldn't be necessary.
122 canvas->Save(); 126 canvas->Save();
123 canvas->ClipRect(gfx::Rect(dst_x, dst_y, icon_width, icon_height)); 127 canvas->ClipRect(gfx::Rect(dst_x, dst_y, icon_width, icon_height));
124 canvas->DrawImageInt(image, 128 canvas->DrawImageInt(image,
125 image_offset, 0, icon_width, icon_height, 129 image_offset, 0, icon_width, icon_height,
126 dst_x, dst_y, icon_width, icon_height, 130 dst_x, dst_y, icon_width, icon_height,
127 filter); 131 filter, paint);
128 canvas->Restore(); 132 canvas->Restore();
129 } 133 }
130 134
131 } // namespace 135 } // namespace
132 136
133 // static 137 // static
134 gfx::Font* BaseTab::font_ = NULL; 138 gfx::Font* BaseTab::font_ = NULL;
135 // static 139 // static
136 int BaseTab::font_height_ = 0; 140 int BaseTab::font_height_ = 0;
137 141
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 522
519 if (data().network_state != TabRendererData::NETWORK_STATE_NONE) { 523 if (data().network_state != TabRendererData::NETWORK_STATE_NONE) {
520 ui::ThemeProvider* tp = GetThemeProvider(); 524 ui::ThemeProvider* tp = GetThemeProvider();
521 gfx::ImageSkia frames(*tp->GetImageSkiaNamed( 525 gfx::ImageSkia frames(*tp->GetImageSkiaNamed(
522 (data().network_state == TabRendererData::NETWORK_STATE_WAITING) ? 526 (data().network_state == TabRendererData::NETWORK_STATE_WAITING) ?
523 IDR_THROBBER_WAITING : IDR_THROBBER)); 527 IDR_THROBBER_WAITING : IDR_THROBBER));
524 528
525 int icon_size = frames.height(); 529 int icon_size = frames.height();
526 int image_offset = loading_animation_frame_ * icon_size; 530 int image_offset = loading_animation_frame_ * icon_size;
527 DrawIconCenter(canvas, frames, image_offset, 531 DrawIconCenter(canvas, frames, image_offset,
528 icon_size, icon_size, bounds, false); 532 icon_size, icon_size, bounds, false, SkPaint());
529 } else { 533 } else {
530 canvas->Save(); 534 canvas->Save();
531 canvas->ClipRect(GetLocalBounds()); 535 canvas->ClipRect(GetLocalBounds());
532 if (should_display_crashed_favicon_) { 536 if (should_display_crashed_favicon_) {
533 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 537 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
534 gfx::ImageSkia crashed_favicon(*rb.GetImageSkiaNamed(IDR_SAD_FAVICON)); 538 gfx::ImageSkia crashed_favicon(*rb.GetImageSkiaNamed(IDR_SAD_FAVICON));
535 bounds.set_y(bounds.y() + favicon_hiding_offset_); 539 bounds.set_y(bounds.y() + favicon_hiding_offset_);
536 DrawIconCenter(canvas, crashed_favicon, 0, 540 DrawIconCenter(canvas, crashed_favicon, 0,
537 crashed_favicon.width(), 541 crashed_favicon.width(),
538 crashed_favicon.height(), bounds, true); 542 crashed_favicon.height(), bounds, true, SkPaint());
539 } else { 543 } else {
540 if (!data().favicon.isNull()) { 544 if (!data().favicon.isNull()) {
541 // TODO(pkasting): Use code in tab_icon_view.cc:PaintIcon() (or switch 545 // TODO(pkasting): Use code in tab_icon_view.cc:PaintIcon() (or switch
542 // to using that class to render the favicon). 546 // to using that class to render the favicon).
543 DrawIconCenter(canvas, data().favicon, 0, 547 DrawIconCenter(canvas, data().favicon, 0,
544 data().favicon.width(), 548 data().favicon.width(),
545 data().favicon.height(), 549 data().favicon.height(),
546 bounds, true); 550 bounds, true, SkPaint());
547 } 551 }
548 } 552 }
549 canvas->Restore(); 553 canvas->Restore();
554
555 // If recording, fade the recording icon on top of the favicon.
556 if (data().recording) {
557 if (!recording_animation_.get()) {
558 recording_animation_.reset(new ui::ThrobAnimation(this));
559 recording_animation_->SetTweenType(ui::Tween::EASE_IN_OUT);
560 recording_animation_->SetThrobDuration(kRecordingDurationMs);
561 recording_animation_->StartThrobbing(-1);
562 }
563 SkPaint paint;
564 paint.setAntiAlias(true);
565 U8CPU alpha = recording_animation_->GetCurrentValue() * 0xff;
566 paint.setAlpha(alpha);
567 ui::ThemeProvider* tp = GetThemeProvider();
568 gfx::ImageSkia recording_dot(*tp->GetImageSkiaNamed(IDR_TAB_RECORDING));
569 DrawIconCenter(canvas, recording_dot, 0,
570 recording_dot.width(), recording_dot.height(),
571 bounds, false, paint);
572 } else {
573 recording_animation_.reset();
574 }
550 } 575 }
551 } 576 }
552 577
553 void BaseTab::PaintTitle(gfx::Canvas* canvas, SkColor title_color) { 578 void BaseTab::PaintTitle(gfx::Canvas* canvas, SkColor title_color) {
554 // Paint the Title. 579 // Paint the Title.
555 const gfx::Rect& title_bounds = GetTitleBounds(); 580 const gfx::Rect& title_bounds = GetTitleBounds();
556 string16 title = data().title; 581 string16 title = data().title;
557 582
558 if (title.empty()) { 583 if (title.empty()) {
559 title = data().loading ? 584 title = data().loading ?
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 // static 681 // static
657 void BaseTab::InitResources() { 682 void BaseTab::InitResources() {
658 static bool initialized = false; 683 static bool initialized = false;
659 if (!initialized) { 684 if (!initialized) {
660 initialized = true; 685 initialized = true;
661 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 686 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
662 font_ = new gfx::Font(rb.GetFont(ui::ResourceBundle::BaseFont)); 687 font_ = new gfx::Font(rb.GetFont(ui::ResourceBundle::BaseFont));
663 font_height_ = font_->GetHeight(); 688 font_height_ = font_->GetHeight();
664 } 689 }
665 } 690 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/tabs/base_tab.h ('k') | chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698