4using System.Collections.Generic;
9 [RequireComponent(typeof(RectTransform))]
10 [AddComponentMenu(
"UI/Extensions/ComboBox")]
19 private float _scrollBarWidth = 20.0f;
22 private int _itemsToDisplay;
32 private bool _isPanelActive =
false;
33 private bool _hasDrawnOnce =
false;
35 private InputField _mainInput;
36 private RectTransform _inputRT;
39 private RectTransform _rectTransform;
41 private RectTransform _overlayRT;
42 private RectTransform _scrollPanelRT;
43 private RectTransform _scrollBarRT;
44 private RectTransform _slidingAreaRT;
46 private RectTransform _itemsPanelRT;
47 private Canvas _canvas;
48 private RectTransform _canvasRT;
50 private ScrollRect _scrollRect;
52 private List<string> _panelItems;
54 private Dictionary<string, GameObject> panelObjects;
56 private GameObject itemTemplate;
58 public string Text {
get;
private set; }
62 get {
return _scrollBarWidth; }
65 _scrollBarWidth = value;
75 get {
return _itemsToDisplay; }
78 _itemsToDisplay = value;
88 private bool Initialize()
93 _rectTransform = GetComponent<RectTransform>();
94 _inputRT = _rectTransform.Find(
"InputField").GetComponent<RectTransform>();
95 _mainInput = _inputRT.GetComponent<InputField>();
97 _overlayRT = _rectTransform.Find(
"Overlay").GetComponent<RectTransform>();
98 _overlayRT.gameObject.SetActive(
false);
101 _scrollPanelRT = _overlayRT.Find(
"ScrollPanel").GetComponent<RectTransform>();
102 _scrollBarRT = _scrollPanelRT.Find(
"Scrollbar").GetComponent<RectTransform>();
103 _slidingAreaRT = _scrollBarRT.Find(
"SlidingArea").GetComponent<RectTransform>();
105 _itemsPanelRT = _scrollPanelRT.Find(
"Items").GetComponent<RectTransform>();
108 _canvas = GetComponentInParent<Canvas>();
109 _canvasRT = _canvas.GetComponent<RectTransform>();
111 _scrollRect = _scrollPanelRT.GetComponent<ScrollRect>();
112 _scrollRect.scrollSensitivity = _rectTransform.sizeDelta.y / 2;
113 _scrollRect.movementType = ScrollRect.MovementType.Clamped;
114 _scrollRect.content = _itemsPanelRT;
116 itemTemplate = _rectTransform.Find(
"ItemTemplate").gameObject;
117 itemTemplate.SetActive(
false);
119 catch (System.NullReferenceException ex)
121 Debug.LogException(ex);
122 Debug.LogError(
"Something is setup incorrectly with the dropdownlist component causing a Null Reference Exception");
125 panelObjects =
new Dictionary<string, GameObject>();
166 private void RebuildPanel()
172 _panelItems.Add(option.ToLower());
176 List<GameObject> itemObjs =
new List<GameObject>(panelObjects.Values);
177 panelObjects.Clear();
182 GameObject newItem = Instantiate(itemTemplate) as GameObject;
183 newItem.name =
"Item " + indx;
184 newItem.transform.SetParent(_itemsPanelRT,
false);
185 itemObjs.Add(newItem);
189 for (
int i = 0; i < itemObjs.Count; i++)
194 itemObjs[i].name =
"Item " + i +
" " + _panelItems[i];
195 itemObjs[i].transform.Find(
"Text").GetComponent<
Text>().text = _panelItems[i];
198 itemBtn.onClick.RemoveAllListeners();
199 string textOfItem = _panelItems[i];
200 itemBtn.onClick.AddListener(() =>
202 OnItemClicked(textOfItem);
204 panelObjects[_panelItems[i]] = itemObjs[i];
213 private void OnItemClicked(
string item)
217 _mainInput.text =
Text;
250 private void RedrawPanel()
252 float scrollbarWidth = _panelItems.Count >
ItemsToDisplay ? _scrollBarWidth : 0f;
253 _scrollBarRT.gameObject.SetActive(_panelItems.Count >
ItemsToDisplay);
254 if (!_hasDrawnOnce || _rectTransform.sizeDelta != _inputRT.sizeDelta)
256 _hasDrawnOnce =
true;
257 _inputRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _rectTransform.sizeDelta.x);
258 _inputRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, _rectTransform.sizeDelta.y);
260 _scrollPanelRT.SetParent(transform,
true);
261 _scrollPanelRT.anchoredPosition =
new Vector2(0, -_rectTransform.sizeDelta.y);
264 _overlayRT.SetParent(_canvas.transform,
false);
265 _overlayRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _canvasRT.sizeDelta.x);
266 _overlayRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, _canvasRT.sizeDelta.y);
268 _overlayRT.SetParent(transform,
true);
269 _scrollPanelRT.SetParent(_overlayRT,
true);
272 if (_panelItems.Count < 1)
return;
274 float dropdownHeight = _rectTransform.sizeDelta.y * Mathf.Min(_itemsToDisplay, _panelItems.Count);
276 _scrollPanelRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
277 _scrollPanelRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _rectTransform.sizeDelta.x);
279 _itemsPanelRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _scrollPanelRT.sizeDelta.x - scrollbarWidth - 5);
280 _itemsPanelRT.anchoredPosition =
new Vector2(5, 0);
282 _scrollBarRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollbarWidth);
283 _scrollBarRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
285 _slidingAreaRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 0);
286 _slidingAreaRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight - _scrollBarRT.sizeDelta.x);
295 if (_panelItems.Count == 0)
297 _isPanelActive =
true;
300 else if (!_isPanelActive)
313 _isPanelActive = !_isPanelActive;
315 _overlayRT.gameObject.SetActive(_isPanelActive);
318 transform.SetAsLastSibling();
320 else if (directClick)
UnityEngine.UI.Button Button
void OnValueChanged(string currText)
SelectionChangedEvent OnSelectionChanged
void ToggleDropdownPanel(bool directClick)
Toggle the drop down list
List< string > AvailableOptions
DropDownListItem SelectedItem
Credit Erdener Gonenc - @PixelEnvision.