public MenuViewMessage AuthorMessage(MenuModel model) { List <MenuItemViewMessage> itemMessages = new List <MenuItemViewMessage>(); for (int i = 0; i < model.Items.Count; ++i) { var item = model.Items[i]; bool selected = i == model.SelectedItemIdx; bool isEditing = selected && model.IsEditing; MenuItemViewMessage itemMessage; switch (item) { case UpMenuItem upMenuItem: itemMessage = MenuItemViewMessage.MakeUpLevelButton(upMenuItem.Label); break; case SubLevelMenuItem subLevelItem: itemMessage = MenuItemViewMessage.MakeSubLevelButton(subLevelItem.Label); break; case IRangeMenuItem rangeItem: itemMessage = MenuItemViewMessage.MakeRange(rangeItem.Label, rangeItem.Min, rangeItem.Max, rangeItem.Value, isEditing); break; case IToggleMenuItem toggleMenuItem: itemMessage = MenuItemViewMessage.MakeToggle(toggleMenuItem.Label, toggleMenuItem.IsSet); break; case ActionMenuItem actionMenuItem: itemMessage = MenuItemViewMessage.MakeActionButton(actionMenuItem.Label, actionMenuItem.RequiresMoreInformation); break; default: throw new InvalidOperationException(); } if (selected) { itemMessage.Active = true; } itemMessages.Add(itemMessage); } return(new MenuViewMessage { Items = itemMessages, Position = model.ScrollPosition }); }