Skip to content

MenuListItem

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


// 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);

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());
}
};

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;

Constructor Description
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.
Parameter Type Description
text string The text on the left side of the item.
items List<string> The selectable values. Provide at least one. The list is copied.
index int The index selected at the start. Must be valid for items.
description string Shown below the menu while the item is highlighted.

Property Type Default value Description
ListIndex int index argument The selected index.
ListItems MenuItemList copy of items The selectable values. Keep at least one. Used like a List<string>, and a List<string> can be assigned to it.
HideArrowsWhenNotSelected bool false Hides the left and right arrows while the item is not highlighted.
ShowColorPanel bool false Shows the color panel.
ShowOpacityPanel bool false Shows the opacity panel.
ColorPanelColorType ColorPanelType ColorPanelType.Hair Which palette the color panel shows.
OpacityPercent int 0 The opacity shown when both panels are on. Clamped to 0 to 100.
ItemsCount int 0 Read only. The number of values in ListItems.


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];

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

Type Default Example
ColorPanelType.Hair Yes Hair color panel
ColorPanelType.Makeup No Makeup 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);

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
});