5using System.Collections.Generic;
12 [RequireComponent(typeof(RectTransform))]
13 [AddComponentMenu(
"UI/Extensions/Dropdown List")]
19 public List<DropDownListItem>
Items;
23 private bool _isPanelActive =
false;
24 private bool _hasDrawnOnce =
false;
28 private RectTransform _rectTransform;
30 private RectTransform _overlayRT;
31 private RectTransform _scrollPanelRT;
32 private RectTransform _scrollBarRT;
33 private RectTransform _slidingAreaRT;
35 private RectTransform _itemsPanelRT;
36 private Canvas _canvas;
37 private RectTransform _canvasRT;
39 private ScrollRect _scrollRect;
41 private List<DropDownListButton> _panelItems;
43 private GameObject _itemTemplate;
46 private float _scrollBarWidth = 20.0f;
49 get {
return _scrollBarWidth; }
52 _scrollBarWidth = value;
58 private int _selectedIndex = -1;
62 private int _itemsToDisplay;
65 get {
return _itemsToDisplay; }
68 _itemsToDisplay = value;
91 private bool Initialize()
96 _rectTransform = GetComponent<RectTransform>();
99 _overlayRT = _rectTransform.Find(
"Overlay").GetComponent<RectTransform>();
100 _overlayRT.gameObject.SetActive(
false);
103 _scrollPanelRT = _overlayRT.Find(
"ScrollPanel").GetComponent<RectTransform>();
104 _scrollBarRT = _scrollPanelRT.Find(
"Scrollbar").GetComponent<RectTransform>();
105 _slidingAreaRT = _scrollBarRT.Find(
"SlidingArea").GetComponent<RectTransform>();
107 _itemsPanelRT = _scrollPanelRT.Find(
"Items").GetComponent<RectTransform>();
110 _canvas = GetComponentInParent<Canvas>();
111 _canvasRT = _canvas.GetComponent<RectTransform>();
113 _scrollRect = _scrollPanelRT.GetComponent<ScrollRect>();
114 _scrollRect.scrollSensitivity = _rectTransform.sizeDelta.y / 2;
115 _scrollRect.movementType = ScrollRect.MovementType.Clamped;
116 _scrollRect.content = _itemsPanelRT;
119 _itemTemplate = _rectTransform.Find(
"ItemTemplate").gameObject;
120 _itemTemplate.SetActive(
false);
122 catch (System.NullReferenceException ex)
124 Debug.LogException(ex);
125 Debug.LogError(
"Something is setup incorrectly with the dropdownlist component causing a Null Reference Exception");
129 _panelItems =
new List<DropDownListButton>();
168 private void RebuildPanel()
170 if (
Items.Count == 0)
return;
172 int indx = _panelItems.Count;
173 while (_panelItems.Count <
Items.Count)
175 GameObject newItem = Instantiate(_itemTemplate) as GameObject;
176 newItem.name =
"Item " + indx;
177 newItem.transform.SetParent(_itemsPanelRT,
false);
179 _panelItems.Add(
new DropDownListButton(newItem));
182 for (
int i = 0; i < _panelItems.Count; i++)
186 DropDownListItem item =
Items[i];
188 _panelItems[i].txt.text = item.Caption;
191 if (_panelItems[i].btnImg !=
null) _panelItems[i].btnImg.sprite =
null;
192 _panelItems[i].img.sprite = item.Image;
193 _panelItems[i].img.color = (item.Image ==
null) ?
new Color(1, 1, 1, 0)
194 : item.IsDisabled ?
new Color(1, 1, 1, .5f)
197 _panelItems[i].btn.onClick.RemoveAllListeners();
198 _panelItems[i].btn.onClick.AddListener(() =>
201 if (item.OnSelect !=
null) item.OnSelect();
204 _panelItems[i].gameobject.SetActive(i <
Items.Count);
208 private void OnItemClicked(
int indx)
213 _selectedIndex = indx;
218 private void UpdateSelected()
227 _mainButton.
img.color =
Color.white;
234 _mainButton.
img.sprite =
null;
243 for (
int i = 0; i < _itemsPanelRT.childCount; i++)
245 _panelItems[i].btnImg.color = (_selectedIndex == i) ? _mainButton.
btn.colors.highlightedColor :
new Color(0, 0, 0, 0);
251 private void RedrawPanel()
255 if (!_hasDrawnOnce || _rectTransform.sizeDelta != _mainButton.
rectTransform.sizeDelta)
257 _hasDrawnOnce =
true;
258 _mainButton.
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _rectTransform.sizeDelta.x);
259 _mainButton.
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, _rectTransform.sizeDelta.y);
260 _mainButton.
txt.rectTransform.offsetMax =
new Vector2(4, 0);
262 _scrollPanelRT.SetParent(transform,
true);
263 _scrollPanelRT.anchoredPosition =
new Vector2(0, -_rectTransform.sizeDelta.y);
266 _overlayRT.SetParent(_canvas.transform,
false);
267 _overlayRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _canvasRT.sizeDelta.x);
268 _overlayRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, _canvasRT.sizeDelta.y);
270 _overlayRT.SetParent(transform,
true);
271 _scrollPanelRT.SetParent(_overlayRT,
true);
274 if (
Items.Count < 1)
return;
276 float dropdownHeight = _rectTransform.sizeDelta.y * Mathf.Min(_itemsToDisplay,
Items.Count);
278 _scrollPanelRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
279 _scrollPanelRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _rectTransform.sizeDelta.x);
281 _itemsPanelRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, _scrollPanelRT.sizeDelta.x - scrollbarWidth - 5);
282 _itemsPanelRT.anchoredPosition =
new Vector2(5, 0);
284 _scrollBarRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollbarWidth);
285 _scrollBarRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
287 _slidingAreaRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 0);
288 _slidingAreaRT.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight - _scrollBarRT.sizeDelta.x);
297 _overlayRT.transform.localScale =
new Vector3(1, 1, 1);
298 _scrollBarRT.transform.localScale =
new Vector3(1, 1, 1);
299 _isPanelActive = !_isPanelActive;
300 _overlayRT.gameObject.SetActive(_isPanelActive);
303 transform.SetAsLastSibling();
305 else if (directClick)
Extension to the UI class which creates a dropdown list
void ToggleDropdownPanel(bool directClick)
Toggle the drop down list
SelectionChangedEvent OnSelectionChanged
bool SelectFirstItemOnStart
DropDownListItem SelectedItem
List< DropDownListItem > Items
string Caption
Caption of the Item
Sprite Image
Image component of the Item
Credit Erdener Gonenc - @PixelEnvision.