Index: chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm |
diff --git a/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm b/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm |
index cb541b1328a25275b05c821e43acefd3284081e0..f87daf6d758db863a19ca72fb1b027e90fa7b3c2 100644 |
--- a/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm |
+++ b/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm |
@@ -7,12 +7,22 @@ |
#include "base/memory/scoped_nsobject.h" |
#include "chrome/browser/tab_contents/infobar.h" |
#import "chrome/browser/themes/theme_service.h" |
+#import "chrome/browser/ui/cocoa/browser_window_controller.h" |
#import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" |
+#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
#import "chrome/browser/ui/cocoa/themed_window.h" |
#include "skia/ext/skia_utils_mac.h" |
+namespace { |
+ |
+const CGFloat kTipWidth = 23; |
+ |
+} // namespace |
+ |
@implementation InfoBarGradientView |
+@synthesize tipApex = tipApex_; |
+ |
- (void)setInfobarType:(InfoBarDelegate::Type)infobarType { |
SkColor topColor = GetInfoBarTopColor(infobarType); |
SkColor bottomColor = GetInfoBarBottomColor(infobarType); |
@@ -38,11 +48,23 @@ |
NSRect bounds = [self bounds]; |
bounds.size.height = infobars::kBaseHeight; |
+ const CGFloat kHalfWidth = kTipWidth / 2.0; |
+ const CGFloat kTipXOffset = self.tipApex.x - kHalfWidth; |
+ |
// Around the bounds of the infobar, continue drawing the path into which the |
// gradient will be drawn. |
NSBezierPath* infoBarPath = [NSBezierPath bezierPath]; |
[infoBarPath moveToPoint:NSMakePoint(NSMinX(bounds), NSMaxY(bounds))]; |
+ |
+ // Draw the tip. |
+ [infoBarPath lineToPoint:NSMakePoint(kTipXOffset, NSMaxY(bounds))]; |
+ [infoBarPath relativeLineToPoint:NSMakePoint(kHalfWidth, |
+ infobars::kTipHeight)]; |
+ [infoBarPath relativeLineToPoint:NSMakePoint(kHalfWidth, |
+ -infobars::kTipHeight)]; |
[infoBarPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMaxY(bounds))]; |
+ |
+ // Save off the top path of the infobar. |
scoped_nsobject<NSBezierPath> topPath([infoBarPath copy]); |
[infoBarPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMinY(bounds))]; |
@@ -52,21 +74,33 @@ |
// Draw the gradient. |
[[self gradient] drawInBezierPath:infoBarPath angle:270]; |
- // Stroke the bottom. |
NSColor* strokeColor = [self strokeColor]; |
if (strokeColor) { |
[strokeColor set]; |
+ |
+ // Stroke the bottom of the infobar. |
NSRect borderRect, contentRect; |
NSDivideRect(bounds, &borderRect, &contentRect, 1, NSMinYEdge); |
NSRectFillUsingOperation(borderRect, NSCompositeSourceOver); |
+ |
+ // Re-stroke the top because the tip will have no stroke. This will draw |
+ // over the divider drawn by the bottom of the tabstrip. |
+ [topPath stroke]; |
} |
// Add an inner stroke. |
+ const CGFloat kHighlightTipHeight = infobars::kTipHeight - 1; |
+ NSBezierPath* highlightPath = [NSBezierPath bezierPath]; |
+ [highlightPath moveToPoint:NSMakePoint(NSMinX(bounds), NSMaxY(bounds) - 1)]; |
+ [highlightPath relativeLineToPoint:NSMakePoint(kTipXOffset + 1, 0)]; |
+ [highlightPath relativeLineToPoint:NSMakePoint(kHalfWidth - 1, |
+ kHighlightTipHeight)]; |
+ [highlightPath relativeLineToPoint:NSMakePoint(kHalfWidth - 1, |
+ -kHighlightTipHeight)]; |
+ [highlightPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMaxY(bounds) - 1)]; |
+ |
[[NSColor colorWithDeviceWhite:1.0 alpha:1.0] setStroke]; |
- NSAffineTransform* transform = [NSAffineTransform transform]; |
- [transform translateXBy:0.0 yBy:-1.0]; |
- [topPath transformUsingAffineTransform:transform]; |
- [topPath stroke]; |
+ [highlightPath stroke]; |
} |
- (BOOL)mouseDownCanMoveWindow { |