vMenu Docs
API ReferenceMenu Items

MenuDynamicListItem

A list item without a fixed list. Left and right call your callback, and the string it returns becomes the displayed value. Pressing select raises a separate…

A list item without a fixed list. Left and right call your callback, and the string it returns becomes the displayed value. Pressing select raises a separate event.


Example usage

// The title for the menu item.
string title = "Dynamic list item.";

// The initial selected list item text.
string initialSelectedText = "0";

// Create the callback function for when the left/right arrow
// keys are pressed. Returning a new string value which will become the new
// selected text.
string ChangeCallback(MenuDynamicListItem item, bool left)
{
    // Left will be true when the left arrow key was pressed
    // and false if the right arrow key was pressed.
    if (left)
        return (int.Parse(item.CurrentItem) - 1).ToString();

    return (int.Parse(item.CurrentItem) + 1).ToString();
}

// Use the ChangeCallback function from above to create a new callback delegate.
MenuDynamicListItem.ChangeItemCallback callback = new MenuDynamicListItem.ChangeItemCallback(ChangeCallback);

// optional description
string description = "Description for this dynamic item. Pressing left will make the value smaller, pressing right will make the value bigger.";

// Create the dynamic list item using the variables above.
MenuDynamicListItem dynList = new MenuDynamicListItem(title, initialSelectedText, callback, description);

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

A clamped counter

The callback can clamp, step or format the value however you like.

string VolumeCallback(MenuDynamicListItem item, bool left)
{
    int value = int.Parse(item.CurrentItem.Replace("%", ""));
    value = MathUtil.Clamp(left ? value - 5 : value + 5, 0, 100);
    return $"{value}%";
}

menu.AddMenuItem(new MenuDynamicListItem(
    "Volume",
    "50%",
    new MenuDynamicListItem.ChangeItemCallback(VolumeCallback),
    "Changes in steps of 5%, between 0% and 100%."
));

Reacting to a dynamic list item

// Fires after your callback returned a new value.
menu.OnDynamicListItemCurrentItemChange += (_menu, _item, _oldValue, _newValue) =>
{
    Debug.WriteLine($"'{_item.Text}' went from {_oldValue} to {_newValue}.");
};

// Fires when the user presses select on the item.
menu.OnDynamicListItemSelect += (_menu, _item, _currentItem) =>
{
    Debug.WriteLine($"'{_item.Text}' was pressed while showing {_currentItem}.");
};

Callback is called without a null check, so it must never be null. Returning null from it makes the item show N/A.


Constructors

ConstructorDescription
MenuDynamicListItem(string text, string initialValue, ChangeItemCallback callback)Creates a dynamic list item without a description.
MenuDynamicListItem(string text, string initialValue, ChangeItemCallback callback, string description)Creates a dynamic list item with a description.
ParameterTypeDescription
textstringThe text on the left side of the item.
initialValuestringThe value shown before the user changes anything.
callbackChangeItemCallbackReturns the next value.
descriptionstringShown below the menu while the item is highlighted.

ChangeItemCallback

public delegate string ChangeItemCallback(MenuDynamicListItem item, bool left);

Runs on every left or right press. The returned string becomes the new CurrentItem.

ParameterTypeDescription
itemMenuDynamicListItemThe item being changed. item.CurrentItem holds the current value.
leftboolTrue for the left control, false for the right control.

Properties

RightIcon and Label are not available for MenuDynamicListItems.

PropertyTypeDefault valueDescription
HideArrowsWhenNotSelectedboolfalseHides the left and right arrows while the item is not highlighted.
CurrentItemstringinitialValue argumentThe value being displayed. Can be set.
CallbackChangeItemCallbackcallback argumentCalled on left and right to get the next value.

Methods

MenuDynamicListItem has no methods of its own.

On this page