123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #if UNITY_EDITOR
- using System;
- using System.Linq;
-
- namespace UnityEngine.InputSystem.Editor
- {
- [Serializable]
- internal class AdvancedDropdownState
- {
- [Serializable]
- private class AdvancedDropdownItemState
- {
- public AdvancedDropdownItemState(AdvancedDropdownItem item)
- {
- itemId = item.id;
- }
-
- public int itemId;
- public int selectedIndex = -1;
- public Vector2 scroll;
- }
-
- [SerializeField]
- private AdvancedDropdownItemState[] states = new AdvancedDropdownItemState[0];
- private AdvancedDropdownItemState m_LastSelectedState;
-
- private AdvancedDropdownItemState GetStateForItem(AdvancedDropdownItem item)
- {
- if (m_LastSelectedState != null && m_LastSelectedState.itemId == item.id)
- return m_LastSelectedState;
- for (int i = 0; i < states.Length; i++)
- {
- if (states[i].itemId == item.id)
- {
- m_LastSelectedState = states[i];
- return m_LastSelectedState;
- }
- }
- Array.Resize(ref states, states.Length + 1);
- states[states.Length - 1] = new AdvancedDropdownItemState(item);
- m_LastSelectedState = states[states.Length - 1];
- return states[states.Length - 1];
- }
-
- internal void MoveDownSelection(AdvancedDropdownItem item)
- {
- var state = GetStateForItem(item);
- var selectedIndex = state.selectedIndex;
- do
- {
- ++selectedIndex;
- }
- while (selectedIndex < item.children.Count() && item.children.ElementAt(selectedIndex).IsSeparator());
-
- if (selectedIndex >= item.children.Count())
- selectedIndex = 0;
-
- if (selectedIndex < item.children.Count())
- SetSelectionOnItem(item, selectedIndex);
- }
-
- internal void MoveUpSelection(AdvancedDropdownItem item)
- {
- var state = GetStateForItem(item);
- var selectedIndex = state.selectedIndex;
- do
- {
- --selectedIndex;
- }
- while (selectedIndex >= 0 && item.children.ElementAt(selectedIndex).IsSeparator());
-
- if (selectedIndex < 0)
- selectedIndex = item.children.Count() - 1;
-
- if (selectedIndex >= 0)
- SetSelectionOnItem(item, selectedIndex);
- }
-
- internal void SetSelectionOnItem(AdvancedDropdownItem item, int selectedIndex)
- {
- var state = GetStateForItem(item);
-
- if (selectedIndex < 0)
- {
- state.selectedIndex = 0;
- }
- else if (selectedIndex >= item.children.Count())
- {
- state.selectedIndex = item.children.Count() - 1;
- }
- else
- {
- state.selectedIndex = selectedIndex;
- }
- }
-
- internal void ClearSelectionOnItem(AdvancedDropdownItem item)
- {
- GetStateForItem(item).selectedIndex = -1;
- }
-
- internal int GetSelectedIndex(AdvancedDropdownItem item)
- {
- return GetStateForItem(item).selectedIndex;
- }
-
- internal void SetSelectedIndex(AdvancedDropdownItem item, int index)
- {
- GetStateForItem(item).selectedIndex = index;
- }
-
- internal AdvancedDropdownItem GetSelectedChild(AdvancedDropdownItem item)
- {
- var index = GetSelectedIndex(item);
- if (!item.children.Any() || index < 0 || index >= item.children.Count())
- return null;
- return item.children.ElementAt(index);
- }
-
- internal Vector2 GetScrollState(AdvancedDropdownItem item)
- {
- return GetStateForItem(item).scroll;
- }
-
- internal void SetScrollState(AdvancedDropdownItem item, Vector2 scrollState)
- {
- GetStateForItem(item).scroll = scrollState;
- }
- }
- }
-
- #endif // UNITY_EDITOR
|