Chromium Code Reviews| Index: chrome/browser/ui/panels/panel_browser_frame_view.cc |
| diff --git a/chrome/browser/ui/panels/panel_browser_frame_view.cc b/chrome/browser/ui/panels/panel_browser_frame_view.cc |
| index 647435f6014df1edc3ea2641f9e15dfddb0cd60d..f39237a15da161ae870be2fb94e8a234a647be13 100644 |
| --- a/chrome/browser/ui/panels/panel_browser_frame_view.cc |
| +++ b/chrome/browser/ui/panels/panel_browser_frame_view.cc |
| @@ -8,6 +8,7 @@ |
| #include "base/utf_string_conversions.h" |
| #include "chrome/browser/themes/theme_service.h" |
| +#include "chrome/browser/themes/theme_service_factory.h" |
| #include "chrome/browser/ui/panels/panel.h" |
| #include "chrome/browser/ui/panels/panel_browser_view.h" |
| #include "chrome/browser/ui/panels/panel_manager.h" |
| @@ -27,6 +28,7 @@ |
| #include "ui/gfx/canvas_skia.h" |
| #include "ui/gfx/path.h" |
| #include "ui/gfx/screen.h" |
| +#include "ui/gfx/skia_util.h" |
| #include "ui/views/widget/widget_delegate.h" |
| #include "views/controls/button/image_button.h" |
| #include "views/controls/button/menu_button.h" |
| @@ -41,24 +43,54 @@ namespace { |
| // The height in pixels of the titlebar. |
| const int kTitlebarHeight = 24; |
| -// The thickness in pixels of the frame border. |
| -const int kFrameBorderThickness = 1; |
| +// The thickness in pixels of the border. |
| +const int kBorderThickness = 1; |
| -// The spacing in pixels between the icon and the border/text. |
| -const int kIconSpacing = 4; |
| +// No client edge is present. |
| +const int kPanelClientEdgeThickness = 0; |
| + |
| +// The spacing in pixels between the icon and the left border. |
| +const int kIconAndBorderSpacing = 4; |
| // The height and width in pixels of the icon. |
| const int kIconSize = 16; |
| -// The spacing in pixels between buttons or the button and the adjacent control. |
| -const int kButtonSpacing = 6; |
| +// The spacing in pixels between the title and the icon on the left, or the |
| +// button on the right. |
| +const int kTitleSpacing = 8; |
| + |
| +// The spacing in pixels between the close button and the right border. |
| +const int kCloseButtonAndBorderSpacing = 8; |
| + |
| +// The spacing in pixels between the close button and the settings button. |
| +const int kSettingsButtonAndCloseButtonSpacing = 8; |
| // This value is experimental and subjective. |
| const int kUpdateSettingsVisibilityAnimationMs = 120; |
| -// Colors used in painting the titlebar for drawing attention. |
| -const SkColor kBackgroundColorForAttention = 0xfffa983a; |
| -const SkColor kTitleTextColorForAttention = SK_ColorWHITE; |
| +// Colors used to draw active titlebar under default theme. |
| +const SkColor kActiveTitleTextDefaultColor = SK_ColorBLACK; |
| +const SkColor kActiveBackgroundDefaultColorStart = 0xfff0f8fa; |
| +const SkColor kActiveBackgroundDefaultColorEnd = 0xffd1e2ed; |
| + |
| +// Colors used to draw inactive titlebar under default theme. |
| +const SkColor kInactiveTitleTextDefaultColor = 0xc0000000; |
| +const SkColor kInactiveBackgroundDefaultColorStart = 0xffffffff; |
| +const SkColor kInactiveBackgroundDefaultColorEnd = 0xffe7edf1; |
| + |
| +// Alpha value used in drawing inactive titlebar under default theme. |
| +const U8CPU kInactiveAlphaBlending = 0xc0; |
| + |
| +// Colors used to draw titlebar for drawing attention regardless of the theme. |
| +const SkColor kAttentionTitleTextColor = SK_ColorWHITE; |
| +const SkColor kAttentionBackgroundColorStart = 0xffffab57; |
| +const SkColor kAttentionBackgroundColorEnd = 0xfff59338; |
| + |
| +// Color used to draw the border. |
| +const SkColor kBorderColor = 0xc0000000; |
| + |
| +// Color used to draw the divider line between the titlebar and the client area. |
| +const SkColor kDividerColor = 0xffb5b5b5; |
| struct ButtonResources { |
| SkBitmap* normal_image; |
| @@ -104,9 +136,21 @@ struct EdgeResources { |
| ButtonResources settings_button_resources; |
| ButtonResources close_button_resources; |
| EdgeResources frame_edges; |
| -EdgeResources client_edges; |
| gfx::Font* title_font = NULL; |
| -SkBitmap* background_bitmap_for_attention = NULL; |
| +SkPaint active_background_default_paint; |
|
Dmitry Titov
2011/11/29 04:04:03
I wonder if this is a good thing to have objects w
jianli
2011/11/29 19:30:15
Done.
|
| +SkPaint inactive_background_default_paint; |
| +SkPaint attention_background_paint; |
| + |
| +void InitializeGradientPaint(SkPaint* paint, |
|
Dmitry Titov
2011/11/29 04:04:03
why not return the SkPaint*, especially if statics
jianli
2011/11/29 19:30:15
I still need this to do the delay initialization w
|
| + SkColor start_color, |
| + SkColor end_color) { |
| + SkShader* shader = gfx::CreateGradientShader( |
| + 0, kTitlebarHeight, start_color, end_color); |
| + paint->setStyle(SkPaint::kFill_Style); |
| + paint->setAntiAlias(true); |
| + paint->setShader(shader); |
| + shader->unref(); |
| +} |
| void LoadImageResources() { |
| settings_button_resources.SetResources( |
| @@ -120,12 +164,6 @@ void LoadImageResources() { |
| IDR_WINDOW_TOP_RIGHT_CORNER, IDR_WINDOW_RIGHT_SIDE, |
| IDR_PANEL_BOTTOM_RIGHT_CORNER, IDR_WINDOW_BOTTOM_CENTER, |
| IDR_PANEL_BOTTOM_LEFT_CORNER, IDR_WINDOW_LEFT_SIDE); |
| - |
| - client_edges.SetResources( |
| - IDR_APP_TOP_LEFT, IDR_APP_TOP_CENTER, |
| - IDR_APP_TOP_RIGHT, IDR_CONTENT_RIGHT_SIDE, |
| - IDR_CONTENT_BOTTOM_RIGHT_CORNER, IDR_CONTENT_BOTTOM_CENTER, |
| - IDR_CONTENT_BOTTOM_LEFT_CORNER, IDR_CONTENT_LEFT_SIDE); |
| } |
| void EnsureResourcesInitialized() { |
| @@ -135,14 +173,17 @@ void EnsureResourcesInitialized() { |
| resources_initialized = true; |
| ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| - title_font = new gfx::Font(rb.GetFont(ResourceBundle::BaseFont)); |
| - |
| - // Creates a bitmap of the specified color. |
| - background_bitmap_for_attention = new SkBitmap(); |
| - background_bitmap_for_attention->setConfig( |
| - SkBitmap::kARGB_8888_Config, 16, 16); |
| - background_bitmap_for_attention->allocPixels(); |
| - background_bitmap_for_attention->eraseColor(kBackgroundColorForAttention); |
| + title_font = new gfx::Font(rb.GetFont(ResourceBundle::BoldFont)); |
| + |
| + InitializeGradientPaint(&active_background_default_paint, |
| + kActiveBackgroundDefaultColorStart, |
| + kActiveBackgroundDefaultColorEnd); |
| + InitializeGradientPaint(&inactive_background_default_paint, |
| + kInactiveBackgroundDefaultColorStart, |
| + kInactiveBackgroundDefaultColorEnd); |
| + InitializeGradientPaint(&attention_background_paint, |
| + kAttentionBackgroundColorStart, |
| + kAttentionBackgroundColorEnd); |
| LoadImageResources(); |
| } |
| @@ -340,33 +381,19 @@ int PanelBrowserFrameView::NonClientHitTest(const gfx::Point& point) { |
| void PanelBrowserFrameView::GetWindowMask(const gfx::Size& size, |
| gfx::Path* window_mask) { |
| - // For panel, the window shape is rectangle with top-left and top-right |
| - // corners rounded. |
| - if (size.height() <= Panel::kMinimizedPanelHeight) { |
| - // For minimize panel, we need to produce the window mask applicable to |
| - // the 3-pixel lines. |
| - window_mask->moveTo(0, SkIntToScalar(size.height())); |
| - window_mask->lineTo(0, 1); |
| - window_mask->lineTo(1, 0); |
| - window_mask->lineTo(SkIntToScalar(size.width()) - 1, 0); |
| - window_mask->lineTo(SkIntToScalar(size.width()), 1); |
| - window_mask->lineTo(SkIntToScalar(size.width()), |
| - SkIntToScalar(size.height())); |
| - } else { |
| - window_mask->moveTo(0, 3); |
| - window_mask->lineTo(1, 2); |
| - window_mask->lineTo(1, 1); |
| - window_mask->lineTo(2, 1); |
| - window_mask->lineTo(3, 0); |
| - window_mask->lineTo(SkIntToScalar(size.width() - 3), 0); |
| - window_mask->lineTo(SkIntToScalar(size.width() - 2), 1); |
| - window_mask->lineTo(SkIntToScalar(size.width() - 1), 1); |
| - window_mask->lineTo(SkIntToScalar(size.width() - 1), 2); |
| - window_mask->lineTo(SkIntToScalar(size.width()), 3); |
| - window_mask->lineTo(SkIntToScalar(size.width()), |
| - SkIntToScalar(size.height())); |
| - window_mask->lineTo(0, SkIntToScalar(size.height())); |
| - } |
| + window_mask->moveTo(0, 3); |
| + window_mask->lineTo(1, 2); |
| + window_mask->lineTo(1, 1); |
| + window_mask->lineTo(2, 1); |
| + window_mask->lineTo(3, 0); |
| + window_mask->lineTo(SkIntToScalar(size.width() - 3), 0); |
| + window_mask->lineTo(SkIntToScalar(size.width() - 2), 1); |
| + window_mask->lineTo(SkIntToScalar(size.width() - 1), 1); |
| + window_mask->lineTo(SkIntToScalar(size.width() - 1), 2); |
| + window_mask->lineTo(SkIntToScalar(size.width() - 1), 3); |
| + window_mask->lineTo(SkIntToScalar(size.width()), |
| + SkIntToScalar(size.height())); |
| + window_mask->lineTo(0, SkIntToScalar(size.height())); |
| window_mask->close(); |
| } |
| @@ -390,7 +417,6 @@ void PanelBrowserFrameView::OnPaint(gfx::Canvas* canvas) { |
| UpdateControlStyles(paint_state); |
| PaintFrameBorder(canvas); |
| - PaintClientEdge(canvas); |
| } |
| void PanelBrowserFrameView::OnThemeChanged() { |
| @@ -398,7 +424,7 @@ void PanelBrowserFrameView::OnThemeChanged() { |
| } |
| gfx::Size PanelBrowserFrameView::GetMinimumSize() { |
| - // This makes the panel be able to shrink to very small, like 3-pixel lines. |
| + // This makes the panel be able to shrink to very small, like 4-pixel lines. |
| // Since the panel cannot be resized by the user, we do not need to enforce |
| // the minimum size. |
| return gfx::Size(); |
| @@ -413,7 +439,7 @@ void PanelBrowserFrameView::Layout() { |
| // Layout the close button. |
| gfx::Size close_button_size = close_button_->GetPreferredSize(); |
| close_button_->SetBounds( |
| - width() - kFrameBorderThickness - kButtonSpacing - |
| + width() - kBorderThickness - kCloseButtonAndBorderSpacing - |
| close_button_size.width(), |
| (NonClientTopBorderHeight() - close_button_size.height()) / 2, |
| close_button_size.width(), |
| @@ -422,7 +448,8 @@ void PanelBrowserFrameView::Layout() { |
| // Layout the settings button. |
| gfx::Size settings_button_size = settings_button_->GetPreferredSize(); |
| settings_button_->SetBounds( |
| - close_button_->x() - kButtonSpacing - settings_button_size.width(), |
| + close_button_->x() - kSettingsButtonAndCloseButtonSpacing - |
| + settings_button_size.width(), |
| (NonClientTopBorderHeight() - settings_button_size.height()) / 2, |
| settings_button_size.width(), |
| settings_button_size.height()); |
| @@ -440,18 +467,18 @@ void PanelBrowserFrameView::Layout() { |
| // Layout the icon. |
| int icon_y = (NonClientTopBorderHeight() - kIconSize) / 2; |
| title_icon_->SetBounds( |
| - kFrameBorderThickness + kIconSpacing, |
| + kBorderThickness + kIconAndBorderSpacing, |
| icon_y, |
| kIconSize, |
| kIconSize); |
| // Layout the title. |
| - int title_x = title_icon_->bounds().right() + kIconSpacing; |
| + int title_x = title_icon_->bounds().right() + kTitleSpacing; |
| int title_height = BrowserFrame::GetTitleFont().GetHeight(); |
| title_label_->SetBounds( |
| title_x, |
| icon_y + ((kIconSize - title_height - 1) / 2), |
| - std::max(0, settings_button_->x() - kButtonSpacing - title_x), |
| + std::max(0, settings_button_->x() - kTitleSpacing - title_x), |
| title_height); |
| // Calculate the client area bounds. |
| @@ -553,11 +580,11 @@ void PanelBrowserFrameView::AnimationCanceled(const ui::Animation* animation) { |
| } |
| int PanelBrowserFrameView::NonClientBorderThickness() const { |
| - return kFrameBorderThickness + kClientEdgeThickness; |
| + return kBorderThickness + kPanelClientEdgeThickness; |
| } |
| int PanelBrowserFrameView::NonClientTopBorderHeight() const { |
| - return kFrameBorderThickness + kTitlebarHeight + kClientEdgeThickness; |
| + return kBorderThickness + kTitlebarHeight + kPanelClientEdgeThickness; |
| } |
| gfx::Size PanelBrowserFrameView::NonClientAreaSize() const { |
| @@ -565,15 +592,37 @@ gfx::Size PanelBrowserFrameView::NonClientAreaSize() const { |
| NonClientTopBorderHeight() + NonClientBorderThickness()); |
| } |
| +bool PanelBrowserFrameView::UsingDefaultTheme() const { |
| + ThemeService* theme_service = ThemeServiceFactory::GetForProfile( |
| + panel_browser_view_->panel()->browser()->profile()); |
| + return theme_service->UsingDefaultTheme(); |
| +} |
| + |
| +SkColor PanelBrowserFrameView::GetDefaultTitleColor( |
| + PaintState paint_state) const { |
| + switch (paint_state) { |
| + case PAINT_AS_INACTIVE: |
| + return kActiveTitleTextDefaultColor; |
| + case PAINT_AS_ACTIVE: |
| + return kInactiveTitleTextDefaultColor; |
| + case PAINT_FOR_ATTENTION: |
| + return kAttentionTitleTextColor; |
| + default: |
| + NOTREACHED(); |
| + return SkColor(); |
| + } |
| +} |
| + |
| SkColor PanelBrowserFrameView::GetTitleColor(PaintState paint_state) const { |
| switch (paint_state) { |
| case PAINT_AS_INACTIVE: |
| - return GetThemeProvider()->GetColor( |
| - ThemeService::COLOR_BACKGROUND_TAB_TEXT); |
| + return SkColorSetA( |
| + GetThemeProvider()->GetColor(ThemeService::COLOR_BACKGROUND_TAB_TEXT), |
| + kInactiveAlphaBlending); |
| case PAINT_AS_ACTIVE: |
| return GetThemeProvider()->GetColor(ThemeService::COLOR_TAB_TEXT); |
| case PAINT_FOR_ATTENTION: |
| - return kTitleTextColorForAttention; |
| + return kAttentionTitleTextColor; |
| default: |
| NOTREACHED(); |
| return SkColor(); |
| @@ -584,6 +633,21 @@ gfx::Font* PanelBrowserFrameView::GetTitleFont() const { |
| return title_font; |
| } |
| +SkPaint* PanelBrowserFrameView::GetDefaultFrameTheme( |
| + PaintState paint_state) const { |
| + switch (paint_state) { |
| + case PAINT_AS_INACTIVE: |
| + return &inactive_background_default_paint; |
| + case PAINT_AS_ACTIVE: |
| + return &active_background_default_paint; |
| + case PAINT_FOR_ATTENTION: |
| + return &attention_background_paint; |
| + default: |
| + NOTREACHED(); |
| + return NULL; |
| + } |
| +} |
| + |
| SkBitmap* PanelBrowserFrameView::GetFrameTheme(PaintState paint_state) const { |
| switch (paint_state) { |
| case PAINT_AS_INACTIVE: |
| @@ -591,7 +655,8 @@ SkBitmap* PanelBrowserFrameView::GetFrameTheme(PaintState paint_state) const { |
| case PAINT_AS_ACTIVE: |
| return GetThemeProvider()->GetBitmapNamed(IDR_THEME_TOOLBAR); |
| case PAINT_FOR_ATTENTION: |
| - return background_bitmap_for_attention; |
| + // Background color for drawing attention is same regardless of the |
| + // theme. GetDefaultFrameTheme should be used. |
| default: |
| NOTREACHED(); |
| return NULL; |
| @@ -615,14 +680,14 @@ void PanelBrowserFrameView::UpdateControlStyles(PaintState paint_state) { |
| } |
| void PanelBrowserFrameView::PaintFrameBorder(gfx::Canvas* canvas) { |
| - SkBitmap* theme_frame = GetFrameTheme(paint_state_); |
| - |
| - // Draw the theme frame. |
| - canvas->TileImageInt(*theme_frame, 0, 0, width(), height()); |
| - |
| - // No need to paint other stuff if panel is minimized. |
| - if (height() <= Panel::kMinimizedPanelHeight) |
| - return; |
| + // Paint the background. |
| + if (paint_state_ == PAINT_FOR_ATTENTION || UsingDefaultTheme()) { |
| + SkPaint* paint = GetDefaultFrameTheme(paint_state_); |
| + canvas->DrawRectInt(0, 0, width(), kTitlebarHeight, *paint); |
| + } else { |
| + SkBitmap* bitmap = GetFrameTheme(paint_state_); |
| + canvas->TileImageInt(*bitmap, 0, 0, width(), kTitlebarHeight); |
| + } |
| // Draw the top border. |
| canvas->DrawBitmapInt(*(frame_edges.top_left), 0, 0); |
| @@ -661,52 +726,12 @@ void PanelBrowserFrameView::PaintFrameBorder(gfx::Canvas* canvas) { |
| frame_edges.left->width(), |
| height() - frame_edges.top_left->height() - |
| frame_edges.bottom_left->height()); |
| -} |
| - |
| -void PanelBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) { |
| - int client_area_top = client_view_bounds_.y(); |
| - // No need to paint other stuff if panel is minimized. |
| - if (height() <= Panel::kMinimizedPanelHeight) |
| - return; |
| - |
| - // Draw the top edge. |
| - int top_edge_y = client_area_top - client_edges.top->height(); |
| - canvas->DrawBitmapInt( |
| - *(client_edges.top_left), |
| - client_view_bounds_.x() - client_edges.top_left->width(), |
| - top_edge_y); |
| - canvas->TileImageInt( |
| - *(client_edges.top), client_view_bounds_.x(), top_edge_y, |
| - client_view_bounds_.width(), client_edges.top->height()); |
| - canvas->DrawBitmapInt( |
| - *(client_edges.top_right), client_view_bounds_.right(), top_edge_y); |
| - |
| - // Draw the right edge. |
| - int client_area_bottom = |
| - std::max(client_area_top, client_view_bounds_.bottom()); |
| - int client_area_height = client_area_bottom - client_area_top; |
| - canvas->TileImageInt( |
| - *(client_edges.right), client_view_bounds_.right(), client_area_top, |
| - client_edges.right->width(), client_area_height); |
| - |
| - // Draw the bottom edge. |
| - canvas->DrawBitmapInt( |
| - *(client_edges.bottom_right), client_view_bounds_.right(), |
| - client_area_bottom); |
| - canvas->TileImageInt( |
| - *(client_edges.bottom), client_view_bounds_.x(), client_area_bottom, |
| - client_view_bounds_.width(), client_edges.bottom_right->height()); |
| - canvas->DrawBitmapInt( |
| - *(client_edges.bottom_left), |
| - client_view_bounds_.x() - client_edges.bottom_left->width(), |
| - client_area_bottom); |
| - |
| - // Draw the left edge. |
| - canvas->TileImageInt( |
| - *(client_edges.left), |
| - client_view_bounds_.x() - client_edges.left->width(), |
| - client_area_top, client_edges.left->width(), client_area_height); |
| + // Draw the divider between the titlebar and the client area. |
| + if (height() > kTitlebarHeight) { |
| + canvas->DrawRectInt(kDividerColor, kBorderThickness, kTitlebarHeight, |
| + width() - 1 - 2 * kBorderThickness, kBorderThickness); |
| + } |
| } |
| string16 PanelBrowserFrameView::GetTitleText() const { |