CLASS:: PopUpMenu
summary:: A view displaying a text item selectable from a drop-down menu.
categories:: GUI>Views

DESCRIPTION::

When clicked, this view opens a menu containing several text items, then closes the menu and displays one of the items after it is selected.

CLASSMETHODS::

PRIVATE:: key




INSTANCEMETHODS::



SUBSECTION:: Data

METHOD:: items
	The list of items displayed in a menu when the view is clicked.

	argument::
		An Array of Strings or Symbols.

METHOD:: clear
 Removes all items.

METHOD:: item
	The currently selected item.

	returns::
		A String.

METHOD:: value
	The index of the currently selected item.

	argument::
		An integer, or nil meaning no selected item.

METHOD:: valueAction
	Sets link::#-value:: and triggers link::#-action::.

	argument::
		An integer, or nil meaning no selected item.



SUBSECTION:: Appearance

METHOD:: stringColor
	The color used to display text.

	argument::
		A Color.

METHOD:: background
	Setting this variable colors the area of the view under the text with the given color.

	argument::
		A Color.



SUBSECTION:: Interaction

METHOD:: allowsReselection
	Determines whether the action is triggered when selecting already selected item. Defaults to false.

	argument::
		A Boolean.



SUBSECTION:: Actions

METHOD:: action
	The action object evaluated whenever the user changes the selected item from the menu. See link::#-allowsReselection:: for customization.



SUBSECTION:: Drag and drop

METHOD:: defaultGetDrag
	returns::
		The link::#-value::.

METHOD:: defaultCanReceiveDrag
	returns::
		True if the current drag data is a number.

METHOD:: defaultReceiveDrag
	Sets link::#-valueAction:: to the current drag data.



EXAMPLES::

subsection:: Basic Example

code::
(
w = Window.new("The Eightfold Path").front;
m = PopUpMenu(w, Rect(10, 10, 180, 20));

m.items = [
 "right view", "right thinking", "right mindfulness", "right speech",
 "right action", "right diligence", "right concentration", "right livelihood"
];

m.background_(Color.green(0.7));  // only changes the look of displayed item
m.stringColor_(Color.white);   // only changes the look of displayed item
m.font_(Font("Courier", 13));   // only changes the look of displayed item
m.action = { arg menu;
 [menu.value, menu.item].postln;
};
)

m.value;   // returns the index of the current item;
m.item;    // returns the String or Symbol of the current item

m.value_(2);  // changes the displayed item, but does not evaluate the action
m.valueAction_(3); // evaluates the action.
::

subsection:: Sound Example

Play different functions:

code::
(
s.waitForBoot({

 var w, menu, snd, funcs, b;

 w = Window.new.front;

 menu = PopUpMenu(w, Rect(10, 10, 90, 20))
  .items_(["Sine", "Saw" , "Noise" , "Pulse"]);

 funcs = [
  { SinOsc.ar(440, 0, 0.3) },
  { Saw.ar(440, 0.3) },
  { WhiteNoise.ar(0.3) },
  { Pulse.ar(440, 0.2, 0.3) }
 ];

 b = Button(w, Rect(110, 10, 180, 20))
  .states_([["play", Color.black, Color.green]])
  .mouseDownAction_({
    snd = funcs.at(menu.value).play;
   })
  .action_({ arg butt, mod;
    snd.release;
   });

 w.front;

 p = CmdPeriod.add({ b.value_(0) }); // set button to 0 on hitting Cmd-period
 w.onClose_{ snd.release; CmdPeriod.removeAll }; // clean up when window is closed

})
)
::
