Forgot a help fix: Drag a dock's title bar, not divider, to reposition
[supercollider.git] / HelpSource / Classes / Knob.schelp
blob9357c38cda89e13592fd9445de5aabe581f32ae2
1 class:: Knob
2 redirect:: implClass
3 summary:: A rotary controller view
4 categories:: GUI>Views
5 related:: Classes/Slider, Classes/Slider2D
7 DESCRIPTION::
9 Knob displays a value from 0.0 to 1.0 in rotary fashon, and allows to control it with either circular or linear mouse motion.
11 It also displays the deviation of the value from either 0.0 or 0.5, which you can choose using link::#-centered::.
13 To switch between the mouse interaction modes, use link::#-mode::.
15 The amount by which the value changes at interaction can be fine-tuned using link::#-step::, link::#-keystep::, link::#-shift_scale::, link::#-ctrl_scale::, and link::#-alt_scale::
17 CLASSMETHODS::
19 PRIVATE:: key
21 METHOD:: defaultMode
23     The default link::#-mode:: for newly created Knobs.
26 INSTANCEMETHODS::
29 SUBSECTION:: Data
31 METHOD:: value
33     The displayed value.
35     argument::
36         A Number in the range of 0.0 to 1.0.
38 METHOD:: valueAction
40     Sets the value and triggeres link::#-action::.
42 METHOD:: increment
43     Increments the value by link::#-keystep:: multiplied by the argument.
45     argument::
46         A Number.
48 METHOD:: decrement
49     Decrements the value by link::#-keystep:: multiplied by the argument.
51     argument:: zoom
52         A Number.
55 SUBSECTION:: Interaction
57 METHOD:: mode
59     The way value is controlled with respect to mouse movement after clicking on the view:
60     list::
61     ## code::\round:: - value follows circular movement
62     ## code::\horiz:: - value follows linear movement in horizontal direction
63     ## code::\vert:: - value follows linear movement in vertical direction
64     ::
66     Defaults to code::\round::.
68     Argument::
69         One of the symbols listed above.
71 METHOD:: keystep
73     The amount by which the value is incremented/decremented when pressing a relevant key.
75     Defaults to 0.01;
77     Argument::
78         A Number.
80 METHOD:: step
82     The amount by which the value is incremented/decremented using the mouse in 'horizontal' and 'vertical' link::#-mode#modes::.
84     Argument::
85         A Number.
87 METHOD:: shift_scale
88     The factor by which link::#-step:: or link::#-keystep:: is multiplied when used at mouse or keyboard interaction while the Shift key is pressed.
90     argument::
91         A Float.
93 METHOD:: ctrl_scale
94     The factor by which link::#-step:: or link::#-keystep:: is multiplied when used at mouse or keyboard interaction while the Ctrl key is pressed.
96     argument::
97         A Float.
99 METHOD:: alt_scale
100     The factor by which link::#-step:: or link::#-keystep:: is multiplied when used at mouse or keyboard interaction while the Alt key is pressed.
102     argument::
103         A Float.
107 SUBSECTION:: Appearance
109 METHOD:: centered
111     Whether the deviation of value will be displayed in relation to 0.0 or 0.5 (e.g. as in a panning controller);
113     Argument::
114         A Boolean.
116 METHOD:: color
118     The colors used by the Knob to draw the following elements:
120     list::
121     ## the main Knob color
122     ## the value indicator
123     ## the deviation indicator
124     ## the background of the deviation indicator
125     ::
127     Argument::
128         An Array of four Colors in the order listed above.
131 SUBSECTION:: Actions
133 METHOD:: action
134     The action object evaluated whenever the user interacts with the Knob using the mouse or the keyboard.
136 METHOD:: defaultKeyDownAction
138     Implements the default effects of key presses as follows:
140     table::
141     ## strong::Key::   || strong::Effect::
142     ## r               || valueAction_(1.0.rand)
143     ## n               || valueAction_(0)
144     ## x               || valueAction_(1)
145     ## c               || valueAction_(0.5)
146     ## ]               || increment
147     ## [               || decrement
148     ## up arrow        || increment
149     ## down arrow      || decrement
150     ## right arrow     || increment
151     ## left arrow      || decrement
152     ::
154     See also: link::#-keystep::, link::#-shift_scale::, link::#-ctrl_scale::, link::#-alt_scale::.
156 SUBSECTION:: Drag and drop
158 METHOD:: defaultGetDrag
159     returns::
160         The link::#-value::.
162 METHOD:: defaultCanReceiveDrag
163     returns::
164         True if the current drag data is a Number.
166 METHOD:: defaultReceiveDrag
167     Sets link::#-valueAction:: to the current drag data.
170 EXAMPLES::
172 subsection:: Basic Example
174 code::
176 var window, size = 32; // try different sizes - from 15 to 200 or more!
177 window = Window.new("Knob", Rect(640,630,270,70)).front;
178 k = Knob.new(window, Rect(20, 10, size, size));
179 k.action_({|v,x,y,m| postf("action func called: %\n", v.value); });
180 //k.color[1] = Color.gray(alpha:0);
183 k.value
184 k.value = 0.25
185 k.valueAction = 0.125
187 // modes
188 k.mode = \vert;
189 k.mode = \horiz;
190 k.mode = \round; // default
192 k.visible
193 k.visible = false
194 k.visible = true
195 k.enabled = false
196 k.enabled_(true)
197 k.canFocus = false
198 k.canFocus = true
202 subsection:: Centered Mode
204 Center mode is useful for pan or eq gain control etc.
206 code::
208 var window;
209 window = Window.new("Pan Knob", Rect(640,630,270,70)).front;
210 k = Knob.new(window, Rect(20,10,36,36));
211 k.action_({|v,x,y,m| \pan.asSpec.map(v.value).postln; })
212 //  .mode_(\horiz)
213     .centered_(false)
214     .value_(\pan.asSpec.unmap(0)); // 0.5
215 //k.color[1] = Color.gray(alpha:0);
217 k.centered
218 k.centered = true
219 k.centered = false
223 subsection:: step
225 link::#-step:: only affects the 'horiz' and 'vert' modes:
227 code::
229 var window, midispec;
230 midispec = [0,127,'linear',1].asSpec;
231 window = Window.new("step Knob", Rect(640,630,270,70)).front;
232 k = Knob.new(window, Rect(20,10,32,32));
233 k.action_({|v,x,y,m| midispec.map(v.value).postln; })
234        .value_(midispec.unmap(0));
236 k.mode = \vert;
239 k.step
240 k.step = 10/127 // step by 10
242 k.mode = \horiz;
243 k.mode = \round;
247 subsection:: mouseOverAction
249 code::
251 var size = 28;
252 w = Window.new("Knobs", Rect(250,500,270,70));
253 w.acceptsMouseOver=true; // must be true in parent window!
254 w.view.decorator = FlowLayout(w.view.bounds);
255 h = StaticText(w, 150 @ 20);
256 w.view.decorator.nextLine;
257 k = Array(8);
258 8.do({|item, i|
259     var knob;
260     knob = Knob.new(w, size @ size)
261         .action_({|v,x,y,m| h.string = "val: " ++ v.value.asString; })
262         .mouseOverAction_({|v,x,y| h.string = "val: " ++ v.value.asString; });
264     k = k.add(knob);
266 w.front
268 k[4].value
272 subsection:: Drag and Drop
274 code::
276 var w, txt, size = 36;
277 w = Window.new("Knobs", Rect(400,400,250,100)).front;
278 w.acceptsMouseOver=true;
279 w.view.decorator = FlowLayout(w.view.bounds).gap_(10 @ 10).margin_(10 @10);
280 txt = StaticText(w, 200 @ 14);
281 w.view.decorator.nextLine;
283 k = Knob(w, size @ size);
284 k.action = {arg v,x,y;  v.value.postln; txt.string_("value: " ++ v.value); };
285 k.mouseOverAction = {|v| txt.string_("value: " ++ v.value); };
287 j = Knob(w, size @ size);
288 j.action = {arg v,x,y;  j.value.postln; txt.string_("value: " ++ v.value); };
289 j.mouseOverAction = { txt.string_("value: " ++ j.value); };
291 n = NumberBox(w, 100 @ 20);
292 //n.setProperty(\boxColor,Color.grey(alpha:0.0));
293 n.value = 0.0;
296 // customize drag and drop methods
297 k.canReceiveDragHandler
298 k.canReceiveDragHandler = false; // don't accept drops
300 k.canReceiveDragHandler = { View.currentDrag.isFloat }; // accept only if drag is float
302 k.receiveDragHandler = { ("value dropped in: " ++ View.currentDrag).postln }
304 k.receiveDragHandler = { k.valueAction = View.currentDrag.clip(0.0, 1.0); }
306 k.beginDragAction = { ("drag out -> " ++ k.value).postln; }
308 k.beginDragAction = { k.value.asFloat; }