320 lines
7.3 KiB
Racket
320 lines
7.3 KiB
Racket
#lang scribble/manual
|
|
@(require (for-label racket))
|
|
|
|
@title{EZText}
|
|
Wrapper class for a label, a text field and a value@section{categories}
|
|
GUI>EZ-GUI
|
|
@section{related}
|
|
Classes/StaticText, Classes/TextField
|
|
|
|
@section{description}
|
|
|
|
EZText is a wrapper class which creates an (optional) link::Classes/StaticText::, and a link::Classes/TextField::. The value is displayed as a compileString in the text field for editing.
|
|
|
|
@section{subsection}
|
|
Some Important Issues Regarding EZText
|
|
If the parent is
|
|
@racketblock[nil::, then EZText will create its own link::Classes/Window::. See link::Classes/EZGui:: for more options.
|
|
|
|
]
|
|
@section{classmethods}
|
|
|
|
|
|
@section{subsection}
|
|
Creation / Class Methods
|
|
|
|
@section{method}
|
|
new
|
|
|
|
@section{argument}
|
|
parent
|
|
The parent view or window. If the parent is nil, then EZText will create its own link::Classes/Window::, and place it conveniently on the screen if the bounds are a link::Classes/Point::. If the bounds are a link::Classes/Rect::, then the link::Classes/Rect:: determines the window bounds.
|
|
|
|
@section{argument}
|
|
bounds
|
|
An instance of link::Classes/Rect:: or link::Classes/Point::. Default value is
|
|
@racketblock[160@20::.
|
|
|
|
]
|
|
@section{argument}
|
|
label
|
|
The label. Default value is
|
|
@racketblock[nil::. If ]
|
|
|
|
@racketblock[nil::, then no link::Classes/StaticText:: is created.
|
|
|
|
]
|
|
@section{argument}
|
|
action
|
|
A link::Classes/Function:: called when the value changes. The function is passed the EZText instance as its argument.
|
|
|
|
@section{argument}
|
|
initVal
|
|
The value to initialize the EZText with.
|
|
|
|
@section{argument}
|
|
initAction
|
|
A link::Classes/Boolean:: indicating whether the action function should be called when setting the initial value. The default is false.
|
|
|
|
@section{argument}
|
|
labelWidth
|
|
Number of pixels width for the label. The default is 60. In the
|
|
@racketblock[\horz:: layout, if you specify the ]
|
|
|
|
@racketblock[textWidth::, then the ]
|
|
|
|
@racketblock[labelWidth:: is ignored and is set to the ]
|
|
|
|
@racketblock[bounds.width - textWidth::.
|
|
|
|
]
|
|
@section{argument}
|
|
textWidth
|
|
Number of pixels width for the number box. The default is 45. In
|
|
@racketblock[\vert:: layout, ]
|
|
|
|
@racketblock[textWidth:: defaults to the ]
|
|
|
|
@racketblock[bounds.width::.
|
|
|
|
]
|
|
@section{argument}
|
|
labelHeight
|
|
Default is 20.
|
|
|
|
@section{argument}
|
|
layout
|
|
|
|
@racketblock[\vert::, or ]
|
|
|
|
@racketblock[\horz::. The default is ]
|
|
|
|
@racketblock[\horz::; ]
|
|
|
|
@racketblock[\vert:: is a two line version.
|
|
|
|
]
|
|
@section{argument}
|
|
gap
|
|
A link::Classes/Point::. By default, the view tries to get its parent's gap, otherwise it defaults to
|
|
@racketblock[2@2::. Setting it overrides these.
|
|
|
|
]
|
|
@section{argument}
|
|
margin
|
|
A link::Classes/Point::. This will inset the bounds occupied by the subviews of view.
|
|
|
|
@section{discussion}
|
|
|
|
Example:
|
|
|
|
@racketblock[
|
|
(
|
|
w = Window("EZText", Rect(300, 300, 260, 60)).front;
|
|
g = EZText( w, // parent
|
|
250@50, // bounds
|
|
"testing", // label
|
|
{ |ez| (ez.value.asString ++" is the value of " ++ ez).postln }, // action
|
|
[1, 2, 3], // initValue
|
|
true // initAction
|
|
);
|
|
g.setColors(Color.grey,Color.white);
|
|
);
|
|
|
|
// Simplest version, no parent view, so a window is created
|
|
(
|
|
g = EZText(label:" test ");
|
|
g.action_({ |ez| (ez.value.asString ++" is the value of " ++ ez).postln });
|
|
);
|
|
|
|
(
|
|
g = EZText(bounds: Rect( 100, 200, 150, 50), label:" test ", layout: \vert);
|
|
g.action_({ |ez| (ez.value.asString ++" is the value of " ++ ez).postln });
|
|
);
|
|
::
|
|
The contained views can be accessed via the EZText instance variables: ]
|
|
|
|
@racketblock[labelView::, ]
|
|
|
|
@racketblock[textField::.
|
|
|
|
]
|
|
@section{instancemethods}
|
|
|
|
|
|
@section{method}
|
|
textField
|
|
Returns the textField.
|
|
|
|
@section{method}
|
|
action
|
|
A link::Classes/Function:: to be evaluated when the value changes. Typical use is to type in a new value, and interpret it by hitting the evaluation shortcut. The first argument to the function will be the EZText.
|
|
|
|
@section{method}
|
|
value
|
|
Gets/sets the value of the ezText. Does not perform the action.
|
|
@section{argument}
|
|
inval
|
|
Any object.
|
|
|
|
@section{method}
|
|
valueAction
|
|
Sets the value and performs the action.
|
|
@section{argument}
|
|
val
|
|
Any object.
|
|
|
|
@section{method}
|
|
doAction
|
|
Performs the action.
|
|
|
|
@section{method}
|
|
enabled
|
|
Sets/gets whether the textfield is enabled.
|
|
@section{argument}
|
|
bool
|
|
An instance of link::Classes/Boolean::. Default is
|
|
@racketblock[true::.
|
|
|
|
|
|
]
|
|
@section{subsection}
|
|
Changing Appearance
|
|
|
|
@section{method}
|
|
setColors
|
|
@section{argument}
|
|
stringBackground
|
|
An instance of link::Classes/Color::. The
|
|
@racketblock[background:: of the label and unit views.
|
|
]
|
|
@section{argument}
|
|
stringColor
|
|
An instance of link::Classes/Color::. The
|
|
@racketblock[stringColor:: of the label and unit views.
|
|
]
|
|
@section{argument}
|
|
textBackground
|
|
An instance of link::Classes/Color::. The
|
|
@racketblock[background:: of the textField.
|
|
]
|
|
@section{argument}
|
|
textStringColor
|
|
An instance of link::Classes/Color::. The
|
|
@racketblock[stringColor:: of the textField.
|
|
]
|
|
@section{argument}
|
|
textNormalColor
|
|
An instance of link::Classes/Color::. The
|
|
@racketblock[normalColor:: of the textField.
|
|
]
|
|
@section{argument}
|
|
textTypingColor
|
|
An instance of link::Classes/Color::. The
|
|
@racketblock[typingColor:: of the textField.
|
|
]
|
|
@section{argument}
|
|
background
|
|
An instance of link::Classes/Color::. The
|
|
@racketblock[background:: of the enclosing view.
|
|
|
|
]
|
|
@section{method}
|
|
font
|
|
Set the Font used by all the views.
|
|
@section{argument}
|
|
font
|
|
An instance of link::Classes/Font::.
|
|
|
|
@section{examples}
|
|
|
|
|
|
@racketblock[
|
|
// Simplest version
|
|
( // basic use
|
|
w=Window("ez", Rect(300, 300, 300, 50)).front;
|
|
g=EZText(w, 290@40," test ", textWidth: 220,layout:\horz);
|
|
g.setColors(Color.grey,Color.white);
|
|
);
|
|
|
|
|
|
// lots of textFields on one window
|
|
(
|
|
w=Window.new.front;
|
|
w.view.decorator=FlowLayout(w.view.bounds);
|
|
w.view.decorator.gap=2@2;
|
|
|
|
40.do{
|
|
g=EZText(w, 170@16," test ", textWidth: 120,layout:\horz);
|
|
g.setColors(Color.grey, Color.white, Color.grey(0.8));
|
|
};
|
|
);
|
|
|
|
|
|
// click these parentheses to see three variants
|
|
(
|
|
|
|
m=nil;
|
|
m=2@2; //comment for no margin
|
|
|
|
/////////////////
|
|
/// Layout \horz
|
|
|
|
( // with label
|
|
g=EZText(nil, 170@20," freq ", textWidth:120,layout:\horz,margin:m);
|
|
g.setColors(Color.grey,Color.white,background: Color.grey(0.7));
|
|
g.window.bounds = g.window.bounds.moveBy(-180,50);
|
|
);
|
|
|
|
( // no label. use window name as label
|
|
g=EZText(nil, 120@20, layout:\horz,margin:m);
|
|
g.setColors(Color.grey,Color.white,background: Color.grey(0.7));
|
|
g.window.bounds = g.window.bounds.moveBy(-180, -90);
|
|
g.window.name="Freq";
|
|
);
|
|
|
|
/////////////////
|
|
/// Layout \vert
|
|
|
|
( // all features
|
|
g=EZText(nil, 120@60," freq ", textWidth: 120,layout: \vert, margin:m);
|
|
g.setColors(Color.grey,Color.white,background: Color.grey(0.7));
|
|
g.window.bounds = g.window.bounds.moveBy(100,50);
|
|
);
|
|
|
|
)
|
|
|
|
|
|
|
|
// Simplest sound example
|
|
(
|
|
Tdef(\text).set(\note, [0, 2, 7], \dur, { [0.1, 0.2].choose });
|
|
|
|
w = Window("EZTexts", Rect(200, 400, 304, 120)).front;
|
|
w.addFlowLayout;
|
|
|
|
TdefGui(Tdef(\text), 0, w);
|
|
Tdef(\text).envir.keysValuesDo { |k, v|
|
|
EZText(w, Rect(0,0,300,40), k, { |ez|
|
|
Tdef(\text).envir.put(*[k, ez.value].postcs);
|
|
}, v);
|
|
};
|
|
|
|
Tdef(\text, { |ev|
|
|
var mydur;
|
|
loop {
|
|
mydur = ev.dur;
|
|
(note: ev.note, dur: mydur).postln.play;
|
|
mydur.wait;
|
|
}
|
|
}).play;
|
|
)
|
|
|
|
// type these or similar functions into dur and note fields and evaluate:
|
|
|
|
{ [0.1, 0.2, 0.3].choose }
|
|
{ [ 0, 2, 7, 10 ].scramble.keep(rrand(0, 4)) }
|
|
::
|
|
]
|
|
|
|
|