mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-12 19:47:07 +00:00
Added more customizability.
Reviewed by me.
This commit is contained in:
1 parent
8ea3963f62
commit
e4b2988864
9 files changed
+468
-315
No files matched your search
+164
-92
@@ -25,6 +25,7 @@
|
||||
|
||||
@import "CPControl.j"
|
||||
|
||||
#include "CPControl.h"
|
||||
#include "CoreGraphics/CGGeometry.h"
|
||||
|
||||
|
||||
@@ -231,24 +232,33 @@ var _CPButtonClassName = nil,
|
||||
int _tag;
|
||||
int _state;
|
||||
BOOL _allowsMixedState;
|
||||
BOOL _isHighlighted;
|
||||
|
||||
CPImage _image;
|
||||
CPImage _alternateImage;
|
||||
|
||||
CPCellImagePosition _imagePosition;
|
||||
CPImageScaling _imageScaling;
|
||||
|
||||
|
||||
CPString _title;
|
||||
CPString _alternateTitle;
|
||||
|
||||
CPControlStateValue _image;
|
||||
CPControlStateValue _title;
|
||||
|
||||
// Display Properties
|
||||
CPControlStateValue _bezelInset;
|
||||
CPControlStateValue _contentInset;
|
||||
|
||||
CPControlStateValue _bezelColor;
|
||||
|
||||
//
|
||||
CPView _bezelView;
|
||||
_CPImageAndTextView _contentView;
|
||||
|
||||
// NS-style Display Properties
|
||||
CPBezelStyle _bezelStyle;
|
||||
BOOL _isBordered;
|
||||
CPControlSize _controlSize;
|
||||
|
||||
// bleh
|
||||
BOOL _bezelBorderNeedsUpdate;
|
||||
|
||||
_CPImageAndTextView _imageAndTextView;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -326,6 +336,14 @@ var _CPButtonClassName = nil,
|
||||
|
||||
if (self)
|
||||
{
|
||||
_bezelInset = [[CPControlStateValue alloc] initWithDefaultValue:_CGInsetMakeZero()];
|
||||
_contentInset = [[CPControlStateValue alloc] initWithDefaultValue:_CGInsetMakeZero()];
|
||||
|
||||
_bezelColor = [[CPControlStateValue alloc] initWithDefaultValue:nil];
|
||||
|
||||
// _image = [[CPControlStateValue alloc] initWithDefaultValue:nil];
|
||||
// _title = [[CPControlStateValue alloc] initWithDefaultValue:nil];
|
||||
|
||||
[self setAlignment:CPCenterTextAlignment];
|
||||
[self setVerticalAlignment:CPCenterVerticalTextAlignment];
|
||||
[self setImagePosition:CPImageLeft];
|
||||
@@ -340,50 +358,6 @@ var _CPButtonClassName = nil,
|
||||
return self;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the position of the button's image to <code>anImagePosition</code>.
|
||||
@param anImagePosition the position for the button's image
|
||||
*/
|
||||
- (void)setImagePosition:(CPCellImagePosition)anImagePosition
|
||||
{
|
||||
[super setImagePosition:anImagePosition];
|
||||
|
||||
[_imageAndTextView setImagePosition:[self imagePosition]];
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the button's images scaling method
|
||||
@param anImageScaling the image scaling method
|
||||
*/
|
||||
- (void)setImageScaling:(CPImageScaling)anImageScaling
|
||||
{
|
||||
[super setImageScaling:anImageScaling];
|
||||
|
||||
[_imageAndTextView setImageScaling:[self imageScaling]];
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the color of the button's text
|
||||
@param aColor the color to use for drawing the button text
|
||||
*/
|
||||
- (void)setTextColor:(CPColor)aColor
|
||||
{
|
||||
[super setTextColor:aColor];
|
||||
|
||||
[_imageAndTextView setTextColor:[self textColor]];
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the font that will be used to draw the button text
|
||||
@param aFont the font used to draw the button text
|
||||
*/
|
||||
- (void)setFont:(CPFont)aFont
|
||||
{
|
||||
[super setFont:aFont];
|
||||
|
||||
[_imageAndTextView setFont:[self font]];
|
||||
}
|
||||
|
||||
// Setting the state
|
||||
/*!
|
||||
Returns <code>YES</code> if the button has a 'mixed' state in addition to on and off.
|
||||
@@ -431,17 +405,6 @@ var _CPButtonClassName = nil,
|
||||
return _state;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the alignment of the text on the button.
|
||||
@param anAlignment an alignment object
|
||||
*/
|
||||
- (void)setAlignment:(CPTextAlignment)anAlignment
|
||||
{
|
||||
[super setAlignment:anAlignment];
|
||||
|
||||
[_imageAndTextView setAlignment:[self alignment]];
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the image that will be drawn on the button.
|
||||
@param anImage the image that will be drawn
|
||||
@@ -507,7 +470,7 @@ var _CPButtonClassName = nil,
|
||||
Lays out the button.
|
||||
*/
|
||||
- (void)tile
|
||||
{
|
||||
{return;
|
||||
var size = [self bounds].size;
|
||||
|
||||
if (_isBordered)
|
||||
@@ -559,34 +522,19 @@ var _CPButtonClassName = nil,
|
||||
return bounds;
|
||||
}
|
||||
|
||||
- (void)drawRect:(CGRect)aRect
|
||||
{
|
||||
if (!_imageAndTextView)
|
||||
{
|
||||
_imageAndTextView = [[_CPImageAndTextView alloc] initWithFrame:[self contentRectForBounds:[self bounds]] control:self];
|
||||
|
||||
[self addSubview:_imageAndTextView];
|
||||
}
|
||||
else
|
||||
[_imageAndTextView setFrame:[self contentRectForBounds:[self bounds]]];
|
||||
|
||||
[_imageAndTextView setText:_isHighlighted && _alternateTitle ? _alternateTitle : _title];
|
||||
[_imageAndTextView setImage:_isHighlighted && _alternateImage ? _alternateImage : _image];
|
||||
}
|
||||
|
||||
/*!
|
||||
Compacts the button's frame to fit its contents.
|
||||
*/
|
||||
- (void)sizeToFit
|
||||
{ if (!_imageAndTextView)
|
||||
{return; if (!_imageAndTextView)
|
||||
{
|
||||
_imageAndTextView = [[_CPImageAndTextView alloc] initWithFrame:[self contentRectForBounds:[self bounds]] control:self];
|
||||
|
||||
[self addSubview:_imageAndTextView];
|
||||
}
|
||||
|
||||
[_imageAndTextView setText:_isHighlighted && _alternateTitle ? _alternateTitle : _title];
|
||||
[_imageAndTextView setImage:_isHighlighted && _alternateImage ? _alternateImage : _image];
|
||||
[_imageAndTextView setText:[self isHighlighted] && _alternateTitle ? _alternateTitle : _title];
|
||||
[_imageAndTextView setImage:[self isHighlighted] && _alternateImage ? _alternateImage : _image];
|
||||
|
||||
[_imageAndTextView sizeToFit];
|
||||
|
||||
@@ -610,10 +558,9 @@ var _CPButtonClassName = nil,
|
||||
*/
|
||||
- (void)highlight:(BOOL)aFlag
|
||||
{
|
||||
_isHighlighted = aFlag;
|
||||
[super highlight:aFlag];
|
||||
|
||||
[self drawBezelWithHighlight:aFlag];
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -658,7 +605,7 @@ var _CPButtonClassName = nil,
|
||||
|
||||
_controlSize = aControlSize;
|
||||
|
||||
[self drawBezelWithHighlight:_isHighlighted];
|
||||
[self drawBezelWithHighlight:[self isHighlighted]];
|
||||
[self _updateTextAttributes];
|
||||
}
|
||||
|
||||
@@ -682,7 +629,7 @@ var _CPButtonClassName = nil,
|
||||
_isBordered = isBordered;
|
||||
|
||||
[self updateBackgroundColors];
|
||||
[self drawBezelWithHighlight:_isHighlighted];
|
||||
[self drawBezelWithHighlight:[self isHighlighted]];
|
||||
|
||||
[self tile];
|
||||
}
|
||||
@@ -723,7 +670,7 @@ var _CPButtonClassName = nil,
|
||||
_bezelStyle = aBezelStyle;
|
||||
|
||||
[self updateBackgroundColors];
|
||||
[self drawBezelWithHighlight:_isHighlighted];
|
||||
[self drawBezelWithHighlight:[self isHighlighted]];
|
||||
|
||||
[self _updateTextAttributes];
|
||||
[self tile];
|
||||
@@ -739,7 +686,7 @@ var _CPButtonClassName = nil,
|
||||
|
||||
/* @ignore */
|
||||
- (void)updateBackgroundColors
|
||||
{
|
||||
{return;
|
||||
if (_isBordered)
|
||||
{
|
||||
[self setBackgroundColor:_CPControlThreePartImagePattern(
|
||||
@@ -766,7 +713,7 @@ var _CPButtonClassName = nil,
|
||||
|
||||
/* @ignore */
|
||||
- (void)drawBezelWithHighlight:(BOOL)shouldHighlight
|
||||
{
|
||||
{ return;
|
||||
_bezelBorderNeedsUpdate = ![self window];
|
||||
|
||||
if (_bezelBorderNeedsUpdate)
|
||||
@@ -778,12 +725,12 @@ var _CPButtonClassName = nil,
|
||||
- (void)viewDidMoveToWindow
|
||||
{
|
||||
if (_bezelBorderNeedsUpdate)
|
||||
[self drawBezelWithHighlight:_isHighlighted];
|
||||
[self drawBezelWithHighlight:[self isHighlighted]];
|
||||
}
|
||||
|
||||
/* @ignore */
|
||||
- (void)_updateTextAttributes
|
||||
{
|
||||
{return;
|
||||
if (_bezelStyle == CPHUDBezelStyle)
|
||||
[self setTextColor:CPHUDBezelStyleTextColor];
|
||||
|
||||
@@ -791,6 +738,131 @@ var _CPButtonClassName = nil,
|
||||
[self setFont:[CPFont systemFontOfSize:11.0]];
|
||||
}
|
||||
|
||||
// NEW
|
||||
|
||||
- (CPView)createBezelView
|
||||
{
|
||||
var view = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
|
||||
|
||||
[view setHitTests:NO];
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
CONTROL_STATE_VALUE(BezelColor, bezelColor)
|
||||
|
||||
- (CPView)createContentView
|
||||
{
|
||||
var view = [[_CPImageAndTextView alloc] initWithFrame:_CGRectMakeZero()];
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
CONTROL_STATE_VALUE(ContentInset, contentInset)
|
||||
CONTROL_STATE_VALUE(BezelInset, bezelInset)
|
||||
|
||||
- (CGRect)contentRectForBounds:(CGRect)bounds
|
||||
{
|
||||
var contentInset = [self contentInset];
|
||||
|
||||
if (!contentInset)
|
||||
return bounds;
|
||||
|
||||
bounds.origin.x += contentInset.left;
|
||||
bounds.origin.y += contentInset.top;
|
||||
bounds.size.width -= contentInset.left + contentInset.right;
|
||||
bounds.size.height -= contentInset.top + contentInset.bottom;
|
||||
|
||||
return bounds;
|
||||
}
|
||||
|
||||
- (CGRect)bezelRectForBounds:(CFRect)bounds
|
||||
{
|
||||
var bezelInset = [self bezelInset];
|
||||
|
||||
if (!_CGInsetIsEmpty(bezelInset))
|
||||
return bounds;
|
||||
|
||||
bounds.origin.x += bezelInset.left;
|
||||
bounds.origin.y += bezelInset.top;
|
||||
bounds.size.width -= bezelInset.left + bezelInset.right;
|
||||
bounds.size.height -= bezelInset.top + bezelInset.bottom;
|
||||
|
||||
return bounds;
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
var bounds = [self bounds],
|
||||
bezelRect = [self bezelRectForBounds:_CGRectMakeCopy(bounds)];
|
||||
|
||||
if (bezelRect && !_CGRectIsEmpty(bezelRect))
|
||||
{
|
||||
if (!_bezelView)
|
||||
{
|
||||
_bezelView = [self createBezelView];
|
||||
|
||||
if (_bezelView)
|
||||
[self addSubview:_bezelView positioned:CPWindowBelow relativeTo:_contentView];
|
||||
}
|
||||
|
||||
if (_bezelView)
|
||||
[_bezelView setFrame:bezelRect];
|
||||
}
|
||||
else if (_bezelView)
|
||||
{
|
||||
[_bezelView removeFromSuperview];
|
||||
|
||||
_bezelView = nil;
|
||||
}
|
||||
|
||||
if (_bezelView)
|
||||
{
|
||||
[_bezelView setBackgroundColor:[self bezelColor]];
|
||||
}
|
||||
|
||||
var contentRect = [self contentRectForBounds:bounds];
|
||||
|
||||
if (contentRect && !_CGRectIsEmpty(contentRect))
|
||||
{
|
||||
if (!_contentView)
|
||||
{
|
||||
_contentView = [self createContentView];
|
||||
|
||||
if (_contentView)
|
||||
[self addSubview:_contentView positioned:CPWindowAbove relativeTo:_bezelView];
|
||||
}
|
||||
|
||||
if (_contentView)
|
||||
[_contentView setFrame:contentRect];
|
||||
}
|
||||
else if (_contentView)
|
||||
{
|
||||
[_contentView removeFromSuperview];
|
||||
|
||||
_contentView = nil;
|
||||
}
|
||||
|
||||
if (_contentView)
|
||||
{
|
||||
[_contentView setText:[self isHighlighted] && _alternateTitle ? _alternateTitle : _title];
|
||||
[_contentView setImage:[self isHighlighted] && _alternateImage ? _alternateImage : _image];
|
||||
|
||||
// [_imageAndTextView setText:[self titleForControlState:_title]];
|
||||
// [_imageAndTextView setImage:[self imageForControlState:_controlState]];
|
||||
|
||||
[_contentView setFont:[self font]];
|
||||
[_contentView setTextColor:[self textColor]];
|
||||
[_contentView setAlignment:[self alignment]];
|
||||
[_contentView setVerticalAlignment:[self verticalAlignment]];
|
||||
[_contentView setLineBreakMode:[self lineBreakMode]];
|
||||
[_contentView setTextShadowColor:[self textShadowColor]];
|
||||
[_contentView setTextShadowOffset:[self textShadowOffset]];
|
||||
[_contentView setImagePosition:[self imagePosition]];
|
||||
[_contentView setImageScaling:[self imageScaling]];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -844,8 +916,8 @@ var CPButtonImageKey = @"CPButtonImageKey",
|
||||
// should just automatically be created programmatically as needed.
|
||||
var actualSubviews = _subviews;
|
||||
|
||||
_subviews = [_subviews copy];
|
||||
[_subviews removeObjectIdenticalTo:_imageAndTextView];
|
||||
// _subviews = [_subviews copy];
|
||||
// [_subviews removeObjectIdenticalTo:_imageAndTextView];
|
||||
|
||||
[super encodeWithCoder:aCoder];
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
#define CONTROL_STATE_VALUE(VALUE, LOWERCASEVALUE) \
|
||||
- (void)set##VALUE:(id)aValue forControlState:(CPControlState)aControlState\
|
||||
{\
|
||||
var currentValue = [_##LOWERCASEVALUE valueForControlState:_controlState];\
|
||||
[_##LOWERCASEVALUE setValue:aValue forControlState:aControlState];\
|
||||
if ([_##LOWERCASEVALUE valueForControlState:_controlState] === currentValue)\
|
||||
return;\
|
||||
[self setNeedsDisplay:YES];\
|
||||
[self setNeedsLayout];\
|
||||
}\
|
||||
- (id)LOWERCASEVALUE##ForControlState:(CPControlState)aControlState\
|
||||
{\
|
||||
return [_##LOWERCASEVALUE valueForControlState:aControlState];\
|
||||
}\
|
||||
- (void)set##VALUE:(id)aValue\
|
||||
{\
|
||||
var currentValue = [_##LOWERCASEVALUE valueForControlState:_controlState];\
|
||||
[_##LOWERCASEVALUE setValue:aValue];\
|
||||
if ([_##LOWERCASEVALUE valueForControlState:_controlState] === currentValue)\
|
||||
return;\
|
||||
[self setNeedsDisplay:YES];\
|
||||
[self setNeedsLayout];\
|
||||
}\
|
||||
- (id)LOWERCASEVALUE\
|
||||
{\
|
||||
return [_##LOWERCASEVALUE valueForControlState:_controlState];\
|
||||
}
|
||||
+245
-173
@@ -87,18 +87,6 @@ var CPControlBlackColor = [CPColor blackColor];
|
||||
@implementation CPControl : CPView
|
||||
{
|
||||
id _value;
|
||||
BOOL _isEnabled;
|
||||
|
||||
// Display Properties
|
||||
CPTextAlignment _alignment;
|
||||
CPVerticalTextAlignment _verticalAlignment;
|
||||
|
||||
CPLineBreakMode _lineBreakMode;
|
||||
CPColor _textColor;
|
||||
CPFont _font;
|
||||
|
||||
CPCellImagePosition _imagePosition;
|
||||
CPImageScaling _imageScaling;
|
||||
|
||||
// Target-Action Support
|
||||
id _target;
|
||||
@@ -116,6 +104,22 @@ var CPControlBlackColor = [CPColor blackColor];
|
||||
|
||||
CPDictionary _backgroundColors;
|
||||
CPString _currentBackgroundColorName;
|
||||
|
||||
// Properties
|
||||
CPControlStateValue _alignment;
|
||||
CPControlStateValue _verticalAlignment;
|
||||
|
||||
CPControlStateValue _lineBreakMode;
|
||||
CPControlStateValue _textColor;
|
||||
CPControlStateValue _font;
|
||||
|
||||
CPControlStateValue _textShadowColor;
|
||||
CPControlStateValue _textShadowOffset;
|
||||
|
||||
CPControlStateValue _imagePosition;
|
||||
CPControlStateValue _imageScaling;
|
||||
|
||||
CPControlState _controlState;
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)aFrame
|
||||
@@ -124,16 +128,28 @@ var CPControlBlackColor = [CPColor blackColor];
|
||||
|
||||
if (self)
|
||||
{
|
||||
[self setVerticalAlignment:CPTopVerticalTextAlignment];
|
||||
_controlState = CPControlStateNormal;
|
||||
|
||||
_alignment = [[CPControlStateValue alloc] initWithDefaultValue:CPLeftTextAlignment];
|
||||
_verticalAlignment = [[CPControlStateValue alloc] initWithDefaultValue:CPTopVerticalTextAlignment];
|
||||
|
||||
_lineBreakMode = [[CPControlStateValue alloc] initWithDefaultValue:CPLeftTextAlignment];
|
||||
_textColor = [[CPControlStateValue alloc] initWithDefaultValue:[CPColor blackColor]];
|
||||
_font = [[CPControlStateValue alloc] initWithDefaultValue:[CPFont systemFontOfSize:12.0]];
|
||||
|
||||
_textShadowColor = [[CPControlStateValue alloc] initWithDefaultValue:nil];
|
||||
_textShadowOffset = [[CPControlStateValue alloc] initWithDefaultValue:CGSizeMake(0.0, 0.0)];;
|
||||
|
||||
_imagePosition = [[CPControlStateValue alloc] initWithDefaultValue:CPImageLeft];
|
||||
_imageScaling = [[CPControlStateValue alloc] initWithDefaultValue:CPScaleToFit];
|
||||
|
||||
//
|
||||
|
||||
_sendActionOn = CPLeftMouseUpMask;
|
||||
_trackingMouseDownFlags = 0;
|
||||
|
||||
_isEnabled = YES;
|
||||
|
||||
[self setFont:[CPFont systemFontOfSize:12.0]];
|
||||
[self setTextColor:CPControlBlackColor];
|
||||
|
||||
_backgroundColors = [CPDictionary dictionary];
|
||||
}
|
||||
|
||||
@@ -157,163 +173,6 @@ var CPControlBlackColor = [CPColor blackColor];
|
||||
return _isEnabled;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the receiver's horizontal text alignment
|
||||
@param anAlignment the receiver's alignment
|
||||
*/
|
||||
- (void)setAlignment:(CPTextAlignment)anAlignment
|
||||
{
|
||||
_alignment = anAlignment;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the receiver's horizontal text alignment
|
||||
*/
|
||||
- (CPTextAlignment)alignment
|
||||
{
|
||||
return _alignment;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the receiver's vertical text alignment
|
||||
@param anAlignment the receiver's alignment
|
||||
*/
|
||||
- (void)setVerticalAlignment:(CPVerticalTextAlignment)anAlignment
|
||||
{
|
||||
_verticalAlignment = anAlignment;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the receiver's vertical text alignment
|
||||
*/
|
||||
- (CPVerticalTextAlignment)verticalAlignment
|
||||
{
|
||||
return _verticalAlignment;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the receiver's line break mode.
|
||||
@param anAlignment the receiver's line break mode.
|
||||
*/
|
||||
- (void)setLineBreakMode:(CPLineBreakMode)aLineBreakMode
|
||||
{
|
||||
_lineBreakMode = aLineBreakMode;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the receiver's line break mode.
|
||||
*/
|
||||
- (CPLineBreakMode)lineBreakMode
|
||||
{
|
||||
return _lineBreakMode;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the color of the receiver's text.
|
||||
*/
|
||||
- (void)setTextColor:(CPColor)aColor
|
||||
{
|
||||
if (_textColor == aColor)
|
||||
return;
|
||||
|
||||
_textColor = aColor;
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
_DOMElement.style.color = [aColor cssString];
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the color of the receiver's text
|
||||
*/
|
||||
- (CPColor)textColor
|
||||
{
|
||||
return _textColor;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the receiver's font
|
||||
@param aFont the font for the receiver
|
||||
*/
|
||||
- (void)setFont:(CPFont)aFont
|
||||
{
|
||||
if (_font == aFont)
|
||||
return;
|
||||
|
||||
_font = aFont;
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
_DOMElement.style.font = [_font ? _font : [CPFont systemFontOfSize:12.0] cssString];
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the receiver's font
|
||||
*/
|
||||
- (CPFont)font
|
||||
{
|
||||
return _font;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the position of the button's image to <code>anImagePosition</code>.
|
||||
@param anImagePosition the position for the button's image
|
||||
*/
|
||||
- (void)setImagePosition:(CPCellImagePosition)anImagePosition
|
||||
{
|
||||
if (_imagePosition === anImagePosition)
|
||||
return;
|
||||
|
||||
_imagePosition = anImagePosition;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the buton's image position
|
||||
*/
|
||||
- (CPCellImagePosition)imagePosition
|
||||
{
|
||||
return _imagePosition;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the button's images scaling method
|
||||
@param anImageScaling the image scaling method
|
||||
*/
|
||||
- (void)setImageScaling:(CPImageScaling)anImageScaling
|
||||
{
|
||||
if (_imageScaling === anImageScaling)
|
||||
return;
|
||||
|
||||
_imageScaling = anImageScaling;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the button's image scaling method
|
||||
*/
|
||||
- (CPImageScaling)imageScaling
|
||||
{
|
||||
return _imageScaling;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the shadow for the receiver's text.
|
||||
@param aTextShadow the text shadow
|
||||
*/
|
||||
- (void)setTextShadow:(CPShadow)aTextShadow
|
||||
{
|
||||
#if PLATFORM(DOM)
|
||||
_DOMElement.style.textShadow = [_textShadow = aTextShadow cssString];
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the receiver's text shadow
|
||||
*/
|
||||
- (CPShadow)textShadow
|
||||
{
|
||||
return _textShadow;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the receiver's target action
|
||||
*/
|
||||
@@ -713,6 +572,8 @@ var __Deprecated__CPImageViewImageKey = @"CPImageViewImageKey";
|
||||
|
||||
if (self)
|
||||
{
|
||||
_controlState = CPControlStateNormal;
|
||||
|
||||
[self setObjectValue:[aCoder decodeObjectForKey:CPControlValueKey]];
|
||||
|
||||
if ([aCoder containsValueForKey:__Deprecated__CPImageViewImageKey])
|
||||
@@ -856,3 +717,214 @@ function _CPControlThreePartImagePattern(isVertical, sizes, aClassName)
|
||||
return color;
|
||||
}
|
||||
|
||||
///
|
||||
|
||||
#include "CPControl.h"
|
||||
|
||||
@implementation CPControl (BETTER)
|
||||
|
||||
CONTROL_STATE_VALUE(Alignment, alignment)
|
||||
CONTROL_STATE_VALUE(VerticalAlignment, verticalAlignment)
|
||||
CONTROL_STATE_VALUE(LineBreakMode, lineBreakMode)
|
||||
CONTROL_STATE_VALUE(TextColor, textColor)
|
||||
CONTROL_STATE_VALUE(Font, font)
|
||||
CONTROL_STATE_VALUE(TextShadowColor, textShadowColor)
|
||||
CONTROL_STATE_VALUE(TextShadowOffset, textShadowOffset)
|
||||
CONTROL_STATE_VALUE(ImagePosition, imagePosition)
|
||||
CONTROL_STATE_VALUE(ImageScaling, imageScaling)
|
||||
|
||||
- (int)controlState
|
||||
{
|
||||
return _controlState;
|
||||
}
|
||||
|
||||
- (void)setEnabled:(BOOL)isEnabled
|
||||
{
|
||||
if ((!(_controlState & CPControlStateDisabled)) === isEnabled)
|
||||
return;
|
||||
|
||||
if (isEnabled)
|
||||
_controlState &= ~CPControlStateDisabled;
|
||||
else
|
||||
_controlState |= CPControlStateDisabled;
|
||||
|
||||
[self setNeedsLayout];
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
- (BOOL)isEnabled
|
||||
{
|
||||
return !(_controlState & CPControlStateDisabled);
|
||||
}
|
||||
|
||||
- (void)highlight:(BOOL)shouldHighlight
|
||||
{
|
||||
[self setHighlighted:shouldHighlight];
|
||||
}
|
||||
|
||||
- (void)setHighlighted:(BOOL)isHighlighted
|
||||
{
|
||||
if ((!!(_controlState & CPControlStateHighlighted)) === isHighlighted)
|
||||
return;
|
||||
|
||||
if (isHighlighted)
|
||||
_controlState |= CPControlStateHighlighted;
|
||||
else
|
||||
_controlState &= ~CPControlStateHighlighted;
|
||||
|
||||
[self setNeedsLayout];
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
- (BOOL)isHighlighted
|
||||
{
|
||||
return !!(_controlState & CPControlStateHighlighted);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
CPControlStateNormal = 0,
|
||||
CPControlStateHighlighted = 1 << 0,
|
||||
CPControlStateDisabled = 1 << 1,
|
||||
CPControlStateSelected = 1 << 2,
|
||||
CPControlStateDefault = 1 << 3;
|
||||
|
||||
@implementation CPControlStateValue : CPObject
|
||||
{
|
||||
id _defaultValue;
|
||||
JSObject _values;
|
||||
int _highestState;
|
||||
}
|
||||
|
||||
- (id)initWithDefaultValue:(id)aDefaultValue
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
if (self)
|
||||
{
|
||||
_defaultValue = aDefaultValue;
|
||||
_values = {};
|
||||
_highestState = 0;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)setDefaultValue:(id)aDefaultValue
|
||||
{
|
||||
_defaultValue = aDefaultValue;
|
||||
}
|
||||
|
||||
- (id)valueForControlState:(CPControlState)aState
|
||||
{
|
||||
var value = _values[aState];
|
||||
|
||||
// If we don't have a value, and we have a non-normal state...
|
||||
if (value === undefined && aState > 0)
|
||||
{
|
||||
// If this is a composite state, retrieve what we can.
|
||||
if (!(aState & (aState - 1)))
|
||||
{
|
||||
var state = 1;
|
||||
|
||||
while (value === undefined && state < _highestState)
|
||||
{
|
||||
if (state & aState)
|
||||
value = _values[state];
|
||||
|
||||
state << 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Still don't have a value? OK, let's use the normal value.
|
||||
if (value === undefined && aState > 0)
|
||||
value = _values[CPControlStateNormal];
|
||||
}
|
||||
|
||||
return value || _defaultValue;
|
||||
}
|
||||
|
||||
- (void)setValue:(id)aValue
|
||||
{
|
||||
_values = {};
|
||||
_values[CPControlStateNormal] = aValue;
|
||||
_highestState = CPControlStateNormal;
|
||||
}
|
||||
|
||||
- (void)setValue:(id)aValue forControlState:(CPControlState)aState
|
||||
{
|
||||
if (_highestState < aState)
|
||||
_highestState = aState;
|
||||
|
||||
_values[aState] = aValue;
|
||||
}
|
||||
|
||||
- (void)removeValueForControlState:(CPControlState)aState
|
||||
{
|
||||
delete _values[aState];
|
||||
|
||||
// if (_highestState === aState)
|
||||
// _highestState = nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
var CPControlStateValueStates = @"CPControlStateValueStates",
|
||||
CPControlStateValueValues = @"CPControlStateValueValues";
|
||||
|
||||
@implementation CPControlStateValue (CPCoding)
|
||||
|
||||
- (id)initWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
if (self)
|
||||
{
|
||||
_values = {};
|
||||
_highestState = 0;
|
||||
|
||||
var states = [aCoder decodeObjectForKey:CPControlStateValueStates];
|
||||
|
||||
if (states)
|
||||
{
|
||||
var values = [aCoder decodeObjectForKey:CPControlStateValueValues],
|
||||
count = states.length;
|
||||
|
||||
while (count--)
|
||||
{
|
||||
var state = states[count];
|
||||
|
||||
if (state > _highestState)
|
||||
_highestState = state;
|
||||
|
||||
_values[state] = values[count];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
var states = [],
|
||||
values = [];
|
||||
|
||||
for (state in _values)
|
||||
{
|
||||
if (!_values.hasOwnProperty(state))
|
||||
continue;
|
||||
|
||||
states.push(state);
|
||||
values.push(_values[state]);
|
||||
}
|
||||
|
||||
if (states.length)
|
||||
{
|
||||
[aCoder encodeObject:states forKey:CPControlStateValueStates];
|
||||
[aCoder encodeObject:values forKey:CPControlStateValueValues];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
+14
-45
@@ -2,6 +2,7 @@
|
||||
@import <AppKit/CPControl.j>
|
||||
|
||||
#include "CoreGraphics/CGGeometry.h"
|
||||
#include "CPControl.h"
|
||||
|
||||
|
||||
@implementation CPSlider : CPControl
|
||||
@@ -13,14 +14,11 @@
|
||||
CPColor _verticalTrackColor; // vertical-track-color
|
||||
CPColor _horizontalTrackColor; // horizontal-track-color
|
||||
|
||||
CPColor _knobColor; // knob-color
|
||||
CPColor _highlightedKnobColor; // knob-color-highlighted
|
||||
CPControlStateValue _knobColor;
|
||||
|
||||
float _trackWidth; // track-width
|
||||
CGSize _knobSize; // knob-size
|
||||
|
||||
BOOL _isHighlighted;
|
||||
|
||||
CPView _trackView;
|
||||
CPView _knobView;
|
||||
}
|
||||
@@ -33,6 +31,8 @@
|
||||
{
|
||||
_minValue = 0.0;
|
||||
_maxValue = 100.0;
|
||||
|
||||
_knobColor = [[CPControlStateValue alloc] initWithDefaultValue:nil];
|
||||
|
||||
[self setObjectValue:50.0];
|
||||
|
||||
@@ -155,19 +155,6 @@
|
||||
return bounds;
|
||||
}
|
||||
|
||||
- (void)setHighlightedKnobColor:(CPColor)aColor
|
||||
{
|
||||
if (_highlightedKnobColor === aColor)
|
||||
_highlightedKnobColor = aColor;
|
||||
|
||||
_highlightedKnobColor = aColor;
|
||||
}
|
||||
|
||||
- (CPColor)highlightedKnobColor
|
||||
{
|
||||
return _highlightedKnobColor;
|
||||
}
|
||||
|
||||
- (void)setKnobSize:(CGSize)aKnobSize
|
||||
{
|
||||
if (_knobSize && (!aKnobSize || _CGSizeEqualToSize(_knobSize, aKnobSize)))
|
||||
@@ -179,21 +166,7 @@
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
- (void)setKnobColor:(CPColor)aColor
|
||||
{
|
||||
if (_knobColor === aColor)
|
||||
return;
|
||||
|
||||
_knobColor = aColor;
|
||||
|
||||
[self setNeedsLayout];
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
- (CPColor)knobColor
|
||||
{
|
||||
return _knobColor;
|
||||
}
|
||||
CONTROL_STATE_VALUE(KnobColor, knobColor)
|
||||
|
||||
- (CGRect)knobRectForBounds:(CGRect)bounds
|
||||
{
|
||||
@@ -303,13 +276,10 @@
|
||||
{
|
||||
[_knobView setFrame:knobRect];
|
||||
|
||||
if (_isHighlighted)
|
||||
{
|
||||
if (_highlightedKnobColor)
|
||||
[_knobView setBackgroundColor:_highlightedKnobColor];
|
||||
}
|
||||
else if (_knobColor)
|
||||
[_knobView setBackgroundColor:_knobColor];
|
||||
var knobColor = [self knobColor];
|
||||
|
||||
if (knobColor)
|
||||
[_knobView setBackgroundColor:knobColor];
|
||||
}
|
||||
}
|
||||
else if (_knobView)
|
||||
@@ -377,7 +347,7 @@
|
||||
return NO;
|
||||
}
|
||||
|
||||
_isHighlighted = YES;
|
||||
[self setHighlighted:YES];
|
||||
|
||||
[self setNeedsLayout];
|
||||
[self setNeedsDisplay:YES];
|
||||
@@ -394,7 +364,7 @@
|
||||
|
||||
- (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp
|
||||
{
|
||||
_isHighlighted = NO;
|
||||
[self setHighlighted:NO];
|
||||
|
||||
if ([_target respondsToSelector:@selector(sliderDidFinish:)])
|
||||
[_target sliderDidFinish:self];
|
||||
@@ -427,10 +397,10 @@
|
||||
|
||||
if (!theme)
|
||||
return;
|
||||
|
||||
|
||||
//_knobColor = [theme valueForKey:@"knob-color"];
|
||||
|
||||
[self setKnobSize:[theme valueForKey:@"knob-size"]];
|
||||
[self setKnobColor:[theme valueForKey:@"knob-color"]];
|
||||
[self setHighlightedKnobColor:[theme valueForKey:@"knob-color-highlighted"]];
|
||||
|
||||
[self setTrackWidth:[theme valueForKey:@"track-width"]];
|
||||
[self setHorizontalTrackColor:[theme valueForKey:@"horizontal-track-color"]];
|
||||
@@ -446,7 +416,6 @@
|
||||
|
||||
[values setObject:_knobSize forKey:@"knob-size"];
|
||||
[values setObject:_knobColor forKey:@"knob-color"];
|
||||
[values setObject:_highlightedKnobColor forKey:@"knob-color-highlighted"];
|
||||
[values setObject:_trackWidth forKey:@"track-width"];
|
||||
[values setObject:_verticalTrackColor forKey:@"vertical-track-color"];
|
||||
[values setObject:_horizontalTrackColor forKey:@"horizontal-track-color"];
|
||||
|
||||
@@ -59,6 +59,11 @@
|
||||
|
||||
#define _CGRectContainsPoint(aRect, aPoint) (aPoint.x >= _CGRectGetMinX(aRect) && aPoint.y >= _CGRectGetMinY(aRect) && aPoint.x < _CGRectGetMaxX(aRect) && aPoint.y < _CGRectGetMaxY(aRect))
|
||||
|
||||
#define _CGInsetMake(_top, _left, _bottom, _right) { top:(_top), left:(_left), bottom:(_bottom), right:(_right) }
|
||||
#define _CGInsetMakeCopy(anInset) _CGInsetMake(anInset.top, anInset.left, anInset.bottom, anInset.right)
|
||||
#define _CGInsetMakeZero() _CGInsetMake(0, 0, 0, 0)
|
||||
#define _CGInsetIsEmpty(anInset) ((anInset).left === 0 && (anInset).top === 0 && (anInset).right === 0 && (anInset).bottom === 0)
|
||||
|
||||
// DEPRECATED
|
||||
#define _CGPointCreateCopy(aPoint) _CGPointMake(aPoint.x, aPoint.y)
|
||||
#define _CGSizeCreateCopy(aSize) _CGSizeMake(aSize.width, aSize.height)
|
||||
@@ -65,6 +65,10 @@ _function(CGRectIsNull(aRect))
|
||||
|
||||
_function(CGRectContainsPoint(aRect, aPoint))
|
||||
|
||||
_function(CGInsetMake(top, left, bottom, right))
|
||||
_function(CGInsetMakeCopy(anInset))
|
||||
_function(CGInsetIsEmpty(anInset))
|
||||
|
||||
/*!
|
||||
Returns a <code>BOOL</code> indicating whether CGRect <code>lhsRect</code>
|
||||
contains CGRect <code>rhsRect</code>.
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
[horizontalSlider setKnobSize:CGSizeMake(12.0, 12.0)];
|
||||
[horizontalSlider setKnobColor:knobColor];
|
||||
[horizontalSlider setHighlightedKnobColor:knobHighlightedColor];
|
||||
[horizontalSlider setKnobColor:knobHighlightedColor forControlState:CPControlStateHighlighted];
|
||||
|
||||
views.push(horizontalSlider);
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
[verticalSlider setKnobSize:CGSizeMake(12.0, 12.0)];
|
||||
[verticalSlider setKnobColor:knobColor];
|
||||
[verticalSlider setHighlightedKnobColor:knobHighlightedColor];
|
||||
[verticalSlider setKnobColor:knobHighlightedColor forControlState:CPControlStateHighlighted];
|
||||
|
||||
views.push(verticalSlider);
|
||||
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
<string>Default.cptheme</string>
|
||||
<key>Type</key>
|
||||
<string>280N.theme</string>
|
||||
<key>Excluded</key>
|
||||
<array>
|
||||
<string>Frameworks</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>Configurations</key>
|
||||
|
||||
+3
-3
@@ -19,7 +19,7 @@
|
||||
</target>
|
||||
|
||||
<target name = "build" depends = "steam-uptodate">
|
||||
|
||||
|
||||
<steam-build>
|
||||
<arg line = "-f AppKit.steam -c ${Configuration} -t AppKit" />
|
||||
</steam-build>
|
||||
@@ -27,11 +27,11 @@
|
||||
<steam-build>
|
||||
<arg line = "-f AppKit.steam -c ${Configuration}-Rhino -t AppKit" />
|
||||
</steam-build>
|
||||
|
||||
|
||||
<steam-build>
|
||||
<arg line = "-f Themes/${Theme}/${Theme}.steam -c ${Configuration} -t ${Theme}.cptheme" />
|
||||
</steam-build>
|
||||
|
||||
|
||||
<copy todir = "${Build}/${Configuration}/AppKit/Resources/${Theme}.cptheme" >
|
||||
<fileset dir = "${Build}/${Configuration}/${Theme}.cptheme" />
|
||||
</copy>
|
||||
|
||||
Reference in new issue
Block a user