4using System.Collections.Generic;
15 [RequireComponent(typeof(RectTransform))]
16 [AddComponentMenu(
"UI/Extensions/AutoComplete ComboBox")]
25 private bool _isPanelActive =
false;
26 private bool _hasDrawnOnce =
false;
28 private InputField _mainInput;
29 private RectTransform _inputRT;
33 private RectTransform _rectTransform;
35 private RectTransform _overlayRT;
36 private RectTransform _scrollPanelRT;
37 private RectTransform _scrollBarRT;
38 private RectTransform _slidingAreaRT;
40 private RectTransform _itemsPanelRT;
41 private Canvas _canvas;
42 private RectTransform _canvasRT;
44 private ScrollRect _scrollRect;
46 private List<string> _panelItems;
47 private List<string> _prunedPanelItems;
49 private Dictionary<string, GameObject> panelObjects;
51 private GameObject itemTemplate;
53 public string Text {
get;
private set; }
56 private float _scrollBarWidth = 20.0f;
59 get {
return _scrollBarWidth; }
62 _scrollBarWidth = value;
71 private int _itemsToDisplay;
74 get {
return _itemsToDisplay; }
77 _itemsToDisplay = value;
85 [Tooltip(
"Change input text color based on matching items")]
86 private bool _ChangeInputTextColorBasedOnMatchingItems =
false;
88 get {
return _ChangeInputTextColorBasedOnMatchingItems; }
91 _ChangeInputTextColorBasedOnMatchingItems = value;
92 if (_ChangeInputTextColorBasedOnMatchingItems) {
105 private bool _selectionIsValid =
false;
107 [System.Serializable]
111 [System.Serializable]
115 [System.Serializable]
138 private bool Initialize()
143 _rectTransform = GetComponent<RectTransform>();
144 _inputRT = _rectTransform.Find(
"InputField").GetComponent<RectTransform>();
145 _mainInput = _inputRT.GetComponent<InputField>();
149 _overlayRT = _rectTransform.Find(
"Overlay").GetComponent<RectTransform>();
150 _overlayRT.gameObject.SetActive(
false);
153 _scrollPanelRT = _overlayRT.Find(
"ScrollPanel").GetComponent<RectTransform>();
154 _scrollBarRT = _scrollPanelRT.Find(
"Scrollbar").GetComponent<RectTransform>();
155 _slidingAreaRT = _scrollBarRT.Find(
"SlidingArea").GetComponent<RectTransform>();
157 _itemsPanelRT = _scrollPanelRT.Find(
"Items").GetComponent<RectTransform>();
160 _canvas = GetComponentInParent<Canvas>();
161 _canvasRT = _canvas.GetComponent<RectTransform>();
163 _scrollRect = _scrollPanelRT.GetComponent<ScrollRect>();
164 _scrollRect.scrollSensitivity = _rectTransform.sizeDelta.y / 2;
165 _scrollRect.movementType = ScrollRect.MovementType.Clamped;
166 _scrollRect.content = _itemsPanelRT;
168 itemTemplate = _rectTransform.Find(
"ItemTemplate").gameObject;
169 itemTemplate.SetActive(
false);
171 catch (System.NullReferenceException ex)
173 Debug.LogException(ex);
174 Debug.LogError(
"Something is setup incorrectly with the dropdownlist component causing a Null Reference Exception");
177 panelObjects =
new Dictionary<string, GameObject>();
179 _prunedPanelItems =
new List<string>();
180 _panelItems =
new List<string>();
219 private void RebuildPanel()
223 _prunedPanelItems.Clear();
224 panelObjects.Clear();
228 _panelItems.Add(option.ToLower());
231 List<GameObject> itemObjs =
new List<GameObject>(panelObjects.Values);
236 GameObject newItem = Instantiate(itemTemplate) as GameObject;
237 newItem.name =
"Item " + indx;
238 newItem.transform.SetParent(_itemsPanelRT,
false);
239 itemObjs.Add(newItem);
243 for (
int i = 0; i < itemObjs.Count; i++)
248 itemObjs[i].name =
"Item " + i +
" " + _panelItems[i];
249 itemObjs[i].transform.Find(
"Text").GetComponent<
Text>().text = _panelItems[i];
252 itemBtn.onClick.RemoveAllListeners();
253 string textOfItem = _panelItems[i];
254 itemBtn.onClick.AddListener(() =>
256 OnItemClicked(textOfItem);
258 panelObjects[_panelItems[i]] = itemObjs[i];
261 SetInputTextColor ();
268 private void OnItemClicked(
string item)
272 _mainInput.text =
Text;
305 private void RedrawPanel()
307 float scrollbarWidth = _panelItems.Count >
ItemsToDisplay ? _scrollBarWidth : 0f;
308 _scrollBarRT.gameObject.SetActive(_panelItems.Count >
ItemsToDisplay);
309 if (!_hasDrawnOnce || _rectTransform.sizeDelta != _inputRT.sizeDelta)
311 _hasDrawnOnce =
true;
312 _inputRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _rectTransform.sizeDelta.x);
313 _inputRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, _rectTransform.sizeDelta.y);
315 _scrollPanelRT.SetParent(transform,
true);
316 _scrollPanelRT.anchoredPosition =
new Vector2(0, -_rectTransform.sizeDelta.y);
319 _overlayRT.SetParent(_canvas.transform,
false);
320 _overlayRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _canvasRT.sizeDelta.x);
321 _overlayRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, _canvasRT.sizeDelta.y);
323 _overlayRT.SetParent(transform,
true);
324 _scrollPanelRT.SetParent(_overlayRT,
true);
327 if (_panelItems.Count < 1)
return;
329 float dropdownHeight = _rectTransform.sizeDelta.y * Mathf.Min(_itemsToDisplay, _panelItems.Count);
331 _scrollPanelRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
332 _scrollPanelRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _rectTransform.sizeDelta.x);
334 _itemsPanelRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _scrollPanelRT.sizeDelta.x - scrollbarWidth - 5);
335 _itemsPanelRT.anchoredPosition =
new Vector2(5, 0);
337 _scrollBarRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollbarWidth);
338 _scrollBarRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
340 _slidingAreaRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 0);
341 _slidingAreaRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight - _scrollBarRT.sizeDelta.x);
347 PruneItems(currText);
351 if (_panelItems.Count == 0)
353 _isPanelActive =
true;
356 else if (!_isPanelActive)
361 bool validity_changed = (_panelItems.Contains (
Text) != _selectionIsValid);
362 _selectionIsValid = _panelItems.Contains (
Text);
365 if(validity_changed){
369 SetInputTextColor ();
372 private void SetInputTextColor(){
374 if (_selectionIsValid) {
376 }
else if (_panelItems.Count > 0) {
392 _isPanelActive = !_isPanelActive;
394 _overlayRT.gameObject.SetActive(_isPanelActive);
397 transform.SetAsLastSibling();
399 else if (directClick)
405 private void PruneItems(
string currText)
409 PruneItemsLinq(currText);
413 PruneItemsArray(currText);
417 private void PruneItemsLinq(
string currText)
419 currText = currText.ToLower();
420 var toPrune = _panelItems.Where(x => !x.Contains(currText)).ToArray();
421 foreach (
string key
in toPrune)
423 panelObjects[key].SetActive(
false);
424 _panelItems.Remove(key);
425 _prunedPanelItems.Add(key);
428 var toAddBack = _prunedPanelItems.Where(x => x.Contains(currText)).ToArray();
429 foreach (
string key
in toAddBack)
431 panelObjects[key].SetActive(
true);
432 _panelItems.Add(key);
433 _prunedPanelItems.Remove(key);
438 private void PruneItemsArray(
string currText)
440 string _currText = currText.ToLower();
442 for (
int i = _panelItems.Count - 1; i >= 0; i--)
444 string _item = _panelItems[i];
445 if (!_item.Contains(_currText))
447 panelObjects[_panelItems[i]].SetActive(
false);
448 _panelItems.RemoveAt(i);
449 _prunedPanelItems.Add(_item);
452 for (
int i = _prunedPanelItems.Count - 1; i >= 0; i--)
454 string _item = _prunedPanelItems[i];
455 if (_item.Contains(_currText))
457 panelObjects[_prunedPanelItems[i]].SetActive(
true);
458 _prunedPanelItems.RemoveAt(i);
459 _panelItems.Add(_item);
UnityEngine.UI.Button Button
Color MatchingItemsRemainingTextColor
bool SelectFirstItemOnStart
AutoCompleteSearchType autocompleteSearchType
Color NoItemsRemainingTextColor
SelectionChangedEvent OnSelectionChanged
DropDownListItem SelectedItem
SelectionTextChangedEvent OnSelectionTextChanged
void OnValueChanged(string currText)
List< string > AvailableOptions
Color ValidSelectionTextColor
void ToggleDropdownPanel(bool directClick)
Toggle the drop down list
SelectionValidityChangedEvent OnSelectionValidityChanged
Credit Erdener Gonenc - @PixelEnvision.