vMenu Docs
API ReferenceMenu Items

MenuListItem

A menu item that picks one string out of a list with left and right. Pressing select raises a separate event.

A menu item that picks one string out of a list with left and right. Pressing select raises a separate event.


Example usage

// A list (of strings) containing all selectable values.
// Note: At least one value must be provided.
List<string> values = new List<string>() {
    "Option 1",
    "Option 2",
    "Option 3"
};

// Specify the index which will be used when the item is visible by default.
// Value must be a valid index value for the given values list.
int currentIndex = 0; // ("Option 1")

MenuListItem item = new MenuListItem("Item Text", values, currentIndex, "Item description");

// Add a menu item to a menu:
menu.AddMenuItem(item);

Reacting to a list item

List items raise one event when the value changes and another when the item is pressed. The list wraps around at both ends.

MenuListItem weather = new MenuListItem("Weather", new List<string>() { "CLEAR", "RAIN", "THUNDER" }, 0, "Pick a weather type.");
menu.AddMenuItem(weather);

// Fires every time the user presses left or right on the item.
menu.OnListIndexChange += (_menu, _listItem, _oldIndex, _newIndex, _itemIndex) =>
{
    if (_listItem == weather)
    {
        Debug.WriteLine($"Weather preview: {_listItem.ListItems[_newIndex]}");
    }
};

// Fires when the user presses select on the item.
menu.OnListItemSelect += (_menu, _listItem, _listIndex, _itemIndex) =>
{
    if (_listItem == weather)
    {
        SetWeatherTypeNow(_listItem.GetCurrentSelection());
    }
};

Changing the values later

ListItems is a MenuItemList, used like a List<string>. It tells the menu when it changes, so the row redraws straight away. An out of range ListIndex is wrapped back into range the next time the row is drawn.

item.ListItems.Add("Option 4");
item.ListItems.RemoveAt(0);

// Or replace the lot. A List<string> can be assigned straight to it.
item.ListItems = newValues;
item.ListIndex = 0;

The constructor copies the list you pass, so later changes to your own list do not reach the item. Change item.ListItems instead. See the Migration Guide (v4) when moving from an older MenuAPI.

Never leave ListItems empty. MenuAPI then inserts a single "N/A" value to keep the game from freezing, and the item reads N/A.


Constructors

ConstructorDescription
MenuListItem(string text, List<string> items, int index)Creates a list item without a description.
MenuListItem(string text, List<string> items, int index, string description)Creates a list item with a description.
ParameterTypeDescription
textstringThe text on the left side of the item.
itemsList<string>The selectable values. Provide at least one. The list is copied.
indexintThe index selected at the start. Must be valid for items.
descriptionstringShown below the menu while the item is highlighted.

Properties

RightIcon and Label are not available for MenuListItems.

PropertyTypeDefault valueDescription
ListIndexintindex argumentThe selected index.
ListItemsMenuItemListcopy of itemsThe selectable values. Keep at least one. Used like a List<string>, and a List<string> can be assigned to it.
HideArrowsWhenNotSelectedboolfalseHides the left and right arrows while the item is not highlighted.
ShowColorPanelboolfalseShows the color panel.
ShowOpacityPanelboolfalseShows the opacity panel.
ColorPanelColorTypeColorPanelTypeColorPanelType.HairWhich palette the color panel shows.
OpacityPercentint0The opacity shown when both panels are on. Clamped to 0 to 100.
ItemsCountint0Read only. The number of values in ListItems.

Methods


GetCurrentSelection()

Returns the value at ListIndex as a string, or null if ListIndex is out of range.

string selected = item.GetCurrentSelection();

// This is the same as:
string alsoSelected = item.ListItems[item.ListIndex];

Color panel types

The color panel is drawn below the menu, under the description. The enum is MenuListItem.ColorPanelType.

TypeDefaultExample
ColorPanelType.HairYesHair color panel
ColorPanelType.MakeupNoMakeup color panel

The panel always shows the game's 64 hair or makeup colors and highlights the swatch at ListIndex. Give the list 64 values, one per color, or the highlight and your list drift apart.

// A hair color palette (64 colors).
List<string> colors = new List<string>();
for (int i = 0; i < 64; i++)
{
    colors.Add($"Color #{i}");
}

MenuListItem hairColors = new MenuListItem("Hair Color", colors, 0, "Hair color palette.")
{
    ShowColorPanel = true
};
menu.AddMenuItem(hairColors);

// The same, but with the makeup palette.
MenuListItem makeupColors = new MenuListItem("Makeup Color", colors, 0, "Makeup color palette.")
{
    ShowColorPanel = true,
    ColorPanelColorType = MenuListItem.ColorPanelType.Makeup
};
menu.AddMenuItem(makeupColors);

Opacity panel example

The opacity panel is also drawn below the menu, under the description.

Opacity panel

The percentage shown is ListIndex * 10, so 11 values cover 0% to 100%.

List<string> opacities = new List<string>();
for (int i = 0; i < 11; i++)
{
    opacities.Add($"Opacity {i * 10}%");
}

menu.AddMenuItem(new MenuListItem("Opacity", opacities, 0, "Set an opacity.")
{
    ShowOpacityPanel = true
});

With both ShowColorPanel and ShowOpacityPanel on, one panel shows the palette with an opacity bar. ListIndex then picks the color, and the opacity comes from OpacityPercent instead of ListIndex * 10.

On this page