292 lines
7.1 KiB
Text
292 lines
7.1 KiB
Text
|
#lang scribble/manual
|
||
|
@(require (for-label racket))
|
||
|
|
||
|
@title{EZPopUpMenu}
|
||
|
A wrapper class for a label plus a popUpMenu with per item actions@section{categories}
|
||
|
GUI>EZ-GUI
|
||
|
@section{related}
|
||
|
Classes/PopUpMenu
|
||
|
|
||
|
@section{description}
|
||
|
|
||
|
EZPopUpMenu is wrapper class which creates an (optional) label and a popUpMenu. It includes per item actions as well as a global action which are both evaluated upon selection of an item. Convenience methods for inserting and deleting menu items are also included . If the parent is nil, then EZPopUpMenu will create its own window.See link::Classes/EZGui:: and link::Classes/EZLists:: for all of the options.
|
||
|
|
||
|
@section{subsection}
|
||
|
Some Important Issues Regarding EZPopUpMenu
|
||
|
The convenience methods for EZPopUpMenu require that the items array is an array of associations of labels and functions, not like in link::Classes/PopUpMenu::, where items is simply an array of strings. If
|
||
|
@racketblock[label:: is ]
|
||
|
|
||
|
@racketblock[nil::, then no staticText is created.
|
||
|
|
||
|
]
|
||
|
@section{classmethods}
|
||
|
|
||
|
@section{method}
|
||
|
new
|
||
|
|
||
|
@section{argument}
|
||
|
parentView
|
||
|
The parent view or window. If the parent is nil, then EZPopUpMenu 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@22::.
|
||
|
|
||
|
]
|
||
|
@section{argument}
|
||
|
label
|
||
|
The label. Default value is
|
||
|
@racketblock[nil::. If ]
|
||
|
|
||
|
@racketblock[nil::, then no link::Classes/StaticText:: is created.
|
||
|
|
||
|
]
|
||
|
@section{argument}
|
||
|
items
|
||
|
Default value is
|
||
|
@racketblock[nil::. An link::Classes/Array:: of link::Classes/Association::s ]
|
||
|
|
||
|
@racketblock[ ['label' -> { arg menuObj; value }, ] ::. Or and link::Classes/Array:: link::Classes/Symbol::s (if you are only using ]
|
||
|
|
||
|
@racketblock[globalAction::).
|
||
|
|
||
|
]
|
||
|
@section{argument}
|
||
|
globalAction
|
||
|
A global function to be performed in addition to the item functions
|
||
|
@racketblock[ { arg menuObj; value } ::.
|
||
|
|
||
|
]
|
||
|
@section{argument}
|
||
|
initVal
|
||
|
Initial value of the menu, i.e. the index selected. Default value is 0.
|
||
|
|
||
|
@section{argument}
|
||
|
initAction
|
||
|
An instance of link::Classes/Boolean::. Performs the action at
|
||
|
@racketblock[initVal:: on creation of the menu, plus the ]
|
||
|
|
||
|
@racketblock[globalAction::. Default value is ]
|
||
|
|
||
|
@racketblock[false::.
|
||
|
|
||
|
]
|
||
|
@section{argument}
|
||
|
labelWidth
|
||
|
Default value is 80.
|
||
|
|
||
|
@section{argument}
|
||
|
labelHeight
|
||
|
Default value is 20. Not used if layout is
|
||
|
@racketblock[\horz::.
|
||
|
|
||
|
]
|
||
|
@section{argument}
|
||
|
layout
|
||
|
|
||
|
@racketblock[\vert:: or ]
|
||
|
|
||
|
@racketblock[\horz::. default is ]
|
||
|
|
||
|
@racketblock[\horz::.
|
||
|
|
||
|
]
|
||
|
@section{argument}
|
||
|
gap
|
||
|
A link::Classes/Point::. By default, the view tries to get its parent's
|
||
|
@racketblock[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}
|
||
|
|
||
|
|
||
|
@racketblock[
|
||
|
(
|
||
|
w = Window.new.front;
|
||
|
w.view.decorator = FlowLayout(w.view.bounds);
|
||
|
g = EZPopUpMenu.new(
|
||
|
w,
|
||
|
230@22,
|
||
|
"A PopUpMenu: ",
|
||
|
[
|
||
|
\item0 ->{|a| ("this is item 0 of " ++ a).postln},
|
||
|
\item1 ->{|a| ("this is item 1 of " ++ a).postln},
|
||
|
\item2 ->{|a| ("this is item 2 of " ++ a).postln},
|
||
|
],
|
||
|
globalAction: {|a| ("this is a global action of "++a.asString ).postln},
|
||
|
initVal: 1,
|
||
|
initAction: true,
|
||
|
labelWidth: 120,
|
||
|
labelHeight: 20,
|
||
|
layout: \horz,
|
||
|
gap: 2@2
|
||
|
);
|
||
|
)
|
||
|
|
||
|
// or a more simple syntax:
|
||
|
(
|
||
|
w = Window.new.front;
|
||
|
w.view.decorator = FlowLayout(w.view.bounds);
|
||
|
g = EZPopUpMenu.new(w, 200@22, "Menu: ");
|
||
|
g.addItem(\item0, { |a| ("this is item 0 of " ++ a).postln });
|
||
|
g.addItem(\item1, { |a| ("this is item 1 of " ++ a).postln });
|
||
|
g.addItem(\item2, { |a| ("this is item 2 of " ++ a).postln });
|
||
|
g.value = 0;
|
||
|
)
|
||
|
::
|
||
|
|
||
|
]
|
||
|
@section{instancemethods}
|
||
|
|
||
|
|
||
|
@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}
|
||
|
menuBackground
|
||
|
An instance of link::Classes/Color::. The
|
||
|
@racketblock[background:: of the menu.
|
||
|
]
|
||
|
@section{argument}
|
||
|
menuStringColor
|
||
|
An instance of link::Classes/Color::. The
|
||
|
@racketblock[stringColor:: of the menu.
|
||
|
]
|
||
|
@section{argument}
|
||
|
background
|
||
|
An instance of link::Classes/Color::. The
|
||
|
@racketblock[background:: of the list view.
|
||
|
|
||
|
]
|
||
|
@section{method}
|
||
|
font
|
||
|
Set the link::Classes/Font:: used by all the views.
|
||
|
@section{argument}
|
||
|
font
|
||
|
An instance of link::Classes/Font::.
|
||
|
|
||
|
@section{examples}
|
||
|
|
||
|
|
||
|
@racketblock[
|
||
|
// try several examples together
|
||
|
(
|
||
|
|
||
|
// many menus
|
||
|
// inherits the parent's decorator gap
|
||
|
|
||
|
(
|
||
|
w=Window.new("oscillators", Rect(200,500,200,160)).front;
|
||
|
w.view.decorator = FlowLayout(w.view.bounds).gap_(2@2);
|
||
|
5.do{|i|
|
||
|
g = EZPopUpMenu.new(w,190@22, "Oscillator % : ".format(i+1));
|
||
|
g.addItem(\off, {"off". postln});
|
||
|
g.addItem(\sine, {"sine". postln});
|
||
|
g.addItem(\saw, {"saw". postln});
|
||
|
g.addItem(\pulse, {"pulse". postln});
|
||
|
g.setColors(Color.grey,Color.white);
|
||
|
g.value=0;
|
||
|
};
|
||
|
w.bounds=w.bounds.moveBy(300,60);
|
||
|
);
|
||
|
|
||
|
|
||
|
// Creates its own window if parentView is nil:
|
||
|
(
|
||
|
g = EZPopUpMenu.new(nil,250@22 ," Select : ");
|
||
|
g.addItem(\item0, {"this is item 0". postln});
|
||
|
g.addItem(\item1, {"this is item 1". postln});
|
||
|
g.addItem(\item2, {"this is item 2". postln});
|
||
|
g.setColors(Color.grey,Color.white);
|
||
|
g.value=0;
|
||
|
|
||
|
);
|
||
|
|
||
|
// layout vertical:
|
||
|
(
|
||
|
g = EZPopUpMenu.new(nil,200@42, " Choose",layout:\vert);
|
||
|
g.addItem(\item0, {"this is item 0". postln});
|
||
|
g.addItem(\item1, {"this is item 1". postln});
|
||
|
g.addItem(\item2, {"this is item 2". postln});
|
||
|
g.setColors(Color.grey,Color.white);
|
||
|
g.window.bounds=g.window.bounds.moveBy(300,-200);
|
||
|
g.value=0;
|
||
|
);
|
||
|
|
||
|
// No labelView created, so set the window title;
|
||
|
(
|
||
|
g = EZPopUpMenu.new(bounds:180@22); // no label
|
||
|
g.addItem(\item0, {"this is item 0". postln});
|
||
|
g.addItem(\item1, {"this is item 1". postln});
|
||
|
g.addItem(\item2, {"this is item 2". postln});
|
||
|
g.value=0;
|
||
|
g.window.name=" choose item";
|
||
|
g.window.bounds=g.window.bounds.moveBy(0,-200);
|
||
|
);
|
||
|
)
|
||
|
// insertItem;
|
||
|
|
||
|
(
|
||
|
g = EZPopUpMenu.new(nil,200@22, "Menu:");
|
||
|
g.addItem(\item0, {"this is item 0". postln});
|
||
|
g.addItem(\item1, {"this is item 1". postln});
|
||
|
g.addItem(\item2, {"this is item 2". postln});
|
||
|
g.addItem(\item4, {"this is item 4". postln});
|
||
|
g.value=0;
|
||
|
);
|
||
|
|
||
|
g.insertItem(3, \item3, {"this is item 3". postln});
|
||
|
|
||
|
|
||
|
// remove Item ;
|
||
|
|
||
|
(
|
||
|
w=Window.new.front;
|
||
|
w.view.decorator = FlowLayout(w.view.bounds);
|
||
|
g = EZPopUpMenu.new(w,200@22, "Menu:");
|
||
|
g.addItem(\item0, {"this is item 0". postln});
|
||
|
g.addItem(\item1, {"this is item 1". postln});
|
||
|
g.addItem(\item2, {"this is item 2". postln});
|
||
|
g.addItem(\item4, {"this is item 4". postln});
|
||
|
g.insertItem(3, \item3, {"this is item 3". postln});
|
||
|
g.value=0;
|
||
|
)
|
||
|
|
||
|
g. removeItemAt(0);
|
||
|
|
||
|
|
||
|
|
||
|
// replace item;
|
||
|
(
|
||
|
g = EZPopUpMenu.new(nil,200@22, "List:");
|
||
|
g.addItem(\item0, {"this is item 0". postln});
|
||
|
g.addItem(\item1, {"this is item 1". postln});
|
||
|
g.addItem(\item2, {"this is item 2". postln});
|
||
|
g.addItem(\item3, {"this is item 3". postln});
|
||
|
)
|
||
|
|
||
|
g.replaceItemAt(2, \item2_replaced, {"this is item 2 replaced". postln});
|
||
|
::
|
||
|
]
|
||
|
|
||
|
|