Fill in more code for progress bar.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@28906 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Fred Kiefer 2009-10-28 22:54:57 +00:00
parent 10130ce9e9
commit 26ce4eb477
2 changed files with 135 additions and 41 deletions

View file

@ -1,3 +1,7 @@
2009-10-28 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSProgressIndicator.m: Fill more methods.
2009-10-27 Fred Kiefer <FredKiefer@gmx.de> 2009-10-27 Fred Kiefer <FredKiefer@gmx.de>
* Headers/AppKit/NSProgressIndicator.h, * Headers/AppKit/NSProgressIndicator.h,

View file

@ -24,6 +24,8 @@
Boston, MA 02110-1301, USA. Boston, MA 02110-1301, USA.
*/ */
#include <Foundation/NSAutoreleasePool.h>
#include <Foundation/NSThread.h>
#include <Foundation/NSTimer.h> #include <Foundation/NSTimer.h>
#include "AppKit/NSProgressIndicator.h" #include "AppKit/NSProgressIndicator.h"
#include "AppKit/NSGraphics.h" #include "AppKit/NSGraphics.h"
@ -90,9 +92,8 @@ static NSImage *spinningImages[MaxCount];
return nil; return nil;
_isIndeterminate = YES; _isIndeterminate = YES;
_isDisplayedWhenStopped = YES;
_isBezeled = YES; _isBezeled = YES;
_isVertical = NO;
_usesThreadedAnimation = NO;
_animationDelay = 5.0 / 60.0; // 1 twelfth a a second _animationDelay = 5.0 / 60.0; // 1 twelfth a a second
_doubleValue = 0.0; _doubleValue = 0.0;
_minValue = 0.0; _minValue = 0.0;
@ -100,13 +101,15 @@ static NSImage *spinningImages[MaxCount];
_controlTint = NSDefaultControlTint; _controlTint = NSDefaultControlTint;
_controlSize = NSRegularControlSize; _controlSize = NSRegularControlSize;
[self setStyle: NSProgressIndicatorBarStyle]; [self setStyle: NSProgressIndicatorBarStyle];
//_isVertical = NO;
//_usesThreadedAnimation = NO;
return self; return self;
} }
- (void)dealloc - (void)dealloc
{ {
TEST_RELEASE(_timer); [self stopAnimation: self];
[super dealloc]; [super dealloc];
} }
@ -125,7 +128,7 @@ static NSImage *spinningImages[MaxCount];
|| ((_style == NSProgressIndicatorBarStyle) && (_count >= indeterminateMaxCount))) || ((_style == NSProgressIndicatorBarStyle) && (_count >= indeterminateMaxCount)))
_count = 0; _count = 0;
[self setNeedsDisplay:YES]; [self setNeedsDisplay: YES];
} }
- (NSTimeInterval)animationDelay - (NSTimeInterval)animationDelay
@ -136,13 +139,31 @@ static NSImage *spinningImages[MaxCount];
- (void)setAnimationDelay:(NSTimeInterval)delay - (void)setAnimationDelay:(NSTimeInterval)delay
{ {
_animationDelay = delay; _animationDelay = delay;
if (_isRunning && _isIndeterminate)
{
[self stopAnimation: self];
[self startAnimation: self];
}
}
- (void)_animationLoop
{
while (_isRunning)
{
CREATE_AUTORELEASE_POOL(pool);
[self animate: self];
[NSThread sleepForTimeInterval: _animationDelay];
RELEASE(pool);
}
} }
- (void)startAnimation:(id)sender - (void)startAnimation:(id)sender
{ {
if (!_isIndeterminate) if (!_isIndeterminate || _isRunning)
return; return;
_isRunning = YES;
if (!_usesThreadedAnimation) if (!_usesThreadedAnimation)
{ {
ASSIGN(_timer, [NSTimer scheduledTimerWithTimeInterval: _animationDelay ASSIGN(_timer, [NSTimer scheduledTimerWithTimeInterval: _animationDelay
@ -153,10 +174,10 @@ static NSImage *spinningImages[MaxCount];
} }
else else
{ {
// FIXME: Not implemented [NSThread detachNewThreadSelector: @selector(_animationLoop)
toTarget: self
withObject: nil];
} }
_isRunning = YES;
} }
- (void)stopAnimation:(id)sender - (void)stopAnimation:(id)sender
@ -171,7 +192,7 @@ static NSImage *spinningImages[MaxCount];
} }
else else
{ {
// FIXME: Not implemented // Done automatically
} }
_isRunning = NO; _isRunning = NO;
@ -200,8 +221,7 @@ static NSImage *spinningImages[MaxCount];
- (void)incrementBy:(double)delta - (void)incrementBy:(double)delta
{ {
_doubleValue += delta; [self setDoubleValue: _doubleValue + delta];
[self setNeedsDisplay: YES];
} }
- (double)doubleValue - (double)doubleValue
@ -211,6 +231,11 @@ static NSImage *spinningImages[MaxCount];
- (void)setDoubleValue:(double)aValue - (void)setDoubleValue:(double)aValue
{ {
if (aValue > _maxValue)
aValue = _maxValue;
else if (aValue < _minValue)
aValue = _minValue;
if (_doubleValue != aValue) if (_doubleValue != aValue)
{ {
_doubleValue = aValue; _doubleValue = aValue;
@ -271,6 +296,8 @@ static NSImage *spinningImages[MaxCount];
// Maybe we need more functionality here when we implement indeterminate // Maybe we need more functionality here when we implement indeterminate
if (flag == NO && _isRunning) if (flag == NO && _isRunning)
[self stopAnimation: self]; [self stopAnimation: self];
[self setNeedsDisplay: YES];
} }
- (BOOL)isDisplayedWhenStopped - (BOOL)isDisplayedWhenStopped
@ -280,7 +307,8 @@ static NSImage *spinningImages[MaxCount];
- (void)setDisplayedWhenStopped:(BOOL)flag - (void)setDisplayedWhenStopped:(BOOL)flag
{ {
_style = _isDisplayedWhenStopped; _isDisplayedWhenStopped = _isDisplayedWhenStopped;
[self setNeedsDisplay: YES];
} }
- (NSProgressIndicatorStyle) style - (NSProgressIndicatorStyle) style
@ -293,6 +321,8 @@ static NSImage *spinningImages[MaxCount];
_style = style; _style = style;
_count = 0; _count = 0;
[self setDisplayedWhenStopped: (style == NSProgressIndicatorBarStyle)]; [self setDisplayedWhenStopped: (style == NSProgressIndicatorBarStyle)];
[self sizeToFit];
[self setNeedsDisplay: YES];
} }
- (NSControlSize)controlSize - (NSControlSize)controlSize
@ -303,6 +333,8 @@ static NSImage *spinningImages[MaxCount];
- (void)setControlSize:(NSControlSize)size - (void)setControlSize:(NSControlSize)size
{ {
_controlSize = size; _controlSize = size;
[self sizeToFit];
[self setNeedsDisplay: YES];
} }
- (NSControlTint)controlTint - (NSControlTint)controlTint
@ -313,6 +345,7 @@ static NSImage *spinningImages[MaxCount];
- (void)setControlTint:(NSControlTint)tint - (void)setControlTint:(NSControlTint)tint
{ {
_controlTint = tint; _controlTint = tint;
[self setNeedsDisplay: YES];
} }
- (void) sizeToFit - (void) sizeToFit
@ -365,9 +398,17 @@ static NSImage *spinningImages[MaxCount];
val = _doubleValue - _minValue; val = _doubleValue - _minValue;
if (_isVertical) if (_isVertical)
r.size.height = NSHeight(r) * (val / (_maxValue - _minValue)); {
float height = NSHeight(r) * (val / (_maxValue - _minValue));
// Compensate for the flip
r.origin.y = NSHeight(r) - height;
r.size.height = height;
}
else else
{
r.size.width = NSWidth(r) * (val / (_maxValue - _minValue)); r.size.width = NSWidth(r) * (val / (_maxValue - _minValue));
}
r = NSIntersectionRect(r,rect); r = NSIntersectionRect(r,rect);
if (!NSIsEmptyRect(r)) if (!NSIsEmptyRect(r))
{ {
@ -415,13 +456,11 @@ static NSImage *spinningImages[MaxCount];
// add flag values. // add flag values.
flags |= (_isIndeterminate)? 2 : 0; flags |= (_isIndeterminate)? 2 : 0;
// Hard coded...
// flags |= 8;
// Hard coded... this value forces it to be a regular-sized, flags |= (_controlSize == NSSmallControlSize) ? 0x100 : 0;
// bar type progress indicator since this is the only type flags |= (_style == NSProgressIndicatorSpinningStyle) ? 0x1000 : 0;
// gnustep supports. flags |= _isDisplayedWhenStopped ? 0x2000 : 0;
//
flags |= 8200;
[aCoder encodeInt: flags forKey: @"NSpiFlags"]; [aCoder encodeInt: flags forKey: @"NSpiFlags"];
// things which Gorm encodes, but IB doesn't care about. // things which Gorm encodes, but IB doesn't care about.
@ -433,14 +472,14 @@ static NSImage *spinningImages[MaxCount];
} }
else else
{ {
[aCoder encodeValueOfObjCType: @encode(BOOL) at:&_isIndeterminate]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &_isIndeterminate];
[aCoder encodeValueOfObjCType: @encode(BOOL) at:&_isBezeled]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &_isBezeled];
[aCoder encodeValueOfObjCType: @encode(BOOL) at:&_usesThreadedAnimation]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &_usesThreadedAnimation];
[aCoder encodeValueOfObjCType: @encode(NSTimeInterval) at:&_animationDelay]; [aCoder encodeValueOfObjCType: @encode(NSTimeInterval) at: &_animationDelay];
[aCoder encodeValueOfObjCType: @encode(double) at:&_doubleValue]; [aCoder encodeValueOfObjCType: @encode(double) at: &_doubleValue];
[aCoder encodeValueOfObjCType: @encode(double) at:&_minValue]; [aCoder encodeValueOfObjCType: @encode(double) at: &_minValue];
[aCoder encodeValueOfObjCType: @encode(double) at:&_maxValue]; [aCoder encodeValueOfObjCType: @encode(double) at: &_maxValue];
[aCoder encodeValueOfObjCType: @encode(BOOL) at:&_isVertical]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &_isVertical];
} }
} }
@ -455,57 +494,108 @@ static NSImage *spinningImages[MaxCount];
// id matrix = [aDecoder decodeObjectForKey: @"NSDrawMatrix"]; // id matrix = [aDecoder decodeObjectForKey: @"NSDrawMatrix"];
if ([aDecoder containsValueForKey: @"NSMaxValue"]) if ([aDecoder containsValueForKey: @"NSMaxValue"])
{ {
int max = [aDecoder decodeDoubleForKey: @"NSMaxValue"]; double max = [aDecoder decodeDoubleForKey: @"NSMaxValue"];
[self setMaxValue: max]; [self setMaxValue: max];
} }
else
{
_maxValue = 100.0;
}
if ([aDecoder containsValueForKey: @"NSMinValue"]) if ([aDecoder containsValueForKey: @"NSMinValue"])
{ {
int min = [aDecoder decodeDoubleForKey: @"NSMinValue"]; double min = [aDecoder decodeDoubleForKey: @"NSMinValue"];
[self setMinValue: min]; [self setMinValue: min];
} }
else
{
_minValue = 0.0;
}
if ([aDecoder containsValueForKey: @"NSpiFlags"]) if ([aDecoder containsValueForKey: @"NSpiFlags"])
{ {
int flags = [aDecoder decodeIntForKey: @"NSpiFlags"]; int flags = [aDecoder decodeIntForKey: @"NSpiFlags"];
_isIndeterminate = ((flags & 2) == 2); _isIndeterminate = ((flags & 2) == 2);
_controlTint = NSDefaultControlTint;
_controlSize = (flags & 0x100) ? NSSmallControlSize : NSRegularControlSize;
[self setStyle: (flags & 0x1000) ? NSProgressIndicatorSpinningStyle
: NSProgressIndicatorBarStyle];
_isDisplayedWhenStopped = ((flags & 0x2000) == 0x2000);
// ignore the rest, since they are not pertinent to GNUstep. // ignore the rest, since they are not pertinent to GNUstep.
} }
else
{
_isIndeterminate = YES;
_isDisplayedWhenStopped = YES;
_controlTint = NSDefaultControlTint;
_controlSize = NSRegularControlSize;
[self setStyle: NSProgressIndicatorBarStyle];
}
// things which Gorm encodes, but IB doesn't care about. // things which Gorm encodes, but IB doesn't care about.
if ([aDecoder containsValueForKey: @"GSDoubleValue"]) if ([aDecoder containsValueForKey: @"GSDoubleValue"])
{ {
_doubleValue = [aDecoder decodeDoubleForKey: @"GSDoubleValue"]; _doubleValue = [aDecoder decodeDoubleForKey: @"GSDoubleValue"];
} }
else
{
_doubleValue = _minValue;
}
if ([aDecoder containsValueForKey: @"GSIsBezeled"]) if ([aDecoder containsValueForKey: @"GSIsBezeled"])
{ {
_isBezeled = [aDecoder decodeBoolForKey: @"GSIsBezeled"]; _isBezeled = [aDecoder decodeBoolForKey: @"GSIsBezeled"];
} }
else
{
_isBezeled = YES;
}
if ([aDecoder containsValueForKey: @"GSIsVertical"]) if ([aDecoder containsValueForKey: @"GSIsVertical"])
{ {
_isVertical = [aDecoder decodeBoolForKey: @"GSIsVertical"]; _isVertical = [aDecoder decodeBoolForKey: @"GSIsVertical"];
} }
else
{
_isVertical = NO;
}
if ([aDecoder containsValueForKey: @"GSUsesThreadAnimation"]) if ([aDecoder containsValueForKey: @"GSUsesThreadAnimation"])
{ {
_usesThreadedAnimation = [aDecoder decodeBoolForKey: @"GSUsesThreadAnimation"]; _usesThreadedAnimation = [aDecoder decodeBoolForKey: @"GSUsesThreadAnimation"];
} }
else
{
_usesThreadedAnimation = NO;
}
if ([aDecoder containsValueForKey: @"GSAnimationDelay"]) if ([aDecoder containsValueForKey: @"GSAnimationDelay"])
{ {
_animationDelay = [aDecoder decodeDoubleForKey: @"GSAnimationDelay"]; _animationDelay = [aDecoder decodeDoubleForKey: @"GSAnimationDelay"];
} }
else
{
_animationDelay = 5.0 / 60.0; // 1 twelfth a a second
}
} }
else else
{ {
[aDecoder decodeValueOfObjCType: @encode(BOOL) at:&_isIndeterminate]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_isIndeterminate];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at:&_isBezeled]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_isBezeled];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at:&_usesThreadedAnimation]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_usesThreadedAnimation];
[aDecoder decodeValueOfObjCType: @encode(NSTimeInterval) [aDecoder decodeValueOfObjCType: @encode(NSTimeInterval)
at:&_animationDelay]; at: &_animationDelay];
[aDecoder decodeValueOfObjCType: @encode(double) at:&_doubleValue]; [aDecoder decodeValueOfObjCType: @encode(double) at: &_doubleValue];
[aDecoder decodeValueOfObjCType: @encode(double) at:&_minValue]; [aDecoder decodeValueOfObjCType: @encode(double) at: &_minValue];
[aDecoder decodeValueOfObjCType: @encode(double) at:&_maxValue]; [aDecoder decodeValueOfObjCType: @encode(double) at: &_maxValue];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at:&_isVertical]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_isVertical];
_isDisplayedWhenStopped = YES;
_controlTint = NSDefaultControlTint;
_controlSize = NSRegularControlSize;
[self setStyle: NSProgressIndicatorBarStyle];
} }
return self; return self;
} }