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

Unified Diff: chrome/browser/ui/views/frame/opaque_browser_frame_view.cc

Issue 1401633003: Implement Material Design for the tabstrip. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Resync Created 5 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/views/frame/glass_browser_frame_view.cc ('k') | chrome/browser/ui/views/tabs/tab.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
index 597fd14e3576f93d44aff83b821a9e383dab7abc..1ced4ca8fe862b9a3c6ea44ea947746411c445f9 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -39,6 +39,7 @@
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/path.h"
+#include "ui/gfx/scoped_canvas.h"
#include "ui/resources/grit/ui_resources.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/image_view.h"
@@ -649,49 +650,76 @@ void OpaqueBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) {
GetTopInset(false) + Tab::GetYInsetForActiveTabBackground();
const int w = toolbar_bounds.width();
- // Background. We need to create a separate layer so we can mask off the
- // corners before compositing onto the frame.
- canvas->sk_canvas()->saveLayer(
- gfx::RectToSkRect(gfx::Rect(x - kContentEdgeShadowThickness, y,
- w + kContentEdgeShadowThickness * 2, h)),
- nullptr);
-
- // The top stroke is drawn using the IDR_CONTENT_TOP_XXX images, which
- // overlay the toolbar. The top 2 px of these images is the actual top
- // stroke + shadow, and is partly transparent, so the toolbar background
- // shouldn't be drawn over it.
- const int split_point = std::min(kContentEdgeShadowThickness, h);
- if (h > split_point) {
- const int split_y = y + split_point;
- canvas->TileImageInt(*bg, x + GetThemeBackgroundXInset(), split_y - bg_y,
- x, split_y, w, h - split_point);
+ if (md) {
+ // Background. The top stroke is drawn above the toolbar bounds, so
+ // unlike in the non-Material Design code below, we don't need to exclude
+ // any region from having the background image drawn over it.
+ if (tp->HasCustomImage(IDR_THEME_TOOLBAR)) {
+ canvas->TileImageInt(*bg, x + GetThemeBackgroundXInset(), y - bg_y, x,
+ y, w, h);
+ } else {
+ canvas->FillRect(toolbar_bounds,
+ tp->GetColor(ThemeProperties::COLOR_TOOLBAR));
+ }
+
+ // Material Design has no corners to mask out.
+
+ // Top stroke. For Material Design, the toolbar has no side strokes.
+ gfx::Rect separator_rect(x, y, w, 0);
+ gfx::ScopedCanvas scoped_canvas(canvas);
+ gfx::Rect tabstrip_bounds(
+ GetBoundsForTabStrip(browser_view()->tabstrip()));
+ tabstrip_bounds.set_x(GetMirroredXForRect(tabstrip_bounds));
+ canvas->sk_canvas()->clipRect(gfx::RectToSkRect(tabstrip_bounds),
+ SkRegion::kDifference_Op);
+ separator_rect.set_y(tabstrip_bounds.bottom());
+ BrowserView::Paint1pxHorizontalLine(
+ canvas, SkColorSetA(SK_ColorBLACK, 0x40), separator_rect, true);
+ } else {
+ // Background. We need to create a separate layer so we can mask off the
+ // corners before compositing onto the frame.
+ canvas->sk_canvas()->saveLayer(
+ gfx::RectToSkRect(gfx::Rect(x - kContentEdgeShadowThickness, y,
+ w + kContentEdgeShadowThickness * 2, h)),
+ nullptr);
+
+ // The top stroke is drawn using the IDR_CONTENT_TOP_XXX images, which
+ // overlay the toolbar. The top 2 px of these images is the actual top
+ // stroke + shadow, and is partly transparent, so the toolbar background
+ // shouldn't be drawn over it.
+ const int split_point = std::min(kContentEdgeShadowThickness, h);
+ if (h > split_point) {
+ const int split_y = y + split_point;
+ canvas->TileImageInt(*bg, x + GetThemeBackgroundXInset(),
+ split_y - bg_y, x, split_y, w, h - split_point);
+ }
+
+ // Mask out the corners.
+ gfx::ImageSkia* left = tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER);
+ const int img_w = left->width();
+ x -= kContentEdgeShadowThickness;
+ SkPaint paint;
+ paint.setXfermodeMode(SkXfermode::kDstIn_Mode);
+ canvas->DrawImageInt(
+ *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK), 0, 0, img_w,
+ h, x, y, img_w, h, false, paint);
+ const int right_x =
+ toolbar_bounds.right() + kContentEdgeShadowThickness - img_w;
+ canvas->DrawImageInt(
+ *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK), 0, 0,
+ img_w, h, right_x, y, img_w, h, false, paint);
+ canvas->Restore();
+
+ // Corner and side strokes.
+ canvas->DrawImageInt(*left, 0, 0, img_w, h, x, y, img_w, h, false);
+ canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER),
+ 0, 0, img_w, h, right_x, y, img_w, h, false);
+
+ // Top stroke.
+ x += img_w;
+ canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_CENTER), x, y,
+ right_x - x, split_point);
}
-
- // Mask out the corners.
- gfx::ImageSkia* left = tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER);
- const int img_w = left->width();
- x -= kContentEdgeShadowThickness;
- SkPaint paint;
- paint.setXfermodeMode(SkXfermode::kDstIn_Mode);
- canvas->DrawImageInt(
- *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK), 0, 0, img_w,
- h, x, y, img_w, h, false, paint);
- const int right_x =
- toolbar_bounds.right() + kContentEdgeShadowThickness - img_w;
- canvas->DrawImageInt(
- *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK), 0, 0, img_w,
- h, right_x, y, img_w, h, false, paint);
- canvas->Restore();
-
- // Corner and side strokes.
- canvas->DrawImageInt(*left, 0, 0, img_w, h, x, y, img_w, h, false);
- canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER),
- 0, 0, img_w, h, right_x, y, img_w, h, false);
-
- // Top stroke.
- x += img_w;
- canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_CENTER), x, y,
- right_x - x, split_point);
}
// Toolbar/content separator.
@@ -713,6 +741,7 @@ void OpaqueBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) {
const int w = client_bounds.width();
const int right = client_bounds.right();
const bool normal_mode = browser_view()->IsTabStripVisible();
+ const bool md = ui::MaterialDesignController::IsModeMaterial();
const ui::ThemeProvider* tp = GetThemeProvider();
const SkColor toolbar_color = normal_mode ?
tp->GetColor(ThemeProperties::COLOR_TOOLBAR) :
@@ -721,8 +750,11 @@ void OpaqueBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) {
const gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds());
int img_y_offset = 0;
if (normal_mode) {
- // The client edge images start below the toolbar.
+ // Pre-Material Design, the client edge images start below the toolbar. In
+ // MD the client edge images start at the top of the toolbar.
y += toolbar_bounds.bottom();
+ if (md)
+ img_y_offset = -toolbar_bounds.height();
} else {
// The toolbar isn't going to draw a top edge for us, so draw one ourselves.
if (IsToolbarVisible()) {
@@ -732,21 +764,33 @@ void OpaqueBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) {
client_bounds.set_y(y);
client_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness,
-kClientEdgeThickness, client_bounds.height());
-
- // Edge.
- canvas->FillRect(client_bounds, toolbar_color);
-
- // Shadow.
- gfx::ImageSkia* top_left = tp->GetImageSkiaNamed(IDR_APP_TOP_LEFT);
- const int img_w = top_left->width();
- const int height = top_left->height();
- const int top_y = y - height;
- canvas->DrawImageInt(*top_left, 0, 0, img_w, height, x - img_w, top_y,
- img_w, height, false);
- canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_CENTER), 0, 0, x,
- top_y, w, height);
- canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_RIGHT), 0, 0, img_w,
- height, right, top_y, img_w, height, false);
+ if (md) {
+ img_y_offset = -kClientEdgeThickness;
+
+ // Edge.
+ BrowserView::Paint1pxHorizontalLine(canvas, toolbar_color, client_bounds,
+ false);
+
+ // Shadow.
+ client_bounds.Offset(0, img_y_offset);
+ BrowserView::Paint1pxHorizontalLine(
+ canvas, SkColorSetA(SK_ColorBLACK, 0x40), client_bounds, true);
+ } else {
+ // Edge.
+ canvas->FillRect(client_bounds, toolbar_color);
+
+ // Shadow.
+ gfx::ImageSkia* top_left = tp->GetImageSkiaNamed(IDR_APP_TOP_LEFT);
+ const int img_w = top_left->width();
+ const int height = top_left->height();
+ const int top_y = y - height;
+ canvas->DrawImageInt(*top_left, 0, 0, img_w, height, x - img_w, top_y,
+ img_w, height, false);
+ canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_CENTER), 0, 0, x,
+ top_y, w, height);
+ canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_RIGHT), 0, 0,
+ img_w, height, right, top_y, img_w, height, false);
+ }
}
// In maximized mode, the only edge to draw is the top one, so we're done.
« no previous file with comments | « chrome/browser/ui/views/frame/glass_browser_frame_view.cc ('k') | chrome/browser/ui/views/tabs/tab.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698