A game about forced loneliness, made by TACStudios
1#if UNITY_EDITOR 2using System; 3using System.Linq; 4 5namespace UnityEngine.InputSystem.Editor 6{ 7 [Serializable] 8 internal class AdvancedDropdownState 9 { 10 [Serializable] 11 private class AdvancedDropdownItemState 12 { 13 public AdvancedDropdownItemState(AdvancedDropdownItem item) 14 { 15 itemId = item.id; 16 } 17 18 public int itemId; 19 public int selectedIndex = -1; 20 public Vector2 scroll; 21 } 22 23 [SerializeField] 24 private AdvancedDropdownItemState[] states = new AdvancedDropdownItemState[0]; 25 private AdvancedDropdownItemState m_LastSelectedState; 26 27 private AdvancedDropdownItemState GetStateForItem(AdvancedDropdownItem item) 28 { 29 if (m_LastSelectedState != null && m_LastSelectedState.itemId == item.id) 30 return m_LastSelectedState; 31 for (int i = 0; i < states.Length; i++) 32 { 33 if (states[i].itemId == item.id) 34 { 35 m_LastSelectedState = states[i]; 36 return m_LastSelectedState; 37 } 38 } 39 Array.Resize(ref states, states.Length + 1); 40 states[states.Length - 1] = new AdvancedDropdownItemState(item); 41 m_LastSelectedState = states[states.Length - 1]; 42 return states[states.Length - 1]; 43 } 44 45 internal void MoveDownSelection(AdvancedDropdownItem item) 46 { 47 var state = GetStateForItem(item); 48 var selectedIndex = state.selectedIndex; 49 do 50 { 51 ++selectedIndex; 52 } 53 while (selectedIndex < item.children.Count() && item.children.ElementAt(selectedIndex).IsSeparator()); 54 55 if (selectedIndex >= item.children.Count()) 56 selectedIndex = 0; 57 58 if (selectedIndex < item.children.Count()) 59 SetSelectionOnItem(item, selectedIndex); 60 } 61 62 internal void MoveUpSelection(AdvancedDropdownItem item) 63 { 64 var state = GetStateForItem(item); 65 var selectedIndex = state.selectedIndex; 66 do 67 { 68 --selectedIndex; 69 } 70 while (selectedIndex >= 0 && item.children.ElementAt(selectedIndex).IsSeparator()); 71 72 if (selectedIndex < 0) 73 selectedIndex = item.children.Count() - 1; 74 75 if (selectedIndex >= 0) 76 SetSelectionOnItem(item, selectedIndex); 77 } 78 79 internal void SetSelectionOnItem(AdvancedDropdownItem item, int selectedIndex) 80 { 81 var state = GetStateForItem(item); 82 83 if (selectedIndex < 0) 84 { 85 state.selectedIndex = 0; 86 } 87 else if (selectedIndex >= item.children.Count()) 88 { 89 state.selectedIndex = item.children.Count() - 1; 90 } 91 else 92 { 93 state.selectedIndex = selectedIndex; 94 } 95 } 96 97 internal void ClearSelectionOnItem(AdvancedDropdownItem item) 98 { 99 GetStateForItem(item).selectedIndex = -1; 100 } 101 102 internal int GetSelectedIndex(AdvancedDropdownItem item) 103 { 104 return GetStateForItem(item).selectedIndex; 105 } 106 107 internal void SetSelectedIndex(AdvancedDropdownItem item, int index) 108 { 109 GetStateForItem(item).selectedIndex = index; 110 } 111 112 internal AdvancedDropdownItem GetSelectedChild(AdvancedDropdownItem item) 113 { 114 var index = GetSelectedIndex(item); 115 if (!item.children.Any() || index < 0 || index >= item.children.Count()) 116 return null; 117 return item.children.ElementAt(index); 118 } 119 120 internal Vector2 GetScrollState(AdvancedDropdownItem item) 121 { 122 return GetStateForItem(item).scroll; 123 } 124 125 internal void SetScrollState(AdvancedDropdownItem item, Vector2 scrollState) 126 { 127 GetStateForItem(item).scroll = scrollState; 128 } 129 } 130} 131 132#endif // UNITY_EDITOR