///Credit perchik ///Sourced from - http://forum.unity3d.com/threads/receive-onclick-event-and-pass-it-on-to-lower-ui-elements.293642/ using System.Collections.Generic; using System.Linq; namespace UnityEngine.UI.Extensions { public enum AutoCompleteSearchType { ArraySort, Linq } [RequireComponent(typeof(RectTransform))] [AddComponentMenu("UI/Extensions/AutoComplete ComboBox")] public class AutoCompleteComboBox : MonoBehaviour { public Color disabledTextColor; public DropDownListItem SelectedItem { get; private set; } //outside world gets to get this, not set it public List AvailableOptions; //private bool isInitialized = false; private bool _isPanelActive = false; private bool _hasDrawnOnce = false; private InputField _mainInput; private RectTransform _inputRT; //private Button _arrow_Button; private RectTransform _rectTransform; private RectTransform _overlayRT; private RectTransform _scrollPanelRT; private RectTransform _scrollBarRT; private RectTransform _slidingAreaRT; // private RectTransform scrollHandleRT; private RectTransform _itemsPanelRT; private Canvas _canvas; private RectTransform _canvasRT; private ScrollRect _scrollRect; private List _panelItems; //items that will get shown in the dropdown private List _prunedPanelItems; //items that used to show in the dropdown private Dictionary panelObjects; private GameObject itemTemplate; public string Text { get; private set; } [SerializeField] private float _scrollBarWidth = 20.0f; public float ScrollBarWidth { get { return _scrollBarWidth; } set { _scrollBarWidth = value; RedrawPanel(); } } // private int scrollOffset; //offset of the selected item // private int _selectedIndex = 0; [SerializeField] private int _itemsToDisplay; public int ItemsToDisplay { get { return _itemsToDisplay; } set { _itemsToDisplay = value; RedrawPanel(); } } public bool SelectFirstItemOnStart = false; [SerializeField] [Tooltip("Change input text color based on matching items")] private bool _ChangeInputTextColorBasedOnMatchingItems = false; public bool InputColorMatching{ get { return _ChangeInputTextColorBasedOnMatchingItems; } set { _ChangeInputTextColorBasedOnMatchingItems = value; if (_ChangeInputTextColorBasedOnMatchingItems) { SetInputTextColor (); } } } //TODO design as foldout for Inspector public Color ValidSelectionTextColor = Color.green; public Color MatchingItemsRemainingTextColor = Color.black; public Color NoItemsRemainingTextColor = Color.red; public AutoCompleteSearchType autocompleteSearchType = AutoCompleteSearchType.Linq; private bool _selectionIsValid = false; [System.Serializable] public class SelectionChangedEvent : UnityEngine.Events.UnityEvent { } [System.Serializable] public class SelectionTextChangedEvent : UnityEngine.Events.UnityEvent { } [System.Serializable] public class SelectionValidityChangedEvent : UnityEngine.Events.UnityEvent { } // fires when input text is changed; public SelectionTextChangedEvent OnSelectionTextChanged; // fires when when an Item gets selected / deselected (including when items are added/removed once this is possible) public SelectionValidityChangedEvent OnSelectionValidityChanged; // fires in both cases public SelectionChangedEvent OnSelectionChanged; public void Awake() { Initialize(); } public void Start() { if (SelectFirstItemOnStart && AvailableOptions.Count > 0) { ToggleDropdownPanel (false); OnItemClicked (AvailableOptions [0]); } } private bool Initialize() { bool success = true; try { _rectTransform = GetComponent(); _inputRT = _rectTransform.Find("InputField").GetComponent(); _mainInput = _inputRT.GetComponent(); //_arrow_Button = _rectTransform.FindChild ("ArrowBtn").GetComponent