SCSlider a gui slider
Inherits from: Object : SCView : SCControlView : SCSliderBase
See also: SCRangeSlider, EZSlider
Some Important Issues Regarding SCSlider
SCSlider always has a range between zero and one. You must scale the output and input values to your needs. Using map and unmap, combined with a Spec, is helpful for this. To set the increment or decrement value of the slider, set the step. By default, the shift, ctrl, and alt keys will modify the stepping by 100x, 10x, or 0.1x repectively, though you can customize this by setting shift_scale, ctrl_scale, or alt_scale (see SCSliderBase) . Inherits some formatting from SCSliderBase.
By default, SCSlider will respond only to drags where the drag contains a Number.
Creation / Class Methods
*new (parent, bounds)
parent - The parent view.
bounds - An instance of Rect, or a Point indicating width@height.
(
w = Window.new.front;
a = Slider(w, Rect(20, 60, 150, 20));
a.action = { a.value.postln };
)
Accessing Instance and Class Variables
value
value_ (val)
Gets/sets the property, \value, by calling get/setProperty(\value, val). This will not do the action of the slider.
valueAction_ (val)
Sets the property, \value, by calling setPropertyWithAction(\value, val). Does the sliders action.
increment (zoom)
decrement (zoom)
These are the methods called by pressing the arrow keys. These methods increment or decrement the slider value by (max(this.step, this.pixelStep) * zoom). This means that by default increment and decrement change the value by pixelStep (step is nil by default). You can set step to quantize the increment/decrement of the slider values. If you call these methods from your code, you can also change the resolution of the values with the zoom factor. This will not effect how the keys work, since they will always use a zoom factor of 1, or a multiple of that depending on the key modifier. See SCSliderBase. Performs the action of the slider.
zoom - Defaults to 1, though it is effected by key modifiers when using arrow keys.
Customizing Appearance
thumbSize
thumbSize_ (size)
size - The size of the slider button in pixels. Its width or height, depending on the slider orientation
Subclassing and Internal Methods
The following methods are usually not used directly or are called by a primitive. Programmers can still call or override these as needed.
properties
A list of properties to which this view responds. See SCView.
returns:
[ \bounds, \visible, \enabled, \canFocus, \resize, \background, \minWidth, \maxWidth, \minHeight, \maxHeight, \knobColor, \step, \thumbSize, \focusColor]
pixelStep
Returns the reciprocal of: the slider width or height (depending on orientation) minus the thumbSize
defaultKeyDownAction (char, modifiers, unicode)
The default keydown actions are:
key action comment
r valueAction_(1.0.rand)
n valueAction_(0)
x valueAction_(1)
c valueAction_(0.5)
] increment by step
[ decrement by step
unicode 16rF700, increment by step up arrow
unicode 16rF703, increment by step right arrow
unicode 16rF701, decrement by step down arrow
unicode 16rF702, decrement by step left arrow
defaultGetDrag
The method called by default when initiating a drag from an SCSlider. Returns the same as value.
defaultCanReceiveDrag
The method called by default when attempting to drop a drag in this object. By default, SCSlider will respond only to drags where the drag contains a Number.
defaultReceiveDrag
The default method called when a drag has been recieved. Performs valueAction_() using currentDrag as an argument.
Examples
// the simplest version will give you a very long float
(
w = Window.new.front;
c = NumberBox(w, Rect(20, 20, 150, 20));
a = Slider(w, Rect(20, 60, 150, 20))
.action_({
c.value_(a.value)
});
a.action.value;
)
(// change the bounds to become vertical
w = Window.new.front;
c = NumberBox(w, Rect(20, 20, 150, 20));
a = Slider(w, Rect(200, 60, 20, 150))
.action_({
c.value_(a.value)
});
a.action.value;
)
// use a Spec to round and map the output range for clearer display
(
w = Window.new.front;
b = ControlSpec(-50, 50, \linear, 0.01); // min, max, mapping, step
c = StaticText(w, Rect(20, 20, 150, 20)).align_(\center).background_(Color.rand);
a = Slider(w, Rect(20, 50, 150, 20))
.focusColor_(Color.red(alpha:0.2))
.background_(Color.rand)
.value_(0.5)
.action_({
c.string_(b.map(a.value).asString)
// round the float so it will fit in the NumberBox
});
a.action.value;
)
// change the stepsize of the slider, selected via a PopUpMenu
(
w = Window.new.front;
a = ["0", "0.0625", "0.125", "0.25", "0.5", "1"];
b = Slider(w, Rect(20, 100, 100, 20))
.action_({
c.value_(b.value)
}).background_(Color.rand);
d = PopUpMenu(w, Rect(20, 60, 100, 20))
.items_(a)
.action_({
b.step_((a.at(d.value)).asFloat);
});
StaticText(w, Rect(130, 60, 100, 20)).string_("change step");
c = NumberBox(w, Rect(20, 20, 100, 20));
)
// use the slider view to accept key actions
(// select the slider, type something and watch the post window
w = Window.new;
c = Slider(w,Rect(0,0,100,30));
c.keyDownAction = { arg view,char,modifiers,unicode,keycode;
[char,modifiers,unicode,keycode].postln;
};
w.front;
)
// adding functionality to a view by the method addAction
// this is useful for adding things to existing frameworks
// that have action functions already.
(
w = Window.new("A Slider");
a = Slider.new(w, Rect(40, 10, 300, 30));
w.front
);
// now incrementally add some action to the slider
a.addAction({ |sl| sl.value.postln });
a.addAction({ |sl| w.view.background = Color.green(sl.value) });
a.addAction({ |sl| sl.background = Color.red(1 - sl.value) });
// adding and removing an action:
f = { |sl| "--------*******-------".postln; };
a.addAction(f);
a.removeAction(f);
// or remove all, of course
a.action = nil;
-----
// you can use Slider for triggering sounds also:
(
s.waitForBoot({
SynthDef(\pluck,{arg freq=55;
Out.ar(0,
Pluck.ar(WhiteNoise.ar(0.06),
EnvGen.kr(Env.perc(0,4), 1.0, doneAction: 2),
freq.reciprocal,
freq.reciprocal,
10,
coef:0.1)
);
}).send(s);
w = Window.new("Hold arrow keys to trigger sound",Rect(300,Window.screenBounds.height-300,400,100)).front;
a = Slider(w, Rect(50, 20, 300, 40))
.value_(0.5)
.step_(0.05)
.focus
.action_({
// trigger a synth with varying frequencies
Synth(\pluck, [\freq,55+(1100*a.value)]);
w.view.background_(Gradient(Color.rand,Color.rand));
})
});
)
// change the background color of WIndow by moving the sliders
(
w = Window("RGB fader", Rect(100, 500, 400, 400))
.front;
f = { w.view.background_(Color.new(r.value, g.value, b.value, 1)) };
r = Slider(w, Rect(100, 140, 200, 20))
.value_(0.5)
.action_({ f.value });
g = Slider(w, Rect(100, 170, 200, 20))
.value_(0.5)
.action_({ f.value });
b = Slider(w, Rect(100, 200, 200, 20))
.value_(0.5)
.action_({ f.value });
f.value;
);