* Headers/AppKit/NSImageCell.h:

* Headers/AppKit/NSCell.h: Move NSImageScaling constants to NSCell
* Source/NSImageCell.m:
* Source/NSCell.m: Refactor the image scaling logic to a private
method in NSCell, -_scaleImageWithSize:toFitInSize:scalingType:
which can be share by NSImageCell, NSButtonCell, and any other
cell classes that need it.
* Source/NSButtonCell.m:
* Headers/AppKit/NSButtonCell.h: Implement -imageScaling and
-setImageScaling methods. 
* Source/GSThemeDrawing.m:
* Headers/Additions/GNUstepGUI/GSTheme.h: Remove the
-drawImage:inButtonCell:withFrame:position: API intended
to let themes substitute images right before drawing,
as IMHO it's the wrong place to hook in new images (by
the time this method was caleld, sizing/positionging
was already done).


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@34160 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
ericwa 2011-11-11 23:10:15 +00:00
parent 0f9c9bd394
commit 5eae61ca3e
9 changed files with 202 additions and 119 deletions

View file

@ -106,6 +106,12 @@ typedef struct _GSButtonCellFlags
#endif
} GSButtonCellFlags;
@interface NSCell (Private)
- (NSSize) _scaleImageWithSize: (NSSize)imageSize
toFitInSize: (NSSize)canvasSize
scalingType: (NSImageScaling)scalingType;
@end
/**<p> TODO Description</p>
*/
@implementation NSButtonCell
@ -137,6 +143,7 @@ typedef struct _GSButtonCellFlags
_keyEquivalent = @"";
_altContents = @"";
_gradient_type = NSGradientNone;
[self setImageScaling: NSImageScaleNone];
return self;
}
@ -480,6 +487,16 @@ typedef struct _GSButtonCellFlags
return _cell.image_position;
}
- (NSImageScaling) imageScaling
{
return _imageScaling;
}
- (void) setImageScaling: (NSImageScaling)scaling
{
_imageScaling = scaling;
}
- (void) setImage: (NSImage *)anImage
{
if (_cell.image_position == NSNoImage)
@ -966,14 +983,26 @@ typedef struct _GSButtonCellFlags
// Draw image
if (imageToDisplay != nil)
{
const NSSize size = [imageToDisplay size];
NSSize size = [self _scaleImageWithSize: [imageToDisplay size]
toFitInSize: cellFrame.size
scalingType: _imageScaling];
/* Pixel-align size */
if (controlView)
{
NSSize sizeInBase = [controlView convertSizeToBase: size];
sizeInBase.width = GSRoundTowardsInfinity(sizeInBase.width);
sizeInBase.height = GSRoundTowardsInfinity(sizeInBase.height);
size = [controlView convertSizeFromBase: sizeInBase];
}
/* Calculate an offset from the cellFrame origin */
NSPoint offset = NSMakePoint((NSWidth(cellFrame) - size.width) / 2.0,
(NSHeight(cellFrame) - size.height) / 2.0);
/* Pixel-align the offset */
/* Pixel-align the offset */
if (controlView)
{
@ -993,24 +1022,21 @@ typedef struct _GSButtonCellFlags
offset = [controlView convertPointFromBase: inBase];
}
/*
* Images are always drawn with their bottom-left corner at the origin
* so we must adjust the position to take account of a flipped view.
*/
if ([controlView isFlipped])
{
offset.y += size.height;
}
/* Draw the image */
{
const NSPoint position = NSMakePoint(cellFrame.origin.x + offset.x,
cellFrame.origin.y + offset.y);
[[GSTheme theme] drawImage: imageToDisplay
inButtonCell: self
withFrame: cellFrame
position: position];
}
const NSRect rect = NSMakeRect(cellFrame.origin.x + offset.x,
cellFrame.origin.y + offset.y,
size.width,
size.height);
const CGFloat fraction = (![self isEnabled] &&
[self imageDimsWhenDisabled]) ? 0.5 : 1.0;
[imageToDisplay drawInRect: rect
fromRect: NSZeroRect
operation: NSCompositeSourceOver
fraction: fraction
respectFlipped: YES
hints: nil];
}
}
@ -1642,6 +1668,23 @@ typedef struct _GSButtonCellFlags
bFlags2 |= [self showsBorderOnlyWhileMouseInside] ? 0x8 : 0;
bFlags2 |= (([self bezelStyle] & 0x7) | (([self bezelStyle] & 0x18) << 2));
bFlags2 |= [self keyEquivalentModifierMask] << 8;
switch ([self imageScaling])
{
case NSImageScaleProportionallyDown:
bFlags2 |= (2 << 6);
break;
case NSImageScaleAxesIndependently:
bFlags2 |= (3 << 6);
break;
case NSImageScaleNone:
default:
break;
case NSImageScaleProportionallyUpOrDown:
bFlags2 |= (1 << 6);
break;
}
[aCoder encodeInt: bFlags2 forKey: @"NSButtonFlags2"];
// alternate image encoding...
@ -1793,6 +1836,7 @@ typedef struct _GSButtonCellFlags
}
if ([aDecoder containsValueForKey: @"NSButtonFlags2"])
{
NSUInteger imageScale;
int bFlags2;
bFlags2 = [aDecoder decodeIntForKey: @"NSButtonFlags2"];
@ -1800,6 +1844,24 @@ typedef struct _GSButtonCellFlags
[self setBezelStyle: (bFlags2 & 0x7) | ((bFlags2 & 0x20) >> 2)];
[self setKeyEquivalentModifierMask: ((bFlags2 >> 8) &
NSDeviceIndependentModifierFlagsMask)];
switch (bFlags2 & (3 << 6))
{
case 2:
imageScale = NSImageScaleProportionallyDown;
break;
case 3:
imageScale = NSImageScaleAxesIndependently;
break;
case 0:
default:
imageScale = NSImageScaleNone;
break;
case 1:
imageScale = NSImageScaleProportionallyUpOrDown;
break;
}
[self setImageScaling: imageScale];
}
if ([aDecoder containsValueForKey: @"NSAlternateImage"])
{
@ -1882,6 +1944,8 @@ typedef struct _GSButtonCellFlags
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &tmp];
_shows_border_only_while_mouse_inside = tmp;
}
// Not encoded in non-keyed archive
_imageScaling = NSImageScaleNone;
}
// Hack to correct a Gorm problem, there "\n" is used instead of "\r".