Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/cocoa/gradient_button_cell.h" | 5 #include "chrome/browser/cocoa/gradient_button_cell.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #import "base/scoped_nsobject.h" | 8 #import "base/scoped_nsobject.h" |
| 9 #import "chrome/browser/browser_theme_provider.h" | 9 #import "chrome/browser/browser_theme_provider.h" |
| 10 #import "chrome/browser/cocoa/image_utils.h" | 10 #import "chrome/browser/cocoa/image_utils.h" |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 450 NSRect imageRect = NSZeroRect; | 450 NSRect imageRect = NSZeroRect; |
| 451 imageRect.size = [overlayImage_ size]; | 451 imageRect.size = [overlayImage_ size]; |
| 452 [overlayImage_ drawInRect:[self imageRectForBounds:cellFrame] | 452 [overlayImage_ drawInRect:[self imageRectForBounds:cellFrame] |
| 453 fromRect:imageRect | 453 fromRect:imageRect |
| 454 operation:NSCompositeSourceOver | 454 operation:NSCompositeSourceOver |
| 455 fraction:[self isEnabled] ? 1.0 : 0.5 | 455 fraction:[self isEnabled] ? 1.0 : 0.5 |
| 456 neverFlipped:YES]; | 456 neverFlipped:YES]; |
| 457 } | 457 } |
| 458 } | 458 } |
| 459 | 459 |
| 460 // Overriden from NSButtonCell so we can display a nice fadeout effect for | |
| 461 // button titles that overflow. | |
| 462 // TODO(jeremy): Move this to GTM. | |
| 463 - (NSRect)drawTitle:(NSAttributedString *)title | |
| 464 withFrame:(NSRect)cellFrame | |
| 465 inView:(NSView *)controlView { | |
| 466 // This method is copied in the most part from GTMFadeTruncatingTextFieldCell. | |
|
John Grabowski
2010/07/21 17:19:23
Move comment to top of function.
Add brief commen
| |
| 467 NSSize size = [title size]; | |
| 468 | |
| 469 // Don't complicate drawing unless we need to clip | |
| 470 if (size.width <= NSWidth(cellFrame)) { | |
| 471 return [super drawTitle:title withFrame:cellFrame inView:controlView]; | |
| 472 } | |
| 473 | |
| 474 // Gradient is about twice our line height long. | |
| 475 CGFloat gradientWidth = MIN(size.height * 2, NSWidth(cellFrame) / 4); | |
| 476 | |
| 477 NSRect solidPart, gradientPart; | |
| 478 NSDivideRect(cellFrame, &gradientPart, &solidPart, gradientWidth, NSMaxXEdge); | |
| 479 | |
| 480 // Draw non-gradient part without transparency layer, as light text on a dark | |
| 481 // background looks bad with a gradient layer. | |
| 482 [[NSGraphicsContext currentContext] saveGraphicsState]; | |
| 483 [NSBezierPath clipRect:solidPart]; | |
| 484 | |
| 485 // 11 is the magic number needed to make this match the native NSButtonCell's | |
| 486 // label display. | |
| 487 CGFloat textLeft = [[self image] size].width + 11; | |
| 488 | |
| 489 // For some reason, the height of cellFrame as passed in is totally bogus. | |
| 490 // For vertical centering purposes, we need the bounds of the containing | |
| 491 // view. | |
| 492 NSRect buttonFrame = [[self controlView] frame]; | |
| 493 | |
| 494 // Off-by-one to match native NSButtonCell's version. | |
| 495 NSPoint textOffset = NSMakePoint(textLeft, | |
| 496 (NSHeight(buttonFrame) - size.height)/2 + 1); | |
| 497 [title drawAtPoint:textOffset]; | |
| 498 [[NSGraphicsContext currentContext] restoreGraphicsState]; | |
| 499 | |
| 500 // Draw the gradient part with a transparency layer. This makes the text look | |
| 501 // suboptimal, but since it fades out, that's ok. | |
| 502 [[NSGraphicsContext currentContext] saveGraphicsState]; | |
| 503 [NSBezierPath clipRect:gradientPart]; | |
| 504 CGContextRef context = static_cast<CGContextRef>( | |
| 505 [[NSGraphicsContext currentContext] graphicsPort]); | |
| 506 CGContextBeginTransparencyLayerWithRect(context, | |
| 507 NSRectToCGRect(gradientPart), 0); | |
| 508 [title drawAtPoint:textOffset]; | |
| 509 | |
| 510 // TODO(alcor): switch this to GTMLinearRGBShading if we ever need on 10.4 | |
| 511 NSColor *color = [NSColor textColor]; //[self textColor]; | |
| 512 NSColor *alphaColor = [color colorWithAlphaComponent:0.0]; | |
| 513 NSGradient *mask = [[NSGradient alloc] initWithStartingColor:color | |
| 514 endingColor:alphaColor]; | |
| 515 | |
| 516 // Draw the gradient mask | |
| 517 CGContextSetBlendMode(context, kCGBlendModeDestinationIn); | |
| 518 [mask drawFromPoint:NSMakePoint(NSMaxX(cellFrame) - gradientWidth, | |
| 519 NSMinY(cellFrame)) | |
| 520 toPoint:NSMakePoint(NSMaxX(cellFrame), | |
| 521 NSMinY(cellFrame)) | |
| 522 options:NSGradientDrawsBeforeStartingLocation]; | |
| 523 [mask release]; | |
| 524 CGContextEndTransparencyLayer(context); | |
| 525 [[NSGraphicsContext currentContext] restoreGraphicsState]; | |
| 526 | |
| 527 return cellFrame; | |
| 528 } | |
| 529 | |
| 460 - (NSBezierPath*)clipPathForFrame:(NSRect)cellFrame | 530 - (NSBezierPath*)clipPathForFrame:(NSRect)cellFrame |
| 461 inView:(NSView*)controlView { | 531 inView:(NSView*)controlView { |
| 462 NSBezierPath* boundingPath = nil; | 532 NSBezierPath* boundingPath = nil; |
| 463 [self getDrawParamsForFrame:cellFrame | 533 [self getDrawParamsForFrame:cellFrame |
| 464 inView:controlView | 534 inView:controlView |
| 465 innerFrame:NULL | 535 innerFrame:NULL |
| 466 innerPath:NULL | 536 innerPath:NULL |
| 467 clipPath:&boundingPath]; | 537 clipPath:&boundingPath]; |
| 468 return boundingPath; | 538 return boundingPath; |
| 469 } | 539 } |
| 470 | 540 |
| 471 @end | 541 @end |
| OLD | NEW |