| Index: chrome/browser/cocoa/tab_view.mm
|
| ===================================================================
|
| --- chrome/browser/cocoa/tab_view.mm (revision 24707)
|
| +++ chrome/browser/cocoa/tab_view.mm (working copy)
|
| @@ -13,13 +13,9 @@
|
| static const CGFloat kControlPoint1Multiplier = 1.0/3.0;
|
| static const CGFloat kControlPoint2Multiplier = 3.0/8.0;
|
|
|
| -static const NSTimeInterval kAnimationShowDuration = 0.2;
|
| -static const NSTimeInterval kAnimationHideDuration = 0.4;
|
| -
|
| @implementation TabView
|
|
|
| @synthesize state = state_;
|
| -@synthesize hoverAlpha = hoverAlpha_;
|
|
|
| - (id)initWithFrame:(NSRect)frame {
|
| self = [super initWithFrame:frame];
|
| @@ -38,18 +34,18 @@
|
| // to the |closeButton_| view, but we'll handle the message ourself.
|
| // The mouseover is always enabled, because the close button works
|
| // regardless of key/main/active status.
|
| - closeTrackingArea_.reset(
|
| + trackingArea_.reset(
|
| [[NSTrackingArea alloc] initWithRect:[closeButton_ bounds]
|
| options:NSTrackingMouseEnteredAndExited |
|
| NSTrackingActiveAlways
|
| owner:self
|
| userInfo:nil]);
|
| - [closeButton_ addTrackingArea:closeTrackingArea_.get()];
|
| + [closeButton_ addTrackingArea:trackingArea_.get()];
|
| }
|
|
|
| - (void)dealloc {
|
| // [self gtm_unregisterForThemeNotifications];
|
| - [closeButton_ removeTrackingArea:closeTrackingArea_.get()];
|
| + [closeButton_ removeTrackingArea:trackingArea_.get()];
|
| [super dealloc];
|
| }
|
|
|
| @@ -60,57 +56,16 @@
|
| return YES;
|
| }
|
|
|
| -- (void)adjustHoverValue {
|
| - NSTimeInterval thisUpdate = [NSDate timeIntervalSinceReferenceDate];
|
| -
|
| - NSTimeInterval elapsed = thisUpdate - lastHoverUpdate_;
|
| -
|
| - CGFloat opacity = [self hoverAlpha];
|
| - if (isMouseInside_) {
|
| - opacity += elapsed / kAnimationShowDuration;
|
| - } else {
|
| - opacity -= elapsed / kAnimationHideDuration;
|
| - }
|
| -
|
| - if (!isMouseInside_ && opacity < 0) {
|
| - opacity = 0;
|
| - } else if (isMouseInside_ && opacity > 1) {
|
| - opacity = 1;
|
| - } else {
|
| - [self performSelector:_cmd withObject:nil afterDelay:0.02];
|
| - }
|
| - lastHoverUpdate_ = thisUpdate;
|
| - [self setHoverAlpha:opacity];
|
| -
|
| - [self setNeedsDisplay:YES];
|
| -}
|
| -
|
| - (void)mouseEntered:(NSEvent *)theEvent {
|
| - if ([theEvent trackingArea] == closeTrackingArea_) {
|
| - [closeButton_ setImage:nsimage_cache::ImageNamed(@"close_bar_h.pdf")];
|
| - } else {
|
| - lastHoverUpdate_ = [NSDate timeIntervalSinceReferenceDate];
|
| - isMouseInside_ = YES;
|
| - [self adjustHoverValue];
|
| - [self setNeedsDisplay:YES];
|
| - }
|
| + // We only set up one tracking area, so we know any mouseEntered:
|
| + // messages are for close button mouseovers.
|
| + [closeButton_ setImage:nsimage_cache::ImageNamed(@"close_bar_h.pdf")];
|
| }
|
|
|
| -- (void)mouseMoved:(NSEvent *)theEvent {
|
| - hoverPoint_ = [self convertPoint:[theEvent locationInWindow]
|
| - fromView:nil];
|
| - [self setNeedsDisplay:YES];
|
| -}
|
| -
|
| - (void)mouseExited:(NSEvent *)theEvent {
|
| - if ([theEvent trackingArea] == closeTrackingArea_) {
|
| - [closeButton_ setImage:nsimage_cache::ImageNamed(@"close_bar.pdf")];
|
| - } else {
|
| - lastHoverUpdate_ = [NSDate timeIntervalSinceReferenceDate];
|
| - isMouseInside_ = NO;
|
| - [self adjustHoverValue];
|
| - [self setNeedsDisplay:YES];
|
| - }
|
| + // We only set up one tracking area, so we know any mouseExited:
|
| + // messages are for close button mouseovers.
|
| + [closeButton_ setImage:nsimage_cache::ImageNamed(@"close_bar.pdf")];
|
| }
|
|
|
| // Determines which view a click in our frame actually hit. It's either this
|
| @@ -276,6 +231,7 @@
|
| NSRect windowFrame = [[target window] frame];
|
| if (NSPointInRect(thisPoint, windowFrame)) {
|
| NSRect tabStripFrame = [[target tabStripView] frame];
|
| + tabStripFrame = [[target tabStripView] convertRectToBase:tabStripFrame];
|
| tabStripFrame.origin = [[target window]
|
| convertBaseToScreen:tabStripFrame.origin];
|
| if (NSPointInRect(thisPoint, tabStripFrame)) {
|
| @@ -470,11 +426,11 @@
|
| // Inset by 0.5 in order to draw on pixels rather than on borders (which would
|
| // cause blurry pixels). Decrease height by 1 in order to move away from the
|
| // edge for the dark shadow.
|
| - rect = NSInsetRect(rect, -0.5, -0.5);
|
| + rect = NSInsetRect(rect, 0.5, -0.5);
|
| rect.origin.y -= 1;
|
|
|
| - NSPoint bottomLeft = NSMakePoint(NSMinX(rect), NSMinY(rect) + 2);
|
| - NSPoint bottomRight = NSMakePoint(NSMaxX(rect), NSMinY(rect) + 2);
|
| + NSPoint bottomLeft = NSMakePoint(NSMinX(rect), NSMinY(rect));
|
| + NSPoint bottomRight = NSMakePoint(NSMaxX(rect), NSMinY(rect));
|
| NSPoint topRight =
|
| NSMakePoint(NSMaxX(rect) - kInsetMultiplier * NSHeight(rect),
|
| NSMaxY(rect));
|
| @@ -488,7 +444,7 @@
|
| // Outset many of these values by 1 to cause the fill to bleed outside the
|
| // clip area.
|
| NSBezierPath *path = [NSBezierPath bezierPath];
|
| - [path moveToPoint:NSMakePoint(bottomLeft.x - 1, bottomLeft.y - 2)];
|
| + [path moveToPoint:NSMakePoint(bottomLeft.x - 1, bottomLeft.y + 1)];
|
| [path lineToPoint:NSMakePoint(bottomLeft.x - 1, bottomLeft.y)];
|
| [path lineToPoint:bottomLeft];
|
| [path curveToPoint:topLeft
|
| @@ -503,8 +459,31 @@
|
| controlPoint2:NSMakePoint(bottomRight.x - baseControlPointOutset,
|
| bottomRight.y)];
|
| [path lineToPoint:NSMakePoint(bottomRight.x + 1, bottomRight.y)];
|
| - [path lineToPoint:NSMakePoint(bottomRight.x + 1, bottomRight.y - 2)];
|
| + [path lineToPoint:NSMakePoint(bottomRight.x + 1, bottomRight.y + 1)];
|
|
|
| + if (selected) {
|
| + // Stroke with a translucent black.
|
| + [[NSColor colorWithCalibratedWhite:0.0 alpha:active ? 0.5 : 0.3] set];
|
| + [[NSGraphicsContext currentContext] saveGraphicsState];
|
| + scoped_nsobject<NSShadow> shadow([[NSShadow alloc] init]);
|
| + [shadow setShadowOffset:NSMakeSize(2, -1)];
|
| + [shadow setShadowBlurRadius:2.0];
|
| + [path fill];
|
| + [[NSGraphicsContext currentContext] restoreGraphicsState];
|
| + } else {
|
| + // Stroke with a translucent black.
|
| + [[NSBezierPath bezierPathWithRect:NSOffsetRect([self bounds], 0, 1)]
|
| + addClip];
|
| +
|
| + [[NSColor colorWithCalibratedWhite:0.0 alpha:active ? 0.3 : 0.1] set];
|
| + }
|
| +
|
| + [[NSGraphicsContext currentContext] saveGraphicsState];
|
| + [[NSColor colorWithCalibratedWhite:0.0 alpha:0.2] set];
|
| + [path setLineWidth:selected ? 2.0 : 1.0];
|
| + [path stroke];
|
| + [[NSGraphicsContext currentContext] restoreGraphicsState];
|
| +
|
| GTMTheme *theme = [self gtm_theme];
|
|
|
| if (!selected) {
|
| @@ -512,102 +491,34 @@
|
| [theme backgroundPatternColorForStyle:GTMThemeStyleWindow
|
| state:GTMThemeStateActiveWindow];
|
| if (windowColor) {
|
| - [windowColor set];
|
| -
|
| - [[NSGraphicsContext currentContext] setPatternPhase:[self patternPhase]];
|
| - } else {
|
| NSPoint phase = [self patternPhase];
|
| - phase.y += 1;
|
| + [windowColor set];
|
| [[NSGraphicsContext currentContext] setPatternPhase:phase];
|
| - [[NSColor windowBackgroundColor] set];
|
| - }
|
| -
|
| - [path fill];
|
| -
|
| - NSColor *tabColor =
|
| - [theme backgroundPatternColorForStyle:GTMThemeStyleTabBarDeselected
|
| - state:GTMThemeStateActiveWindow];
|
| - if (tabColor) {
|
| - [tabColor set];
|
| - [[NSGraphicsContext currentContext] setPatternPhase:[self patternPhase]];
|
| } else {
|
| - [[NSColor colorWithCalibratedWhite:1.0 alpha:0.3] set];
|
| + [[NSColor colorWithCalibratedWhite:0.6 alpha:1.0] set];
|
| }
|
| [path fill];
|
| -
|
| }
|
|
|
| + // Draw the background.
|
| [[NSGraphicsContext currentContext] saveGraphicsState];
|
| + CGContextRef context =
|
| + (CGContextRef)([[NSGraphicsContext currentContext] graphicsPort]);
|
| + CGContextBeginTransparencyLayer(context, 0);
|
| + if (!selected)
|
| + CGContextSetAlpha(context, 0.5);
|
| [path addClip];
|
| + [super drawRect:rect];
|
|
|
| - if (selected || hoverAlpha_ > 0) {
|
| - // Draw the background.
|
| - CGFloat backgroundAlpha = hoverAlpha_ * 0.5;
|
| - [[NSGraphicsContext currentContext] saveGraphicsState];
|
| - CGContextRef context =
|
| - (CGContextRef)([[NSGraphicsContext currentContext] graphicsPort]);
|
| - CGContextBeginTransparencyLayer(context, 0);
|
| - if (!selected)
|
| - CGContextSetAlpha(context, backgroundAlpha);
|
| - [path addClip];
|
| - [super drawRect:rect];
|
| -
|
| - // Draw a mouse hover gradient for the default themes
|
| - if (!selected) {
|
| - if (![theme backgroundImageForStyle:GTMThemeStyleTabBarDeselected
|
| - state:GTMThemeStateActiveWindow]) {
|
| - scoped_nsobject<NSGradient> glow([NSGradient alloc]);
|
| - [glow initWithStartingColor:[NSColor colorWithCalibratedWhite:1.0
|
| - alpha:1.0 *
|
| - hoverAlpha_]
|
| - endingColor:[NSColor colorWithCalibratedWhite:1.0
|
| - alpha:0.0]];
|
| -
|
| - NSPoint point = hoverPoint_;
|
| - point.y = NSHeight(rect);
|
| - [glow drawFromCenter:point
|
| - radius:0
|
| - toCenter:point
|
| - radius:NSWidth(rect)/3
|
| - options:NSGradientDrawsBeforeStartingLocation];
|
| -
|
| - [glow drawInBezierPath:path relativeCenterPosition:hoverPoint_];
|
| - }
|
| - }
|
| -
|
| - CGContextEndTransparencyLayer(context);
|
| - [[NSGraphicsContext currentContext] restoreGraphicsState];
|
| - }
|
| -
|
| - // Draw the top inner highlight.
|
| - NSAffineTransform* highlightTransform = [NSAffineTransform transform];
|
| - [highlightTransform translateXBy:1 yBy:-1];
|
| - scoped_nsobject<NSBezierPath> highlightPath([path copy]);
|
| - [highlightPath transformUsingAffineTransform:highlightTransform];
|
| - [[NSColor colorWithCalibratedWhite:1.0 alpha:0.2 + 0.3 * hoverAlpha_]
|
| - setStroke];
|
| - [highlightPath stroke];
|
| -
|
| + CGContextEndTransparencyLayer(context);
|
| [[NSGraphicsContext currentContext] restoreGraphicsState];
|
|
|
| - // Draw the top stroke.
|
| - [[NSGraphicsContext currentContext] saveGraphicsState];
|
| - if (selected) {
|
| - [[NSColor colorWithDeviceWhite:0.0 alpha:active ? 0.3 : 0.15] set];
|
| - } else {
|
| - [[NSColor colorWithDeviceWhite:0.0 alpha:active ? 0.2 : 0.15] set];
|
| - [[NSBezierPath bezierPathWithRect:NSOffsetRect(rect, 0, 2.5)] addClip];
|
| - }
|
| - [path setLineWidth:1.0];
|
| - [path stroke];
|
| - [[NSGraphicsContext currentContext] restoreGraphicsState];
|
| -
|
| // Draw the bottom border.
|
| if (!selected) {
|
| [path addClip];
|
| NSRect borderRect, contentRect;
|
| - NSDivideRect(rect, &borderRect, &contentRect, 2.5, NSMinYEdge);
|
| - [[NSColor colorWithDeviceWhite:0.0 alpha:active ? 0.3 : 0.15] set];
|
| + NSDivideRect(rect, &borderRect, &contentRect, 1, NSMinYEdge);
|
| + [[NSColor colorWithCalibratedWhite:0.0 alpha:0.4] set];
|
| NSRectFillUsingOperation(borderRect, NSCompositeSourceOver);
|
| }
|
| [[NSGraphicsContext currentContext] restoreGraphicsState];
|
|
|