| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/gtk/tabs/tab_renderer_gtk.h" | 5 #include "chrome/browser/gtk/tabs/tab_renderer_gtk.h" |
| 6 | 6 |
| 7 #include "app/gfx/canvas_paint.h" | 7 #include "app/gfx/canvas_paint.h" |
| 8 #include "app/gfx/favicon_size.h" | 8 #include "app/gfx/favicon_size.h" |
| 9 #include "app/l10n_util.h" | 9 #include "app/l10n_util.h" |
| 10 #include "app/resource_bundle.h" | 10 #include "app/resource_bundle.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 const int kLeftPadding = 16; | 25 const int kLeftPadding = 16; |
| 26 const int kTopPadding = 6; | 26 const int kTopPadding = 6; |
| 27 const int kRightPadding = 15; | 27 const int kRightPadding = 15; |
| 28 const int kBottomPadding = 5; | 28 const int kBottomPadding = 5; |
| 29 const int kFavIconTitleSpacing = 4; | 29 const int kFavIconTitleSpacing = 4; |
| 30 const int kTitleCloseButtonSpacing = 5; | 30 const int kTitleCloseButtonSpacing = 5; |
| 31 const int kStandardTitleWidth = 175; | 31 const int kStandardTitleWidth = 175; |
| 32 const int kDropShadowOffset = 2; | 32 const int kDropShadowOffset = 2; |
| 33 // Value added to pinned_tab_pref_width_ to get | 33 // Preferred width of pinned tabs. |
| 34 // pinned_tab_renderer_as_tab_width_. See description of | 34 const int kPinnedTabWidth = 56; |
| 35 // pinned_tab_renderer_as_tab_width_ for details. | 35 // When a non-pinned tab is pinned the width of the tab animates. If the width |
| 36 const int kPinnedTabRendererAsNonPinnedWidth = 30; | 36 // of a pinned tab is >= kPinnedTabRendererAsTabWidth then the tab is rendered |
| 37 // as a normal tab. This is done to avoid having the title immediately |
| 38 // disappear when transitioning a tab from normal to pinned. |
| 39 const int kPinnedTabRendererAsTabWidth = kPinnedTabWidth + 30; |
| 37 | 40 |
| 38 // How long the hover state takes. | 41 // How long the hover state takes. |
| 39 const int kHoverDurationMs = 90; | 42 const int kHoverDurationMs = 90; |
| 40 | 43 |
| 41 // How opaque to make the hover state (out of 1). | 44 // How opaque to make the hover state (out of 1). |
| 42 const double kHoverOpacity = 0.33; | 45 const double kHoverOpacity = 0.33; |
| 43 | 46 |
| 44 const SkScalar kTabCapWidth = 15; | 47 const SkScalar kTabCapWidth = 15; |
| 45 const SkScalar kTabTopCurveWidth = 4; | 48 const SkScalar kTabTopCurveWidth = 4; |
| 46 const SkScalar kTabBottomCurveWidth = 3; | 49 const SkScalar kTabBottomCurveWidth = 3; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 bool TabRendererGtk::initialized_ = false; | 100 bool TabRendererGtk::initialized_ = false; |
| 98 TabRendererGtk::TabImage TabRendererGtk::tab_active_ = {0}; | 101 TabRendererGtk::TabImage TabRendererGtk::tab_active_ = {0}; |
| 99 TabRendererGtk::TabImage TabRendererGtk::tab_inactive_ = {0}; | 102 TabRendererGtk::TabImage TabRendererGtk::tab_inactive_ = {0}; |
| 100 TabRendererGtk::TabImage TabRendererGtk::tab_alpha = {0}; | 103 TabRendererGtk::TabImage TabRendererGtk::tab_alpha = {0}; |
| 101 gfx::Font* TabRendererGtk::title_font_ = NULL; | 104 gfx::Font* TabRendererGtk::title_font_ = NULL; |
| 102 int TabRendererGtk::title_font_height_ = 0; | 105 int TabRendererGtk::title_font_height_ = 0; |
| 103 int TabRendererGtk::close_button_width_ = 0; | 106 int TabRendererGtk::close_button_width_ = 0; |
| 104 int TabRendererGtk::close_button_height_ = 0; | 107 int TabRendererGtk::close_button_height_ = 0; |
| 105 SkColor TabRendererGtk::selected_title_color_ = SK_ColorBLACK; | 108 SkColor TabRendererGtk::selected_title_color_ = SK_ColorBLACK; |
| 106 SkColor TabRendererGtk::unselected_title_color_ = SkColorSetRGB(64, 64, 64); | 109 SkColor TabRendererGtk::unselected_title_color_ = SkColorSetRGB(64, 64, 64); |
| 107 int TabRendererGtk::pinned_tab_renderer_as_tab_width_ = 0; | |
| 108 int TabRendererGtk::pinned_tab_pref_width_ = 0; | |
| 109 | 110 |
| 110 //////////////////////////////////////////////////////////////////////////////// | 111 //////////////////////////////////////////////////////////////////////////////// |
| 111 // TabRendererGtk::LoadingAnimation, public: | 112 // TabRendererGtk::LoadingAnimation, public: |
| 112 // | 113 // |
| 113 TabRendererGtk::LoadingAnimation::LoadingAnimation( | 114 TabRendererGtk::LoadingAnimation::LoadingAnimation( |
| 114 ThemeProvider* theme_provider) | 115 ThemeProvider* theme_provider) |
| 115 : data_(new Data(theme_provider)), | 116 : data_(new Data(theme_provider)), |
| 116 theme_provider_(theme_provider), | 117 theme_provider_(theme_provider), |
| 117 animation_state_(ANIMATION_NONE), | 118 animation_state_(ANIMATION_NONE), |
| 118 animation_frame_(0) { | 119 animation_frame_(0) { |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 | 313 |
| 313 // static | 314 // static |
| 314 gfx::Size TabRendererGtk::GetStandardSize() { | 315 gfx::Size TabRendererGtk::GetStandardSize() { |
| 315 gfx::Size standard_size = GetMinimumUnselectedSize(); | 316 gfx::Size standard_size = GetMinimumUnselectedSize(); |
| 316 standard_size.Enlarge(kFavIconTitleSpacing + kStandardTitleWidth, 0); | 317 standard_size.Enlarge(kFavIconTitleSpacing + kStandardTitleWidth, 0); |
| 317 return standard_size; | 318 return standard_size; |
| 318 } | 319 } |
| 319 | 320 |
| 320 // static | 321 // static |
| 321 int TabRendererGtk::GetPinnedWidth() { | 322 int TabRendererGtk::GetPinnedWidth() { |
| 322 return pinned_tab_pref_width_; | 323 return kPinnedTabWidth; |
| 323 } | 324 } |
| 324 | 325 |
| 325 // static | 326 // static |
| 326 int TabRendererGtk::GetContentHeight() { | 327 int TabRendererGtk::GetContentHeight() { |
| 327 // The height of the content of the Tab is the largest of the favicon, | 328 // The height of the content of the Tab is the largest of the favicon, |
| 328 // the title text and the close button graphic. | 329 // the title text and the close button graphic. |
| 329 int content_height = std::max(kFavIconSize, title_font_height_); | 330 int content_height = std::max(kFavIconSize, title_font_height_); |
| 330 return std::max(content_height, close_button_height_); | 331 return std::max(content_height, close_button_height_); |
| 331 } | 332 } |
| 332 | 333 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 344 tab_active_.r_width = tab_active_.image_r->width(); | 345 tab_active_.r_width = tab_active_.image_r->width(); |
| 345 | 346 |
| 346 tab_inactive_.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT); | 347 tab_inactive_.image_l = rb.GetBitmapNamed(IDR_TAB_INACTIVE_LEFT); |
| 347 tab_inactive_.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER); | 348 tab_inactive_.image_c = rb.GetBitmapNamed(IDR_TAB_INACTIVE_CENTER); |
| 348 tab_inactive_.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT); | 349 tab_inactive_.image_r = rb.GetBitmapNamed(IDR_TAB_INACTIVE_RIGHT); |
| 349 tab_inactive_.l_width = tab_inactive_.image_l->width(); | 350 tab_inactive_.l_width = tab_inactive_.image_l->width(); |
| 350 tab_inactive_.r_width = tab_inactive_.image_r->width(); | 351 tab_inactive_.r_width = tab_inactive_.image_r->width(); |
| 351 | 352 |
| 352 close_button_width_ = rb.GetBitmapNamed(IDR_TAB_CLOSE)->width(); | 353 close_button_width_ = rb.GetBitmapNamed(IDR_TAB_CLOSE)->width(); |
| 353 close_button_height_ = rb.GetBitmapNamed(IDR_TAB_CLOSE)->height(); | 354 close_button_height_ = rb.GetBitmapNamed(IDR_TAB_CLOSE)->height(); |
| 354 | |
| 355 pinned_tab_pref_width_ = kLeftPadding + kFavIconSize + kRightPadding; | |
| 356 pinned_tab_renderer_as_tab_width_ = pinned_tab_pref_width_ + | |
| 357 kPinnedTabRendererAsNonPinnedWidth; | |
| 358 } | 355 } |
| 359 | 356 |
| 360 // static | 357 // static |
| 361 void TabRendererGtk::SetSelectedTitleColor(SkColor color) { | 358 void TabRendererGtk::SetSelectedTitleColor(SkColor color) { |
| 362 selected_title_color_ = color; | 359 selected_title_color_ = color; |
| 363 } | 360 } |
| 364 | 361 |
| 365 // static | 362 // static |
| 366 void TabRendererGtk::SetUnselectedTitleColor(SkColor color) { | 363 void TabRendererGtk::SetUnselectedTitleColor(SkColor color) { |
| 367 unselected_title_color_ = color; | 364 unselected_title_color_ = color; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 return; | 432 return; |
| 436 | 433 |
| 437 // See if the model changes whether the icons should be painted. | 434 // See if the model changes whether the icons should be painted. |
| 438 const bool show_icon = ShouldShowIcon(); | 435 const bool show_icon = ShouldShowIcon(); |
| 439 const bool show_close_button = ShouldShowCloseBox(); | 436 const bool show_close_button = ShouldShowCloseBox(); |
| 440 if (show_icon != showing_icon_ || | 437 if (show_icon != showing_icon_ || |
| 441 show_close_button != showing_close_button_) | 438 show_close_button != showing_close_button_) |
| 442 Layout(); | 439 Layout(); |
| 443 | 440 |
| 444 PaintTabBackground(canvas); | 441 PaintTabBackground(canvas); |
| 445 if (!is_pinned() || width() > pinned_tab_renderer_as_tab_width_) | 442 if (!is_pinned() || width() > kPinnedTabRendererAsTabWidth) |
| 446 PaintTitle(canvas); | 443 PaintTitle(canvas); |
| 447 | 444 |
| 448 if (show_icon) | 445 if (show_icon) |
| 449 PaintIcon(canvas); | 446 PaintIcon(canvas); |
| 450 } | 447 } |
| 451 | 448 |
| 452 SkBitmap TabRendererGtk::PaintBitmap() { | 449 SkBitmap TabRendererGtk::PaintBitmap() { |
| 453 gfx::Canvas canvas(width(), height(), false); | 450 gfx::Canvas canvas(width(), height(), false); |
| 454 Paint(&canvas); | 451 Paint(&canvas); |
| 455 return canvas.ExtractBitmap(); | 452 return canvas.ExtractBitmap(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 471 | 468 |
| 472 // Figure out who is tallest. | 469 // Figure out who is tallest. |
| 473 int content_height = GetContentHeight(); | 470 int content_height = GetContentHeight(); |
| 474 | 471 |
| 475 // Size the Favicon. | 472 // Size the Favicon. |
| 476 showing_icon_ = ShouldShowIcon(); | 473 showing_icon_ = ShouldShowIcon(); |
| 477 if (showing_icon_) { | 474 if (showing_icon_) { |
| 478 int favicon_top = kTopPadding + (content_height - kFavIconSize) / 2; | 475 int favicon_top = kTopPadding + (content_height - kFavIconSize) / 2; |
| 479 favicon_bounds_.SetRect(local_bounds.x(), favicon_top, | 476 favicon_bounds_.SetRect(local_bounds.x(), favicon_top, |
| 480 kFavIconSize, kFavIconSize); | 477 kFavIconSize, kFavIconSize); |
| 478 if (is_pinned() && bounds_.width() < kPinnedTabRendererAsTabWidth) |
| 479 favicon_bounds_.set_x((bounds_.width() - kFavIconSize) / 2); |
| 481 } else { | 480 } else { |
| 482 favicon_bounds_.SetRect(local_bounds.x(), local_bounds.y(), 0, 0); | 481 favicon_bounds_.SetRect(local_bounds.x(), local_bounds.y(), 0, 0); |
| 483 } | 482 } |
| 484 | 483 |
| 485 // Size the Close button. | 484 // Size the Close button. |
| 486 showing_close_button_ = ShouldShowCloseBox(); | 485 showing_close_button_ = ShouldShowCloseBox(); |
| 487 if (showing_close_button_) { | 486 if (showing_close_button_) { |
| 488 int close_button_top = | 487 int close_button_top = |
| 489 kTopPadding + kCloseButtonVertFuzz + | 488 kTopPadding + kCloseButtonVertFuzz + |
| 490 (content_height - close_button_height_) / 2; | 489 (content_height - close_button_height_) / 2; |
| 491 close_button_bounds_.SetRect(local_bounds.width() + kCloseButtonHorzFuzz, | 490 close_button_bounds_.SetRect(local_bounds.width() + kCloseButtonHorzFuzz, |
| 492 close_button_top, close_button_width_, | 491 close_button_top, close_button_width_, |
| 493 close_button_height_); | 492 close_button_height_); |
| 494 } else { | 493 } else { |
| 495 close_button_bounds_.SetRect(0, 0, 0, 0); | 494 close_button_bounds_.SetRect(0, 0, 0, 0); |
| 496 } | 495 } |
| 497 | 496 |
| 498 if (!is_pinned() || width() >= pinned_tab_renderer_as_tab_width_) { | 497 if (!is_pinned() || width() >= kPinnedTabRendererAsTabWidth) { |
| 499 // Size the Title text to fill the remaining space. | 498 // Size the Title text to fill the remaining space. |
| 500 int title_left = favicon_bounds_.right() + kFavIconTitleSpacing; | 499 int title_left = favicon_bounds_.right() + kFavIconTitleSpacing; |
| 501 int title_top = kTopPadding + (content_height - title_font_height_) / 2; | 500 int title_top = kTopPadding + (content_height - title_font_height_) / 2; |
| 502 | 501 |
| 503 // If the user has big fonts, the title will appear rendered too far down | 502 // If the user has big fonts, the title will appear rendered too far down |
| 504 // on the y-axis if we use the regular top padding, so we need to adjust it | 503 // on the y-axis if we use the regular top padding, so we need to adjust it |
| 505 // so that the text appears centered. | 504 // so that the text appears centered. |
| 506 gfx::Size minimum_size = GetMinimumUnselectedSize(); | 505 gfx::Size minimum_size = GetMinimumUnselectedSize(); |
| 507 int text_height = title_top + title_font_height_ + kBottomPadding; | 506 int text_height = title_top + title_font_height_ + kBottomPadding; |
| 508 if (text_height > minimum_size.height()) | 507 if (text_height > minimum_size.height()) |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 820 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 822 // Force the font size to 10pt. | 821 // Force the font size to 10pt. |
| 823 gfx::Font base_font = rb.GetFont(ResourceBundle::BaseFont); | 822 gfx::Font base_font = rb.GetFont(ResourceBundle::BaseFont); |
| 824 title_font_ = new gfx::Font(gfx::Font::CreateFont(base_font.FontName(), 10)); | 823 title_font_ = new gfx::Font(gfx::Font::CreateFont(base_font.FontName(), 10)); |
| 825 title_font_height_ = title_font_->height(); | 824 title_font_height_ = title_font_->height(); |
| 826 | 825 |
| 827 crashed_fav_icon = rb.GetBitmapNamed(IDR_SAD_FAVICON); | 826 crashed_fav_icon = rb.GetBitmapNamed(IDR_SAD_FAVICON); |
| 828 | 827 |
| 829 initialized_ = true; | 828 initialized_ = true; |
| 830 } | 829 } |
| OLD | NEW |