// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; using System.Collections.Generic; using System.Linq; using FlaxEngine; using FlaxEngine.GUI; namespace FlaxEditor.GUI.ContextMenu { /// /// Context menu single select group. /// [HideInEditor] class ContextMenuSingleSelectGroup { public struct SingleSelectGroupItem { public string text; public U value; public Action onSelected; public List buttons; } private List _menus = new List(); private List> _items = new List>(); public Action OnSelectionChanged; public SingleSelectGroupItem activeItem; public ContextMenuSingleSelectGroup AddItem(string text, T value, Action onSelected = null) { var item = new SingleSelectGroupItem { text = text, value = value, onSelected = onSelected, buttons = new List() }; _items.Add(item); foreach (var contextMenu in _menus) AddItemToContextMenu(contextMenu, item); return this; } public ContextMenuSingleSelectGroup AddItemsToContextMenu(ContextMenu contextMenu) { _menus.Add(contextMenu); for (int i = 0; i < _items.Count; i++) { AddItemToContextMenu(contextMenu, _items[i]); } return this; } private void AddItemToContextMenu(ContextMenu contextMenu, SingleSelectGroupItem item) { var btn = contextMenu.AddButton(item.text, () => { SetItemAsActive(item); }); item.buttons.Add(btn); if (item.Equals(activeItem)) { btn.Checked = true; } } private void DeselectAll() { foreach (var item in _items) { foreach (var btn in item.buttons) btn.Checked = false; } } public void SetItemAsActive(T value) { var index = _items.FindIndex(x => x.value.Equals(value)); if (index == -1) return; SetItemAsActive(_items[index]); } private void SetItemAsActive(SingleSelectGroupItem item) { DeselectAll(); activeItem = item; var index = _items.IndexOf(item); OnSelectionChanged?.Invoke(item.value); item.onSelected?.Invoke(); foreach (var btn in item.buttons) { btn.Checked = true; } } } }