TITLE:: MainMenu
summary:: A manager for sclang's application-level menu
categories:: GUI
related:: Classes/MenuAction, Classes/ToolBar, Classes/MainMenu

DESCRIPTION::
This class allows control over items displayed in the sclang application-level menu. Application-level menus may not exist depending on platform — in particular, macOS and some Linux window managers have it, but Windows does not. On platforms without this feature, the methods in this class simply don't do anything.

note:: This is the menu for the sclang application, not the IDE. ::

CODE::
(
~testTone = MenuAction("Test Tone", {
	{ SinOsc.ar(400) * 0.1 }.play;
});

MainMenu.register(~testTone, "Tests");

// MainMenu.unregister(~testTone); // to remove
)
::

CLASSMETHODS::

METHOD:: register
	Register a MenuAction to a main application menu. This menu item will exist for the duration of the app, or until .unregister is called for the action.

	ARGUMENT:: action
		A link::Classes/MenuAction::.
	ARGUMENT:: menu
		A String, representing the name of the top-level menu to contain the action.
	ARGUMENT:: group
		An optional string. Action will be placed in a section of the menu with other members of the same group, with a separator between items of other groups.

	DISCUSSION::
		MainMenu.register provides an easy way to register global menu items, in a way that helps avoid disrupting menus registered by other SuperCollider components.

		If you want to register menus for personal use, add the registration calls to your startup.scd file. This will ensure the menus are created automatically on launch.

		If you're registering menu actions for a Quark or other component intended for distribution, be sure to be polite and thoughtful about where you're registering actions.

		Avoid creating new top-level menus if possible - instead, try to use one of the following canonical menus to register your actions. Add your actions to a group to ensure you don't collide with actions from another component:
		LIST::
			## File
			## Edit
			## Server
			## Quarks
			## Help
		::

		If registering menu items for a Quark, consider registering as a sub-menu of the Quarks menu. This can easily be done using the link::Classes/MainMenu#registerQuarkMenu:: method.

METHOD:: registerQuarkMenu
	Convenience method for registering a menu of functionality related to a Quark.
	It will appear as a sub-menu under the main Quarks menu.

	ARGUMENT:: quarkName
		A String, the name of the quark
	ARGUMENT:: menu
		A link::Classes/Menu::, a menu.

METHOD:: unregister
	Remove a MenuAction that has been registered previously.
	NOTE::
		It is usually disruptive and confusing to add and remove menu items dynamically.
		If you're registering a menu item that should only sometimes be available, consider disabling it using code::menuAction.enabled = false;:: rather than removing it.
	::

	ARGUMENT::
		A MenuAction.

METHOD:: otherMenus
	A list of menus to append to the set of main application menus.

	WARNING::This is intended for standalone SuperCollider applications, and should not be used to register menus during normal SC usage.::

METHOD:: applicationMenu
	The main SuperCollider application menu.

	WARNING::This is intended for standalone SuperCollider applications, and should not be used to register menus during normal SC usage.::

EXAMPLES::

code::
(
~show = MenuAction("Show Window", {
	~window ?? {
		~window = TextView().string_("Here it goes!").minSize_(300@200);
		~window.onClose = { ~window = nil };
		~window.front;
	}
});
~hide = MenuAction("Hide Window", {
	~window !? {
		~window.close();
		~window = nil;
	}
});

MainMenu.register(Menu(~show, ~hide).title_("My Quark"), "Quarks", "My Quark")
)
::
