| Index: chrome/browser/ui/views/frame/glass_browser_frame_view.cc
|
| diff --git a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
|
| index c7f8c1eed33e40c2bc18d48fb85a3bd9ed6e1bfb..b4778cdacd2a4e2c5c9ca595bb7fd73b1885a71d 100644
|
| --- a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
|
| +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
|
| @@ -248,11 +248,9 @@ int GlassBrowserFrameView::NonClientHitTest(const gfx::Point& point) {
|
| // GlassBrowserFrameView, views::View overrides:
|
|
|
| void GlassBrowserFrameView::OnPaint(gfx::Canvas* canvas) {
|
| - if (browser_view()->IsToolbarVisible() &&
|
| - browser_view()->toolbar()->ShouldPaintBackground())
|
| + if (IsToolbarVisible())
|
| PaintToolbarBackground(canvas);
|
| - if (!frame()->IsMaximized())
|
| - PaintRestoredClientEdge(canvas);
|
| + PaintClientEdge(canvas);
|
| }
|
|
|
| void GlassBrowserFrameView::Layout() {
|
| @@ -342,6 +340,11 @@ int GlassBrowserFrameView::NonClientTopBorderHeight(bool restored) const {
|
| (top + kNonClientRestoredExtraThickness - exclusion);
|
| }
|
|
|
| +bool GlassBrowserFrameView::IsToolbarVisible() const {
|
| + return browser_view()->IsToolbarVisible() &&
|
| + !browser_view()->toolbar()->GetPreferredSize().IsEmpty();
|
| +}
|
| +
|
| void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) {
|
| gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds());
|
| if (toolbar_bounds.IsEmpty())
|
| @@ -351,30 +354,31 @@ void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) {
|
| toolbar_bounds.set_origin(toolbar_origin);
|
| const int h = toolbar_bounds.height();
|
| ui::ThemeProvider* tp = GetThemeProvider();
|
| + const SkColor separator_color =
|
| + tp->GetColor(ThemeProperties::COLOR_TOOLBAR_SEPARATOR);
|
|
|
| // Background.
|
| - int x = toolbar_bounds.x();
|
| - const int y = toolbar_bounds.y();
|
| - int w = toolbar_bounds.width();
|
| -
|
| - // 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) {
|
| - // Tile the toolbar image starting at the frame edge on the left and where
|
| - // the tabstrip is on the top.
|
| - const int split_y =
|
| - y + (browser_view()->IsTabStripVisible() ? split_point : 0);
|
| - const int bg_y =
|
| - GetTopInset(false) + Tab::GetYInsetForActiveTabBackground();
|
| - canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR),
|
| - x + GetThemeBackgroundXInset(), split_y - bg_y, x,
|
| - split_y, w, h - split_point);
|
| - }
|
| -
|
| if (browser_view()->IsTabStripVisible()) {
|
| + int x = toolbar_bounds.x();
|
| + const int y = toolbar_bounds.y();
|
| + int w = toolbar_bounds.width();
|
| +
|
| + // 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) {
|
| + // Tile the toolbar image starting at the frame edge on the left and where
|
| + // the tabstrip is on the top.
|
| + const int split_y = y + split_point;
|
| + const int bg_y =
|
| + GetTopInset(false) + Tab::GetYInsetForActiveTabBackground();
|
| + canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR),
|
| + x + GetThemeBackgroundXInset(), split_y - bg_y, x,
|
| + split_y, w, h - split_point);
|
| + }
|
| +
|
| // On Windows 10+ where we don't draw our own window border but rather go
|
| // right to the system border, the toolbar has no corners or side strokes.
|
| if (base::win::GetVersion() < base::win::VERSION_WIN10) {
|
| @@ -405,37 +409,55 @@ void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) {
|
| // Top stroke.
|
| canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_CENTER), x, y,
|
| w, split_point);
|
| +
|
| + if (ui::MaterialDesignController::IsModeMaterial()) {
|
| + // Toolbar/content separator.
|
| + toolbar_bounds.Inset(kClientEdgeThickness, 0);
|
| + BrowserView::Paint1pxHorizontalLine(canvas, separator_color,
|
| + toolbar_bounds);
|
| + return;
|
| + }
|
| }
|
|
|
| // Toolbar/content separator.
|
| - const SkColor separator_color =
|
| - tp->GetColor(ThemeProperties::COLOR_TOOLBAR_SEPARATOR);
|
| - if (ui::MaterialDesignController::IsModeMaterial()) {
|
| - toolbar_bounds.Inset(kClientEdgeThickness, 0);
|
| - BrowserView::Paint1pxHorizontalLine(canvas, separator_color,
|
| - toolbar_bounds);
|
| - } else {
|
| - toolbar_bounds.Inset(kClientEdgeThickness, h - kClientEdgeThickness,
|
| - kClientEdgeThickness, 0);
|
| - canvas->FillRect(toolbar_bounds, separator_color);
|
| - }
|
| + toolbar_bounds.Inset(kClientEdgeThickness, h - kClientEdgeThickness,
|
| + kClientEdgeThickness, 0);
|
| + canvas->FillRect(toolbar_bounds, separator_color);
|
| }
|
|
|
| -void GlassBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) {
|
| +void GlassBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) {
|
| + gfx::Rect client_bounds = CalculateClientAreaBounds();
|
| + int y = client_bounds.y();
|
| + const bool normal_mode = browser_view()->IsTabStripVisible();
|
| ui::ThemeProvider* tp = GetThemeProvider();
|
| - int y = frame()->client_view()->y();
|
| + const SkColor toolbar_color = normal_mode ?
|
| + tp->GetColor(ThemeProperties::COLOR_TOOLBAR) :
|
| + ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_TOOLBAR);
|
| +
|
| + const gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds());
|
| + if (!normal_mode) {
|
| + // The toolbar isn't going to draw a top edge for us, so draw one ourselves.
|
| + if (IsToolbarVisible())
|
| + y += toolbar_bounds.y() + kClientEdgeThickness;
|
| + client_bounds.set_y(y);
|
| + client_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness,
|
| + -kClientEdgeThickness, client_bounds.height());
|
| + canvas->FillRect(client_bounds, toolbar_color);
|
| +
|
| + // Popup and app windows don't custom-draw any other edges, so we're done.
|
| + return;
|
| + }
|
| +
|
| + // In maximized mode, the only edge to draw is the top one, so we're done.
|
| + if (frame()->IsMaximized())
|
| + return;
|
|
|
| - gfx::Rect client_bounds = CalculateClientAreaBounds();
|
| const int x = client_bounds.x();
|
| + y += toolbar_bounds.bottom(); // The side edges start below the toolbar.
|
| const int w = client_bounds.width();
|
| const int right = client_bounds.right();
|
| - const SkColor toolbar_color = tp->GetColor(ThemeProperties::COLOR_TOOLBAR);
|
| -
|
| - // The client edges start below the toolbar.
|
| - y += browser_view()->GetToolbarBounds().bottom();
|
| -
|
| const int bottom = std::max(y, height() - NonClientBorderThickness(false));
|
| - int height = bottom - y;
|
| + const int height = bottom - y;
|
|
|
| // Draw the client edge images.
|
| gfx::ImageSkia* right_image = tp->GetImageSkiaNamed(IDR_CONTENT_RIGHT_SIDE);
|
|
|