This is SpiralView.m in view mode; [Download] [Up]
#import <appkit/appkit.h> #import <dpsclient/wraps.h> #import <libc.h> #import <math.h> #import "SpiralView.h" #import "SpiralWraps.h" #import "alphanum.h" #import "Thinker.h" #define MAXCOLORS 14 static struct color { float r, g, b; } colorChanges[MAXCOLORS] = { /* color gradient */ {1.0, 1.0, 1.0}, /* white */ {1.0, 0.6, 1.0}, /* pink */ {1.0, 0.1, 1.0}, /* fuschia */ {0.4, 0.0, 1.0}, /* purple */ {0.0, 0.0, 1.0}, /* blue */ {0.0, 0.3, 1.0}, /* blue cyan */ {0.0, 1.0, 1.0}, /* cyan */ {0.0, 1.0, 0.0}, /* green */ {0.7, 1.0, 0.0}, /* yellow green */ {1.0, 1.0, 0.0}, /* yellow */ {1.0, 0.7, 0.0}, /* yellow orange */ {1.0, 0.3, 0.0}, /* orange */ {1.0, 0.0, 0.0}, /* red */ {0.75, 0.0, 0.0}, /* dark red */ }; // The values MUST be unique, else all array elements are pointers // to the exact same value! static NXDefaultsVector spiralDefaults = { {"SpiralMaxCount", "0000"} ,{"SpiralMinRadius", "0001"} ,{"SpiralMaxRadius", "0002"} ,{NULL} }; @implementation SpiralView - initFrame:(const NXRect *)frameRect { [super initFrame:frameRect]; // initialize variables (many will be init via startOver) degCircles = 3; colorIndex = 0; [self loadDefaults]; [self startOver]; return self; } //********** - oneStep { if (numSpirals >= maxSpirals) { [self startOver]; [self display]; numSpirals = 0; } // draw new arc PSLSetColor (colorChanges[colorIndex].r - (degree/maxDegree), colorChanges[colorIndex].g - (degree/maxDegree), colorChanges[colorIndex].b - (degree/maxDegree)); PSLDrawArc(x, y, radius, degree); radius -= (maxCurrentRadius / maxDegree); degree += 1.0; degIterations++; if ((degIterations > (maxDegree)) || (radius < 1)) [self newSpiral]; return self; } //********** - (const char *)windowTitle { return "Spiral Generator"; } - inspector:sender { char buf[MAXPATHLEN]; if (!inspectorPanel) { sprintf(buf,"%s/Spiral.nib",[sender moduleDirectory:"Spiral"]); [NXApp loadNibFile:buf owner:self withNames:NO]; // validate that defaults are within UI constraints [self constrainDefaults]; // set UI Object values [minRadiusSlider setIntValue:minRadius]; [minRadiusField setIntValue:minRadius]; [maxRadiusSlider setIntValue:maxRadius]; [maxRadiusField setIntValue:maxRadius]; [maxSpiralsSlider setIntValue:maxSpirals]; [maxSpiralsField setIntValue:maxSpirals]; } return inspectorPanel; } - sizeTo:(NXCoord)width :(NXCoord)height { [super sizeTo:width :height]; [self startOver]; return self; } - drawSelf:(const NXRect *)rects :(int)rectCount { if (!rects || !rectCount) return self; PSsetgray(NX_BLACK); NXRectFill(rects); return self; } - (BOOL) useBufferedWindow; { return YES; } //********** - changeMinRadius:sender { int temp; if (sender == minRadiusField) { temp = [sender intValue]; if (temp < [minRadiusSlider minValue]) temp = minRadius; if (temp > [minRadiusSlider maxValue]) temp = minRadius; [sender setIntValue:temp]; } minRadius = [sender floatValue]; if (minRadius > maxRadius) { minRadius = maxRadius; [minRadiusSlider setIntValue:minRadius]; } [minRadiusField setIntValue:minRadius]; [minRadiusSlider setIntValue:minRadius]; [self saveDefaults]; return self; } - changeMaxRadius:sender { int temp; if (sender == maxRadiusField) { temp = [sender intValue]; if (temp < [maxRadiusSlider minValue]) temp = maxRadius; if (temp > [maxRadiusSlider maxValue]) temp = maxRadius; [sender setIntValue:temp]; } maxRadius = [sender floatValue]; if (minRadius > maxRadius) { maxRadius = minRadius; [maxRadiusSlider setIntValue:maxRadius]; } [maxRadiusField setIntValue:maxRadius]; [maxRadiusSlider setIntValue:maxRadius]; [self saveDefaults]; return self; } - changeMaxSpirals:sender { int temp; if (sender == maxSpiralsField) { temp = [sender intValue]; if (temp < [maxSpiralsSlider minValue]) temp = [maxSpiralsSlider minValue]; if (temp > [maxSpiralsSlider maxValue]) temp = [maxSpiralsSlider maxValue]; [sender setIntValue:temp]; } maxSpirals = [sender floatValue]; [maxSpiralsField setIntValue:maxSpirals]; [maxSpiralsSlider setIntValue:maxSpirals]; [self saveDefaults]; return self; } //********** - (void)loadDefaults { itoa(MAXSPIRALS, spiralDefaults[0].value); itoa(MINRADIUS, spiralDefaults[1].value); itoa(MAXRADIUS, spiralDefaults[2].value); NXRegisterDefaults("BackSpace", spiralDefaults); maxSpirals = atoi((char*)NXGetDefaultValue("BackSpace", "SpiralMaxCount")); minRadius = atoi((char*)NXGetDefaultValue("BackSpace", "SpiralMinRadius")); maxRadius = atoi((char*)NXGetDefaultValue("BackSpace", "SpiralMaxRadius")); } - (void)saveDefaults { itoa(maxSpirals, spiralDefaults[0].value); itoa(minRadius, spiralDefaults[1].value); itoa(maxRadius, spiralDefaults[2].value); NXWriteDefaults("BackSpace", spiralDefaults); } - (void)constrainDefaults { // validate that defaults are within UI constraints if (minRadius < [minRadiusSlider minValue]) minRadius = [minRadiusSlider minValue]; if (minRadius > [minRadiusSlider maxValue]) minRadius = [minRadiusSlider maxValue]; if (maxRadius < [maxRadiusSlider minValue]) maxRadius = [maxRadiusSlider minValue]; if (maxRadius > [maxRadiusSlider maxValue]) maxRadius = [maxRadiusSlider maxValue]; if (minRadius > maxRadius) minRadius = maxRadius; if (maxSpirals < [maxSpiralsSlider minValue]) maxSpirals = [maxSpiralsSlider minValue]; if (maxSpirals > [maxSpiralsSlider maxValue]) maxSpirals = [maxSpiralsSlider maxValue]; } //********** - startOver { numSpirals = 0; maxDegree = 360 * degCircles; [self newSpiral]; return self; } - newSpiral { NXRect rBounds; NXSize rSize; numSpirals++; degree = 0; degIterations = 0; [self getBounds:&rBounds]; rSize = rBounds.size; x = randBetween(0, rSize.width); y = randBetween(0, rSize.height); radius = randBetween(minRadius, maxRadius); maxCurrentRadius = radius; if (++colorIndex >= MAXCOLORS) colorIndex = 0; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.