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

Side by Side 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: Color changes 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 unified diff | Download patch
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/frame/opaque_browser_frame_view.h" 5 #include "chrome/browser/ui/views/frame/opaque_browser_frame_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 21 matching lines...) Expand all
32 #include "ui/base/hit_test.h" 32 #include "ui/base/hit_test.h"
33 #include "ui/base/l10n/l10n_util.h" 33 #include "ui/base/l10n/l10n_util.h"
34 #include "ui/base/resource/material_design/material_design_controller.h" 34 #include "ui/base/resource/material_design/material_design_controller.h"
35 #include "ui/base/theme_provider.h" 35 #include "ui/base/theme_provider.h"
36 #include "ui/gfx/canvas.h" 36 #include "ui/gfx/canvas.h"
37 #include "ui/gfx/font_list.h" 37 #include "ui/gfx/font_list.h"
38 #include "ui/gfx/geometry/rect_conversions.h" 38 #include "ui/gfx/geometry/rect_conversions.h"
39 #include "ui/gfx/image/image.h" 39 #include "ui/gfx/image/image.h"
40 #include "ui/gfx/image/image_skia.h" 40 #include "ui/gfx/image/image_skia.h"
41 #include "ui/gfx/path.h" 41 #include "ui/gfx/path.h"
42 #include "ui/gfx/scoped_canvas.h"
42 #include "ui/resources/grit/ui_resources.h" 43 #include "ui/resources/grit/ui_resources.h"
43 #include "ui/views/controls/button/image_button.h" 44 #include "ui/views/controls/button/image_button.h"
44 #include "ui/views/controls/image_view.h" 45 #include "ui/views/controls/image_view.h"
45 #include "ui/views/controls/label.h" 46 #include "ui/views/controls/label.h"
46 #include "ui/views/layout/layout_constants.h" 47 #include "ui/views/layout/layout_constants.h"
47 #include "ui/views/resources/grit/views_resources.h" 48 #include "ui/views/resources/grit/views_resources.h"
48 #include "ui/views/views_delegate.h" 49 #include "ui/views/views_delegate.h"
49 #include "ui/views/widget/root_view.h" 50 #include "ui/views/widget/root_view.h"
50 #include "ui/views/window/frame_background.h" 51 #include "ui/views/window/frame_background.h"
51 #include "ui/views/window/window_shape.h" 52 #include "ui/views/window/window_shape.h"
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 tp->GetColor(ThemeProperties::COLOR_TOOLBAR_SEPARATOR); 643 tp->GetColor(ThemeProperties::COLOR_TOOLBAR_SEPARATOR);
643 644
644 if (browser_view()->IsTabStripVisible()) { 645 if (browser_view()->IsTabStripVisible()) {
645 gfx::ImageSkia* bg = tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR); 646 gfx::ImageSkia* bg = tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR);
646 int x = toolbar_bounds.x(); 647 int x = toolbar_bounds.x();
647 const int y = toolbar_bounds.y(); 648 const int y = toolbar_bounds.y();
648 const int bg_y = 649 const int bg_y =
649 GetTopInset(false) + Tab::GetYInsetForActiveTabBackground(); 650 GetTopInset(false) + Tab::GetYInsetForActiveTabBackground();
650 const int w = toolbar_bounds.width(); 651 const int w = toolbar_bounds.width();
651 652
652 // Background. We need to create a separate layer so we can mask off the 653 if (md) {
653 // corners before compositing onto the frame. 654 // Background. The top stroke is drawn above the toolbar bounds, so
654 canvas->sk_canvas()->saveLayer( 655 // unlike in the non-Material Design code below, we don't need to exclude
655 gfx::RectToSkRect(gfx::Rect(x - kContentEdgeShadowThickness, y, 656 // any region from having the background image drawn over it.
656 w + kContentEdgeShadowThickness * 2, h)), 657 if (tp->HasCustomImage(IDR_THEME_TOOLBAR)) {
657 nullptr); 658 canvas->TileImageInt(*bg, x + GetThemeBackgroundXInset(), y - bg_y, x,
659 y, w, h);
660 } else {
661 canvas->FillRect(toolbar_bounds,
662 tp->GetColor(ThemeProperties::COLOR_TOOLBAR));
663 }
658 664
659 // The top stroke is drawn using the IDR_CONTENT_TOP_XXX images, which 665 // Material Design has no corners to mask out.
660 // overlay the toolbar. The top 2 px of these images is the actual top 666
661 // stroke + shadow, and is partly transparent, so the toolbar background 667 // Top stroke. For Material Design, the toolbar has no side strokes.
662 // shouldn't be drawn over it. 668 gfx::Rect separator_rect(x, y, w, 0);
663 const int split_point = std::min(kContentEdgeShadowThickness, h); 669 gfx::ScopedCanvas scoped_canvas(canvas);
664 if (h > split_point) { 670 gfx::Rect tabstrip_bounds(
665 const int split_y = y + split_point; 671 GetBoundsForTabStrip(browser_view()->tabstrip()));
666 canvas->TileImageInt(*bg, x + GetThemeBackgroundXInset(), split_y - bg_y, 672 tabstrip_bounds.set_x(GetMirroredXForRect(tabstrip_bounds));
667 x, split_y, w, h - split_point); 673 canvas->sk_canvas()->clipRect(gfx::RectToSkRect(tabstrip_bounds),
674 SkRegion::kDifference_Op);
675 separator_rect.set_y(tabstrip_bounds.bottom());
676 BrowserView::Paint1pxHorizontalLine(
677 canvas, SkColorSetA(SK_ColorBLACK, 0x40), separator_rect, true);
678 } else {
Peter Kasting 2015/12/09 01:20:30 This arm is copied verbatim from before, just inde
679 // Background. We need to create a separate layer so we can mask off the
680 // corners before compositing onto the frame.
681 canvas->sk_canvas()->saveLayer(
682 gfx::RectToSkRect(gfx::Rect(x - kContentEdgeShadowThickness, y,
683 w + kContentEdgeShadowThickness * 2, h)),
684 nullptr);
685
686 // The top stroke is drawn using the IDR_CONTENT_TOP_XXX images, which
687 // overlay the toolbar. The top 2 px of these images is the actual top
688 // stroke + shadow, and is partly transparent, so the toolbar background
689 // shouldn't be drawn over it.
690 const int split_point = std::min(kContentEdgeShadowThickness, h);
691 if (h > split_point) {
692 const int split_y = y + split_point;
693 canvas->TileImageInt(*bg, x + GetThemeBackgroundXInset(),
694 split_y - bg_y, x, split_y, w, h - split_point);
695 }
696
697 // Mask out the corners.
698 gfx::ImageSkia* left = tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER);
699 const int img_w = left->width();
700 x -= kContentEdgeShadowThickness;
701 SkPaint paint;
702 paint.setXfermodeMode(SkXfermode::kDstIn_Mode);
703 canvas->DrawImageInt(
704 *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK), 0, 0, img_w,
705 h, x, y, img_w, h, false, paint);
706 const int right_x =
707 toolbar_bounds.right() + kContentEdgeShadowThickness - img_w;
708 canvas->DrawImageInt(
709 *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK), 0, 0,
710 img_w, h, right_x, y, img_w, h, false, paint);
711 canvas->Restore();
712
713 // Corner and side strokes.
714 canvas->DrawImageInt(*left, 0, 0, img_w, h, x, y, img_w, h, false);
715 canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER),
716 0, 0, img_w, h, right_x, y, img_w, h, false);
717
718 // Top stroke.
719 x += img_w;
720 canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_CENTER), x, y,
721 right_x - x, split_point);
668 } 722 }
669
670 // Mask out the corners.
671 gfx::ImageSkia* left = tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER);
672 const int img_w = left->width();
673 x -= kContentEdgeShadowThickness;
674 SkPaint paint;
675 paint.setXfermodeMode(SkXfermode::kDstIn_Mode);
676 canvas->DrawImageInt(
677 *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK), 0, 0, img_w,
678 h, x, y, img_w, h, false, paint);
679 const int right_x =
680 toolbar_bounds.right() + kContentEdgeShadowThickness - img_w;
681 canvas->DrawImageInt(
682 *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK), 0, 0, img_w,
683 h, right_x, y, img_w, h, false, paint);
684 canvas->Restore();
685
686 // Corner and side strokes.
687 canvas->DrawImageInt(*left, 0, 0, img_w, h, x, y, img_w, h, false);
688 canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER),
689 0, 0, img_w, h, right_x, y, img_w, h, false);
690
691 // Top stroke.
692 x += img_w;
693 canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_CENTER), x, y,
694 right_x - x, split_point);
695 } 723 }
696 724
697 // Toolbar/content separator. 725 // Toolbar/content separator.
698 toolbar_bounds.Inset(kClientEdgeThickness, h - kClientEdgeThickness, 726 toolbar_bounds.Inset(kClientEdgeThickness, h - kClientEdgeThickness,
699 kClientEdgeThickness, 0); 727 kClientEdgeThickness, 0);
700 if (md) { 728 if (md) {
701 BrowserView::Paint1pxHorizontalLine(canvas, separator_color, 729 BrowserView::Paint1pxHorizontalLine(canvas, separator_color,
702 toolbar_bounds, true); 730 toolbar_bounds, true);
703 } else { 731 } else {
704 canvas->FillRect(toolbar_bounds, separator_color); 732 canvas->FillRect(toolbar_bounds, separator_color);
705 } 733 }
706 } 734 }
707 735
708 void OpaqueBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) { 736 void OpaqueBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) {
709 gfx::Rect client_bounds = 737 gfx::Rect client_bounds =
710 layout_->CalculateClientAreaBounds(width(), height()); 738 layout_->CalculateClientAreaBounds(width(), height());
711 const int x = client_bounds.x(); 739 const int x = client_bounds.x();
712 int y = client_bounds.y(); 740 int y = client_bounds.y();
713 const int w = client_bounds.width(); 741 const int w = client_bounds.width();
714 const int right = client_bounds.right(); 742 const int right = client_bounds.right();
715 const bool normal_mode = browser_view()->IsTabStripVisible(); 743 const bool normal_mode = browser_view()->IsTabStripVisible();
744 const bool md = ui::MaterialDesignController::IsModeMaterial();
716 const ui::ThemeProvider* tp = GetThemeProvider(); 745 const ui::ThemeProvider* tp = GetThemeProvider();
717 const SkColor toolbar_color = normal_mode ? 746 const SkColor toolbar_color = normal_mode ?
718 tp->GetColor(ThemeProperties::COLOR_TOOLBAR) : 747 tp->GetColor(ThemeProperties::COLOR_TOOLBAR) :
719 ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_TOOLBAR); 748 ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_TOOLBAR);
720 749
721 const gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); 750 const gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds());
722 int img_y_offset = 0; 751 int img_y_offset = 0;
723 if (normal_mode) { 752 if (normal_mode) {
724 // The client edge images start below the toolbar. 753 // Pre-Material Design, the client edge images start below the toolbar. In
754 // MD the client edge images start at the top of the toolbar.
725 y += toolbar_bounds.bottom(); 755 y += toolbar_bounds.bottom();
756 if (md)
757 img_y_offset = -toolbar_bounds.height();
726 } else { 758 } else {
727 // The toolbar isn't going to draw a top edge for us, so draw one ourselves. 759 // The toolbar isn't going to draw a top edge for us, so draw one ourselves.
728 if (IsToolbarVisible()) { 760 if (IsToolbarVisible()) {
729 y += toolbar_bounds.y() + kContentEdgeShadowThickness + 761 y += toolbar_bounds.y() + kContentEdgeShadowThickness +
730 kClientEdgeThickness; 762 kClientEdgeThickness;
731 } 763 }
732 client_bounds.set_y(y); 764 client_bounds.set_y(y);
733 client_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness, 765 client_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness,
734 -kClientEdgeThickness, client_bounds.height()); 766 -kClientEdgeThickness, client_bounds.height());
767 if (md) {
768 img_y_offset = -kClientEdgeThickness;
735 769
736 // Edge. 770 // Edge.
737 canvas->FillRect(client_bounds, toolbar_color); 771 BrowserView::Paint1pxHorizontalLine(canvas, toolbar_color, client_bounds,
772 false);
738 773
739 // Shadow. 774 // Shadow.
740 gfx::ImageSkia* top_left = tp->GetImageSkiaNamed(IDR_APP_TOP_LEFT); 775 client_bounds.Offset(0, img_y_offset);
741 const int img_w = top_left->width(); 776 BrowserView::Paint1pxHorizontalLine(
742 const int height = top_left->height(); 777 canvas, SkColorSetA(SK_ColorBLACK, 0x40), client_bounds, true);
743 const int top_y = y - height; 778 } else {
Peter Kasting 2015/12/09 01:20:30 Same here.
744 canvas->DrawImageInt(*top_left, 0, 0, img_w, height, x - img_w, top_y, 779 // Edge.
745 img_w, height, false); 780 canvas->FillRect(client_bounds, toolbar_color);
746 canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_CENTER), 0, 0, x, 781
747 top_y, w, height); 782 // Shadow.
748 canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_RIGHT), 0, 0, img_w, 783 gfx::ImageSkia* top_left = tp->GetImageSkiaNamed(IDR_APP_TOP_LEFT);
749 height, right, top_y, img_w, height, false); 784 const int img_w = top_left->width();
785 const int height = top_left->height();
786 const int top_y = y - height;
787 canvas->DrawImageInt(*top_left, 0, 0, img_w, height, x - img_w, top_y,
788 img_w, height, false);
789 canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_CENTER), 0, 0, x,
790 top_y, w, height);
791 canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_RIGHT), 0, 0,
792 img_w, height, right, top_y, img_w, height, false);
793 }
750 } 794 }
751 795
752 // In maximized mode, the only edge to draw is the top one, so we're done. 796 // In maximized mode, the only edge to draw is the top one, so we're done.
753 if (layout_->IsTitleBarCondensed()) 797 if (layout_->IsTitleBarCondensed())
754 return; 798 return;
755 799
756 const int img_y = y + img_y_offset; 800 const int img_y = y + img_y_offset;
757 const int bottom = std::max(y, height() - NonClientBorderThickness()); 801 const int bottom = std::max(y, height() - NonClientBorderThickness());
758 int height = bottom - img_y; 802 int height = bottom - img_y;
759 803
(...skipping 16 matching lines...) Expand all
776 // images because the images are meant to alpha-blend atop the frame whereas 820 // images because the images are meant to alpha-blend atop the frame whereas
777 // these rects are meant to be fully opaque, without anything overlaid. 821 // these rects are meant to be fully opaque, without anything overlaid.
778 gfx::Rect side(x - kClientEdgeThickness, y, kClientEdgeThickness, 822 gfx::Rect side(x - kClientEdgeThickness, y, kClientEdgeThickness,
779 bottom + kClientEdgeThickness - y); 823 bottom + kClientEdgeThickness - y);
780 canvas->FillRect(side, toolbar_color); 824 canvas->FillRect(side, toolbar_color);
781 canvas->FillRect(gfx::Rect(x, bottom, w, kClientEdgeThickness), 825 canvas->FillRect(gfx::Rect(x, bottom, w, kClientEdgeThickness),
782 toolbar_color); 826 toolbar_color);
783 side.set_x(right); 827 side.set_x(right);
784 canvas->FillRect(side, toolbar_color); 828 canvas->FillRect(side, toolbar_color);
785 } 829 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698