mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-05-30 20:50:38 +00:00
Image dimming and gradient drawing added
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@19721 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
1abdf4ed3e
commit
cf5f059c65
1 changed files with 148 additions and 24 deletions
|
@ -41,6 +41,7 @@
|
||||||
|
|
||||||
#include "AppKit/AppKitExceptions.h"
|
#include "AppKit/AppKitExceptions.h"
|
||||||
#include "AppKit/NSApplication.h"
|
#include "AppKit/NSApplication.h"
|
||||||
|
#include "AppKit/NSBezierPath.h"
|
||||||
#include "AppKit/NSButtonCell.h"
|
#include "AppKit/NSButtonCell.h"
|
||||||
#include "AppKit/NSButton.h"
|
#include "AppKit/NSButton.h"
|
||||||
#include "AppKit/NSColor.h"
|
#include "AppKit/NSColor.h"
|
||||||
|
@ -52,6 +53,8 @@
|
||||||
#include "AppKit/NSWindow.h"
|
#include "AppKit/NSWindow.h"
|
||||||
#include "GNUstepGUI/GSDrawFunctions.h"
|
#include "GNUstepGUI/GSDrawFunctions.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
@implementation NSButtonCell
|
@implementation NSButtonCell
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -82,6 +85,8 @@
|
||||||
_keyEquivalentModifierMask = NSCommandKeyMask;
|
_keyEquivalentModifierMask = NSCommandKeyMask;
|
||||||
_keyEquivalent = @"";
|
_keyEquivalent = @"";
|
||||||
_altContents = @"";
|
_altContents = @"";
|
||||||
|
_gradient_type = NSGradientNone;
|
||||||
|
_image_dims_when_disabled = NO;
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -121,12 +126,12 @@
|
||||||
/*
|
/*
|
||||||
* Setting the Titles
|
* Setting the Titles
|
||||||
*/
|
*/
|
||||||
- (NSString*) title
|
- (NSString*) title
|
||||||
{
|
{
|
||||||
return [self stringValue];
|
return [self stringValue];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString*) alternateTitle
|
- (NSString*) alternateTitle
|
||||||
{
|
{
|
||||||
return _altContents;
|
return _altContents;
|
||||||
}
|
}
|
||||||
|
@ -224,7 +229,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setFont: (NSFont*)fontObject
|
- (void) setFont: (NSFont*)fontObject
|
||||||
{
|
{
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
|
@ -401,7 +406,7 @@
|
||||||
/*
|
/*
|
||||||
* Modifying Graphic Attributes
|
* Modifying Graphic Attributes
|
||||||
*/
|
*/
|
||||||
- (BOOL) isTransparent
|
- (BOOL) isTransparent
|
||||||
{
|
{
|
||||||
return _buttoncell_is_transparent;
|
return _buttoncell_is_transparent;
|
||||||
}
|
}
|
||||||
|
@ -416,22 +421,22 @@
|
||||||
return !_buttoncell_is_transparent && _cell.is_bordered;
|
return !_buttoncell_is_transparent && _cell.is_bordered;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSBezelStyle)bezelStyle
|
- (NSBezelStyle) bezelStyle
|
||||||
{
|
{
|
||||||
return _bezel_style;
|
return _bezel_style;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setBezelStyle:(NSBezelStyle)bezelStyle
|
- (void) setBezelStyle: (NSBezelStyle)bezelStyle
|
||||||
{
|
{
|
||||||
_bezel_style = bezelStyle;
|
_bezel_style = bezelStyle;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)showsBorderOnlyWhileMouseInside
|
- (BOOL) showsBorderOnlyWhileMouseInside
|
||||||
{
|
{
|
||||||
return _shows_border_only_while_mouse_inside;
|
return _shows_border_only_while_mouse_inside;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setShowsBorderOnlyWhileMouseInside:(BOOL)show
|
- (void) setShowsBorderOnlyWhileMouseInside: (BOOL)show
|
||||||
{
|
{
|
||||||
if (_shows_border_only_while_mouse_inside == show)
|
if (_shows_border_only_while_mouse_inside == show)
|
||||||
{
|
{
|
||||||
|
@ -442,22 +447,22 @@
|
||||||
// FIXME Switch mouse tracking on
|
// FIXME Switch mouse tracking on
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSGradientType)gradientType
|
- (NSGradientType) gradientType
|
||||||
{
|
{
|
||||||
return _gradient_type;
|
return _gradient_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setGradientType:(NSGradientType)gradientType
|
- (void) setGradientType: (NSGradientType)gradientType
|
||||||
{
|
{
|
||||||
_gradient_type = gradientType;
|
_gradient_type = gradientType;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)imageDimsWhenDisabled
|
- (BOOL) imageDimsWhenDisabled
|
||||||
{
|
{
|
||||||
return _image_dims_when_disabled;
|
return _image_dims_when_disabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setImageDimsWhenDisabled:(BOOL)flag
|
- (void) setImageDimsWhenDisabled:(BOOL)flag
|
||||||
{
|
{
|
||||||
_image_dims_when_disabled = flag;
|
_image_dims_when_disabled = flag;
|
||||||
}
|
}
|
||||||
|
@ -465,17 +470,17 @@
|
||||||
/*
|
/*
|
||||||
* Modifying Graphic Attributes
|
* Modifying Graphic Attributes
|
||||||
*/
|
*/
|
||||||
- (int) highlightsBy
|
- (int) highlightsBy
|
||||||
{
|
{
|
||||||
return _highlightsByMask;
|
return _highlightsByMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setHighlightsBy: (int)mask
|
- (void) setHighlightsBy: (int)mask
|
||||||
{
|
{
|
||||||
_highlightsByMask = mask;
|
_highlightsByMask = mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setShowsStateBy: (int)mask
|
- (void) setShowsStateBy: (int)mask
|
||||||
{
|
{
|
||||||
_showAltStateMask = mask;
|
_showAltStateMask = mask;
|
||||||
}
|
}
|
||||||
|
@ -541,17 +546,17 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (int) showsStateBy
|
- (int) showsStateBy
|
||||||
{
|
{
|
||||||
return _showAltStateMask;
|
return _showAltStateMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setIntValue: (int)anInt
|
- (void) setIntValue: (int)anInt
|
||||||
{
|
{
|
||||||
[self setState: (anInt != 0)];
|
[self setState: (anInt != 0)];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setFloatValue: (float)aFloat
|
- (void) setFloatValue: (float)aFloat
|
||||||
{
|
{
|
||||||
[self setState: (aFloat != 0)];
|
[self setState: (aFloat != 0)];
|
||||||
}
|
}
|
||||||
|
@ -561,22 +566,22 @@
|
||||||
[self setState: (aDouble != 0)];
|
[self setState: (aDouble != 0)];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (int) intValue
|
- (int) intValue
|
||||||
{
|
{
|
||||||
return _cell.state;
|
return _cell.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (float) floatValue
|
- (float) floatValue
|
||||||
{
|
{
|
||||||
return _cell.state;
|
return _cell.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (double) doubleValue
|
- (double) doubleValue
|
||||||
{
|
{
|
||||||
return _cell.state;
|
return _cell.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setObjectValue: (id)object
|
- (void) setObjectValue: (id)object
|
||||||
{
|
{
|
||||||
if (object == nil)
|
if (object == nil)
|
||||||
{
|
{
|
||||||
|
@ -653,6 +658,105 @@
|
||||||
[self drawInteriorWithFrame: cellFrame inView: controlView];
|
[self drawInteriorWithFrame: cellFrame inView: controlView];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) drawGradientWithFrame: (NSRect)cellFrame inView: (NSView *)controlView
|
||||||
|
{
|
||||||
|
float start_white = 0.0;
|
||||||
|
float end_white = 0.0;
|
||||||
|
float white = 0.0;
|
||||||
|
float white_step = 0.0;
|
||||||
|
float h, s, v, a;
|
||||||
|
NSColor *lightGray = nil;
|
||||||
|
NSColor *gray = nil;
|
||||||
|
NSColor *darkGray = nil;
|
||||||
|
NSPoint p1, p2;
|
||||||
|
|
||||||
|
lightGray = [NSColor colorWithDeviceRed:0.83 green:0.83 blue:0.83 alpha:1.0];
|
||||||
|
gray = [NSColor colorWithDeviceRed:0.50 green:0.50 blue:0.50 alpha:1.0];
|
||||||
|
darkGray = [NSColor colorWithDeviceRed:0.32 green:0.32 blue:0.32 alpha:1.0];
|
||||||
|
|
||||||
|
switch (_gradient_type)
|
||||||
|
{
|
||||||
|
case NSGradientNone:
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NSGradientConcaveWeak:
|
||||||
|
[gray getHue: &h saturation: &s brightness: &v alpha: &a];
|
||||||
|
start_white = [lightGray brightnessComponent];
|
||||||
|
end_white = [gray brightnessComponent];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NSGradientConvexWeak:
|
||||||
|
[darkGray getHue: &h saturation: &s brightness: &v alpha: &a];
|
||||||
|
start_white = [gray brightnessComponent];
|
||||||
|
end_white = [lightGray brightnessComponent];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NSGradientConcaveStrong:
|
||||||
|
[lightGray getHue: &h saturation: &s brightness: &v alpha: &a];
|
||||||
|
start_white = [lightGray brightnessComponent];
|
||||||
|
end_white = [darkGray brightnessComponent];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NSGradientConvexStrong:
|
||||||
|
[darkGray getHue: &h saturation: &s brightness: &v alpha: &a];
|
||||||
|
start_white = [darkGray brightnessComponent];
|
||||||
|
end_white = [lightGray brightnessComponent];
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
white = start_white;
|
||||||
|
white_step = fabs(start_white - end_white)/
|
||||||
|
(cellFrame.size.width + cellFrame.size.height);
|
||||||
|
|
||||||
|
// Start from top left
|
||||||
|
p1 = NSMakePoint(cellFrame.origin.x,
|
||||||
|
cellFrame.size.height + cellFrame.origin.y);
|
||||||
|
p2 = NSMakePoint(cellFrame.origin.x,
|
||||||
|
cellFrame.size.height + cellFrame.origin.y);
|
||||||
|
|
||||||
|
// Move by Y
|
||||||
|
while (p1.y > cellFrame.origin.y)
|
||||||
|
{
|
||||||
|
[[NSColor
|
||||||
|
colorWithDeviceHue: h saturation: s brightness: white alpha: 1.0] set];
|
||||||
|
[NSBezierPath strokeLineFromPoint: p1 toPoint: p2];
|
||||||
|
|
||||||
|
if (start_white > end_white)
|
||||||
|
white -= white_step;
|
||||||
|
else
|
||||||
|
white += white_step;
|
||||||
|
|
||||||
|
p1.y -= 1.0;
|
||||||
|
if (p2.x < (cellFrame.size.width + cellFrame.origin.x))
|
||||||
|
p2.x += 1.0;
|
||||||
|
else
|
||||||
|
p2.y -= 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move by X
|
||||||
|
while (p1.x < (cellFrame.size.width + cellFrame.origin.x))
|
||||||
|
{
|
||||||
|
[[NSColor
|
||||||
|
colorWithDeviceHue: h saturation: s brightness: white alpha: 1.0] set];
|
||||||
|
[NSBezierPath strokeLineFromPoint: p1 toPoint: p2];
|
||||||
|
|
||||||
|
if (start_white > end_white)
|
||||||
|
white -= white_step;
|
||||||
|
else
|
||||||
|
white += white_step;
|
||||||
|
|
||||||
|
p1.x += 1.0;
|
||||||
|
if (p2.x >= (cellFrame.size.width + cellFrame.origin.x))
|
||||||
|
p2.y -= 1.0;
|
||||||
|
else
|
||||||
|
p2.x += 1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void) drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView*)controlView
|
- (void) drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView*)controlView
|
||||||
{
|
{
|
||||||
unsigned mask;
|
unsigned mask;
|
||||||
|
@ -877,6 +981,14 @@
|
||||||
// TODO: Add distance from border if needed
|
// TODO: Add distance from border if needed
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Draw gradient
|
||||||
|
if (!_cell.is_highlighted && _gradient_type != NSGradientNone)
|
||||||
|
{
|
||||||
|
[self drawGradientWithFrame: cellFrame inView: controlView];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw image
|
||||||
if (imageToDisplay != nil)
|
if (imageToDisplay != nil)
|
||||||
{
|
{
|
||||||
NSSize size;
|
NSSize size;
|
||||||
|
@ -893,13 +1005,25 @@
|
||||||
{
|
{
|
||||||
position.y += size.height;
|
position.y += size.height;
|
||||||
}
|
}
|
||||||
[imageToDisplay compositeToPoint: position operation: NSCompositeSourceOver];
|
|
||||||
|
if (_cell.is_disabled && _image_dims_when_disabled)
|
||||||
|
{
|
||||||
|
[imageToDisplay dissolveToPoint: position fraction: 0.5];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[imageToDisplay compositeToPoint: position
|
||||||
|
operation: NSCompositeSourceOver];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Draw title
|
||||||
if (titleToDisplay != nil)
|
if (titleToDisplay != nil)
|
||||||
{
|
{
|
||||||
[self _drawAttributedText: titleToDisplay inFrame: titleRect];
|
[self _drawAttributedText: titleToDisplay inFrame: titleRect];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Draw first responder
|
||||||
if (_cell.shows_first_responder
|
if (_cell.shows_first_responder
|
||||||
&& [[controlView window] firstResponder] == controlView)
|
&& [[controlView window] firstResponder] == controlView)
|
||||||
{
|
{
|
||||||
|
@ -907,7 +1031,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSSize) cellSize
|
- (NSSize) cellSize
|
||||||
{
|
{
|
||||||
NSSize s;
|
NSSize s;
|
||||||
NSSize borderSize;
|
NSSize borderSize;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue