EnvirGui display the contents of an environment for editing
Inherits from: Object
EnvirGui displays all keys and values of an environment, so one can change them
flexibly. Single number get displayed with an EZSlider, pairs of numbers with an
EZRanger, and anything else is shown as an EZText (a text field).
See also: EZText, TdefEditor, PdefEditor
Creation / Class Methods
*new (envir, parent, bounds, name, num, makeSkip)
create a new EnvirGui
envir - the envir to display
parent - the parent view to display in; if none is given, a new window is created.
bounds - the bounds within which to display; if none is given, bounds are calculated.
name - a name to use for the envir/gui; is used for the auto-created window.
num - the number of items to display. If an envir is given, and no num, num is envir.size.
makeSkip - flag whether to make a skipjack to manage updates of the envirgui. default is true.
// simple example
g = EnvirGui.new;
g.envir_((a: 1, b: \werty, freq: [500, 2000])); // explanation
g.envir.put(\karl, \otto);
g.parent.close;
Class Variables
labelWidth a classvar that sets how wide the labels will become. Default is 60.
valWidth a classvar that sets how wide the valFields will become. Default is 200.
Instance Variables
parent the envirgui's parent view or window.
bounds the envirgui's bounds
name the name to display one the parent (if it is a window)
num how many envir items to display - if the envir has more,
they can be shown with a scroller (see scrolly)
envir the envir displayed
zone the composite view the envirgui makes for itself
valFields the areas in which the key value pairs are displayed.
widgets the EZGuis that display the values:
Single numbers will have an EZSlider,
pairs if numbers an EZRanger,
all other values are shown as compileStrings in an EZText.
skin the GUI skin to be used in displaying.
specs EZSlider and EZRanger needs specs for their display ranges;
if there is a global spec for that key (key.asSpec), it will be used.
If not, a spec is generated (see the getSpec method) and kept in these (local) specs.
skip the SkipJack used for updating the gui.
If there are more keys/values than valFields to display them,
the follwing vars play a role:
currKeys the keys currently displayed
scrolly the EZScroller used to access different keys/values
keysRotation
the amount of rotation of the keys displayed;
e.g. with 10 keys displayed on 5 valFields,
keysRotation 0 means show keys (0..4),
keysRotation 2 means show keys (2..6), etc.
Some Methods
envir_ (invir) set the environment to show
invir - Explanation of invir. Default value is nil. Other information.
// inline example
g = EnvirGui.new;
g.envir_((a: 1, b: [2, 3], c: \symbol, d: [4, 5, 6], f: { "boing".postln }))
getSpec (key, value)
Short prose description of method.
key - Explanation of key. Default value is nil. Other information.
value - Explanation of value. Default value is nil. Other information.
// inline example
g = EnvirGui.new;
g.getSpec(\freq, 400); // \freq exists as global spec, so use that
g.envir_((freq: 150));
g.getSpec(\myFreak, 500); // no global spec, so make a new one:
// exponential from val * 0.05 to val * 20;
g.specs; // and keep it here
g.envir.put(\myFreak, 500);
putSpec (key, obj) add a spec for a given key,
or (if it is a global key) override a global spec with a local one:
g.putSpec(\myFreak, [10, 1000, \exp]);
g.putSpec(\freq, [100, 1000, \exp]);
g.envir_((freq: 200, myFreak: 20));
Some internal methods:
checkUpdate update the gui display (called regularly by skip)
setField (index, key, value, sameKey)
set a field by index, with the new key, value;
sameKey means the field had the same key already.
setByKeys update the widgets for the current keys
clearField (index) remove the EZGui at this index
clearFields remove all unused EZGuis
Examples
// Setting envir variables in a Tdef:
(
Tdef(\text).set(\note, [0, 2, 7], \dur, { [0.1, 0.2, 0.4].choose }, \pan, 0, \amp, 0.1);
w = Window("EZTexts", Rect(200, 400, 304, 120)).front;
w.addFlowLayout;
TdefEditor(Tdef(\text), 0, w: w);
EnvirGui(Tdef(\text).envir, parent: w);
Tdef(\text, { |ev|
var mydur;
loop {
mydur = ev.dur;
(note: ev.note, dur: mydur, amp: ev.amp, pan: ev.pan).postln.play;
mydur.wait;
}
}).play;
)