Custom application menus
Basics
You can add new entries into main menu and game menu. Custom menu entries are currently only supported in Desktop mode.
To add new custom menu entries, implement appropriate menu script/plugin functions. Functions should return list of items that will be addded to a menu. Playnite passes GetGameMenuItemsArgs and GetMainMenuItemsArgs objects when the menu function is called.
You can use those argument objects to decide what elements to return. For example, in case of game menu, GetGameMenuItemsArgs
contains Games
field listing all currently selected games that are being used as a source for the game menu.
When the function associated with the menu item is invoked, it will be passed an arguments object. For game menu actions, C# extensions will be passed GameMenuItemActionArgs and script extensions will be passed ScriptGameMenuItemActionArgs. GameMenuItemActionArgs
has a Games
property to access the selected list of games. For main menu actions, C# extensions will be passed MainMenuItemActionArgs and script extensions will be passed ScriptMainMenuItemActionArgs.
Note
Get*MenuItems
menu methods are executed each time a menu is opened. For that reason, make sure you are not executing long running code in those methods. It would otherwise result in a noticeable delay when opening the menu.
// To add new game menu items override GetGameMenuItems
public override IEnumerable<GameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs args)
{
yield return new GameMenuItem
{
Description = "Name of game menu item",
Action = (args) =>
{
// use args.Games to get list of games attached to the menu source
Console.WriteLine("Invoked from game menu item!");
}
};
}
// To add new main menu items override GetMainMenuItems
public override IEnumerable<MainMenuItem> GetMainMenuItems(GetMainMenuItemsArgs args)
{
yield return new MainMenuItem
{
Description = "Name of main menu item",
Action = (args) => Console.WriteLine("Invoked from main menu item!")
};
}
Sub sections
You can add sub sections to menus by assigning MenuSection
property, sections can be nested. Sub sections are shared between extensions allowing multiple extensions to add items to a single sub section.
To add a menu item under single sub section, assign a string value: Section name
.
To add nested sections, separate definition with pipes: Section name|Sub section name
.
To add items under "Extensions" main menu section, add @
to the beginning of the section definition.
public override IEnumerable<MainMenuItem> GetMainMenuItems(GetMainMenuItemsArgs args)
{
// Added into "Extensions" menu
yield return new MainMenuItem
{
MenuSection = "@"
};
// Added into "Extensions -> submenu" menu
yield return new MainMenuItem
{
MenuSection = "@submenu"
};
// Added into "Extensions -> submenu -> submenu2" menu
yield return new MainMenuItem
{
MenuSection = "@submenu|submenu2"
};
// Added into "submenu -> submenu2" menu
yield return new MainMenuItem
{
MenuSection = "submenu|submenu2"
};
}
Icons
To add an icon to a menu item, assign a value to Icon
property of menu item. Currently supported values are:
- Full path to an image file.
- Theme relative file path to an image file.
- Key of an application resource.
Separators
To add a separator, return new menu item with Description
field se to -
.
new GameMenuItem { Description = "-" }