diff --git a/AppKit/CPLevelIndicator.j b/AppKit/CPLevelIndicator.j index 96dbf6abb..e22679251 100644 --- a/AppKit/CPLevelIndicator.j +++ b/AppKit/CPLevelIndicator.j @@ -32,6 +32,14 @@ CPContinuousCapacityLevelIndicatorStyle = 1; CPDiscreteCapacityLevelIndicatorStyle = 2; CPRatingLevelIndicatorStyle = 3; +var _CPLevelIndicatorBezelColor = nil, + _CPLevelIndicatorSegmentEmptyColor = nil, + _CPLevelIndicatorSegmentNormalColor = nil, + _CPLevelIndicatorSegmentWarningColor = nil, + _CPLevelIndicatorSegmentCriticalColor = nil, + + _CPLevelIndicatorSpacing = 1; + /*! @ingroup appkit @class CPLevelIndicator @@ -50,6 +58,56 @@ CPRatingLevelIndicatorStyle = 3; int _numberOfMajorTickMarks @accessors; } ++ (void)initialize +{ + var bundle = [CPBundle bundleForClass:CPLevelIndicator]; + + _CPLevelIndicatorBezelColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: + [ + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-bezel-left.png"] size:CGSizeMake(3.0, 18.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-bezel-center.png"] size:CGSizeMake(1.0, 18.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-bezel-right.png"] size:CGSizeMake(3.0, 18.0)] + ] + isVertical:NO + ]]; + + _CPLevelIndicatorSegmentEmptyColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: + [ + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-empty-left.png"] size:CGSizeMake(3.0, 17.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-empty-center.png"] size:CGSizeMake(1.0, 17.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-empty-right.png"] size:CGSizeMake(3.0, 17.0)] + ] + isVertical:NO + ]]; + + _CPLevelIndicatorSegmentNormalColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: + [ + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-normal-left.png"] size:CGSizeMake(3.0, 17.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-normal-center.png"] size:CGSizeMake(1.0, 17.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-normal-right.png"] size:CGSizeMake(3.0, 17.0)] + ] + isVertical:NO + ]]; + + _CPLevelIndicatorSegmentWarningColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: + [ + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-warning-left.png"] size:CGSizeMake(3.0, 17.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-warning-center.png"] size:CGSizeMake(1.0, 17.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-warning-right.png"] size:CGSizeMake(3.0, 17.0)] + ] + isVertical:NO + ]]; + + _CPLevelIndicatorSegmentCriticalColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices: + [ + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-critical-left.png"] size:CGSizeMake(3.0, 17.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-critical-center.png"] size:CGSizeMake(1.0, 17.0)], + [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPLevelIndicator/level-indicator-segment-critical-right.png"] size:CGSizeMake(3.0, 17.0)] + ] + isVertical:NO + ]]; +} + - (id)initWithFrame:(CGRect)aFrame { self = [super initWithFrame:aFrame]; @@ -60,11 +118,75 @@ CPRatingLevelIndicatorStyle = 3; _maxValue = 2; _warningValue = 2; _criticalValue = 2; + + [self _init]; } return self; } +- (void)_init +{ + // TODO Make themable and style dependent. + [self setBackgroundColor:_CPLevelIndicatorBezelColor]; +} + +- (void)layoutSubviews +{ + var segmentCount = _maxValue - _minValue; + + if (segmentCount <= 0) + return; + + var filledColor = _CPLevelIndicatorSegmentNormalColor, + value = [self doubleValue]; + + if (value < _criticalValue) + filledColor = _CPLevelIndicatorSegmentCriticalColor; + else if (value < _warningValue) + filledColor = _CPLevelIndicatorSegmentWarningColor; + + for (var i = 0; i < segmentCount; i++) + { + var bezelView = [self layoutEphemeralSubviewNamed:"segment-bezel-" + i + positioned:CPWindowAbove + relativeToEphemeralSubviewNamed:nil]; + + [bezelView setBackgroundColor:(_minValue + i) < value ? filledColor : _CPLevelIndicatorSegmentEmptyColor]; + } +} + +- (CPView)createEphemeralSubviewNamed:(CPString)aName +{ + return [[CPView alloc] initWithFrame:_CGRectMakeZero()]; +} + +- (CGRect)rectForEphemeralSubviewNamed:(CPString)aViewName +{ + if (aViewName.indexOf("segment-bezel") === 0) + { + var segment = parseInt(aViewName.substring("segment-bezel-".length), 10), + segmentCount = _maxValue - _minValue; + + if (segment >= segmentCount) + return _CGRectMakeZero(); + + var bounds = [self bounds], + segmentWidth = FLOOR(bounds.size.width / segmentCount), + segmentFrame = CGRectCreateCopy([self bounds]); + + segmentFrame.size.height -= 1; + segmentFrame.origin.x = segmentWidth * segment; + // Make the last segment use up the remaining space. + segmentFrame.size.width = segment < segmentCount - 1 ? segmentWidth - _CPLevelIndicatorSpacing : bounds.size.width - segmentFrame.origin.x; + + return segmentFrame; + } + + return _CGRectMakeZero(); +} + + /* - (CPLevelIndicatorStyle)style; - (void)setLevelIndicatorStyle:(CPLevelIndicatorStyle)style; @@ -122,6 +244,8 @@ var CPLevelIndicatorStyleKey = "CPLevelIndicatorStyleKey", _numberOfTickMarks = [aCoder decodeIntForKey:CPLevelIndicatorNumberOfTickMarksKey]; _numberOfMajorTickMarks = [aCoder decodeIntForKey:CPLevelIndicatorNumberOfMajorTickMarksKey]; + [self _init]; + [self setNeedsLayout]; [self setNeedsDisplay:YES]; } diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-bezel-center.png b/AppKit/Resources/CPLevelIndicator/level-indicator-bezel-center.png new file mode 100644 index 000000000..783567602 Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-bezel-center.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-bezel-left.png b/AppKit/Resources/CPLevelIndicator/level-indicator-bezel-left.png new file mode 100644 index 000000000..7a32aca9d Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-bezel-left.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-bezel-right.png b/AppKit/Resources/CPLevelIndicator/level-indicator-bezel-right.png new file mode 100644 index 000000000..d4718c06f Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-bezel-right.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-critical-center.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-critical-center.png new file mode 100644 index 000000000..e92f7983e Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-critical-center.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-critical-left.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-critical-left.png new file mode 100644 index 000000000..19b9a3312 Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-critical-left.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-critical-right.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-critical-right.png new file mode 100644 index 000000000..283244ade Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-critical-right.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-empty-center.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-empty-center.png new file mode 100644 index 000000000..5afa96741 Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-empty-center.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-empty-left.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-empty-left.png new file mode 100644 index 000000000..d5f5215e3 Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-empty-left.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-empty-right.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-empty-right.png new file mode 100644 index 000000000..2f96a6d2e Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-empty-right.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-normal-center.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-normal-center.png new file mode 100644 index 000000000..6389653e8 Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-normal-center.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-normal-left.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-normal-left.png new file mode 100644 index 000000000..850ba7801 Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-normal-left.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-normal-right.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-normal-right.png new file mode 100644 index 000000000..ef4e90557 Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-normal-right.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-warning-center.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-warning-center.png new file mode 100644 index 000000000..6cc8a2d5a Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-warning-center.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-warning-left.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-warning-left.png new file mode 100644 index 000000000..17f50d2ad Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-warning-left.png differ diff --git a/AppKit/Resources/CPLevelIndicator/level-indicator-segment-warning-right.png b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-warning-right.png new file mode 100644 index 000000000..0e42c1ea7 Binary files /dev/null and b/AppKit/Resources/CPLevelIndicator/level-indicator-segment-warning-right.png differ