You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
681 lines
24 KiB
681 lines
24 KiB
using UnityEngine; |
|
using System; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using UnityEngine.UI; |
|
|
|
[RequireComponent(typeof(RectTransform))] |
|
public class ComboBox : MonoBehaviour |
|
{ |
|
public Sprite Sprite_UISprite; |
|
public Sprite Sprite_Background; |
|
|
|
public Action<int> OnSelectionChanged; |
|
|
|
[SerializeField] |
|
private bool _interactable = true; |
|
public bool Interactable |
|
{ |
|
get |
|
{ |
|
return _interactable; |
|
} |
|
set |
|
{ |
|
_interactable = value; |
|
var button = comboButtonRectTransform.GetComponent<Button>(); |
|
button.interactable = _interactable; |
|
var image = comboImageRectTransform.GetComponent<Image>(); |
|
image.color = image.sprite == null ? new Color(1.0f, 1.0f, 1.0f, 0.0f) : _interactable ? button.colors.normalColor : button.colors.disabledColor; |
|
if (!Application.isPlaying) |
|
return; |
|
if (!_interactable && overlayGO.activeSelf) |
|
ToggleComboBox(false); |
|
} |
|
} |
|
|
|
[SerializeField] |
|
private int _itemsToDisplay = 4; |
|
public int ItemsToDisplay |
|
{ |
|
get |
|
{ |
|
return _itemsToDisplay; |
|
} |
|
set |
|
{ |
|
if (_itemsToDisplay == value) |
|
return; |
|
_itemsToDisplay = value; |
|
Refresh(); |
|
} |
|
} |
|
|
|
[SerializeField] |
|
private bool _hideFirstItem; |
|
public bool HideFirstItem |
|
{ |
|
get |
|
{ |
|
return _hideFirstItem; |
|
} |
|
set |
|
{ |
|
if (value) |
|
scrollOffset--; |
|
else |
|
scrollOffset++; |
|
_hideFirstItem = value; |
|
Refresh(); |
|
} |
|
} |
|
|
|
[SerializeField] |
|
private int _selectedIndex = 0; |
|
public int SelectedIndex |
|
{ |
|
get |
|
{ |
|
return _selectedIndex; |
|
} |
|
set |
|
{ |
|
if (_selectedIndex == value) |
|
return; |
|
if (value > -1 && value < Items.Length) |
|
{ |
|
_selectedIndex = value; |
|
RefreshSelected(); |
|
} |
|
} |
|
} |
|
|
|
[SerializeField] |
|
private ComboBoxItem[] _items; |
|
public ComboBoxItem[] Items |
|
{ |
|
get |
|
{ |
|
if (_items == null) |
|
_items = new ComboBoxItem[0]; |
|
return _items; |
|
} |
|
set |
|
{ |
|
_items = value; |
|
Refresh(); |
|
} |
|
} |
|
|
|
private GameObject overlayGO; |
|
private int scrollOffset; |
|
private float _scrollbarWidth = 20.0f; |
|
|
|
private RectTransform _rectTransform; |
|
private RectTransform rectTransform |
|
{ |
|
get |
|
{ |
|
if (_rectTransform == null) |
|
_rectTransform = GetComponent<RectTransform>(); |
|
return _rectTransform; |
|
} |
|
set |
|
{ |
|
_rectTransform = value; |
|
} |
|
} |
|
|
|
private RectTransform _buttonRectTransform; |
|
private RectTransform buttonRectTransform |
|
{ |
|
get |
|
{ |
|
if (_buttonRectTransform == null) |
|
_buttonRectTransform = rectTransform.Find("Button").GetComponent<RectTransform>(); |
|
return _buttonRectTransform; |
|
} |
|
set |
|
{ |
|
_buttonRectTransform = value; |
|
} |
|
} |
|
|
|
private RectTransform _comboButtonRectTransform; |
|
private RectTransform comboButtonRectTransform |
|
{ |
|
get |
|
{ |
|
if (_comboButtonRectTransform == null) |
|
_comboButtonRectTransform = buttonRectTransform.Find("ComboButton").GetComponent<RectTransform>(); |
|
return _comboButtonRectTransform; |
|
} |
|
set |
|
{ |
|
_comboButtonRectTransform = value; |
|
} |
|
} |
|
|
|
private RectTransform _comboImageRectTransform; |
|
private RectTransform comboImageRectTransform |
|
{ |
|
get |
|
{ |
|
if (_comboImageRectTransform == null) |
|
_comboImageRectTransform = comboButtonRectTransform.Find("Image").GetComponent<RectTransform>(); |
|
return _comboImageRectTransform; |
|
} |
|
set |
|
{ |
|
_comboImageRectTransform = value; |
|
} |
|
} |
|
|
|
private RectTransform _comboTextRectTransform; |
|
private RectTransform comboTextRectTransform |
|
{ |
|
get |
|
{ |
|
if (_comboTextRectTransform == null) |
|
_comboTextRectTransform = comboButtonRectTransform.Find("Text").GetComponent<RectTransform>(); |
|
return _comboTextRectTransform; |
|
} |
|
set |
|
{ |
|
_comboTextRectTransform = value; |
|
} |
|
} |
|
|
|
private RectTransform _comboArrowRectTransform; |
|
private RectTransform comboArrowRectTransform |
|
{ |
|
get |
|
{ |
|
if (_comboArrowRectTransform == null) |
|
_comboArrowRectTransform = buttonRectTransform.Find("Arrow").GetComponent<RectTransform>(); |
|
return _comboArrowRectTransform; |
|
} |
|
set |
|
{ |
|
_comboArrowRectTransform = value; |
|
} |
|
} |
|
|
|
private RectTransform _scrollPanelRectTransfrom; |
|
private RectTransform scrollPanelRectTransfrom |
|
{ |
|
get |
|
{ |
|
if (_scrollPanelRectTransfrom == null) |
|
_scrollPanelRectTransfrom = rectTransform.Find("Overlay/ScrollPanel").GetComponent<RectTransform>(); |
|
return _scrollPanelRectTransfrom; |
|
} |
|
set |
|
{ |
|
_scrollPanelRectTransfrom = value; |
|
} |
|
} |
|
|
|
private RectTransform _itemsRectTransfrom; |
|
private RectTransform itemsRectTransfrom |
|
{ |
|
get |
|
{ |
|
if (_itemsRectTransfrom == null) |
|
_itemsRectTransfrom = scrollPanelRectTransfrom.Find("Items").GetComponent<RectTransform>(); |
|
return _itemsRectTransfrom; |
|
} |
|
set |
|
{ |
|
_itemsRectTransfrom = value; |
|
} |
|
} |
|
|
|
private RectTransform _scrollbarRectTransfrom; |
|
private RectTransform scrollbarRectTransfrom |
|
{ |
|
get |
|
{ |
|
if (_scrollbarRectTransfrom == null) |
|
_scrollbarRectTransfrom = scrollPanelRectTransfrom.Find("Scrollbar").GetComponent<RectTransform>(); |
|
return _scrollbarRectTransfrom; |
|
} |
|
set |
|
{ |
|
_scrollbarRectTransfrom = value; |
|
} |
|
} |
|
|
|
private RectTransform _slidingAreaRectTransform; |
|
private RectTransform slidingAreaRectTransform |
|
{ |
|
get |
|
{ |
|
if (_slidingAreaRectTransform == null) |
|
_slidingAreaRectTransform = scrollbarRectTransfrom.Find("SlidingArea").GetComponent<RectTransform>(); |
|
return _slidingAreaRectTransform; |
|
} |
|
set |
|
{ |
|
_slidingAreaRectTransform = value; |
|
} |
|
} |
|
|
|
private RectTransform _handleRectTransfrom; |
|
private RectTransform handleRectTransfrom |
|
{ |
|
get |
|
{ |
|
if (_handleRectTransfrom == null) |
|
_handleRectTransfrom = slidingAreaRectTransform.Find("Handle").GetComponent<RectTransform>(); |
|
return _handleRectTransfrom; |
|
} |
|
set |
|
{ |
|
_handleRectTransfrom = value; |
|
} |
|
} |
|
|
|
private void Awake() |
|
{ |
|
InitControl(); |
|
} |
|
|
|
public void OnItemClicked(int index) |
|
{ |
|
var selectionChanged = index != SelectedIndex; |
|
SelectedIndex = index; |
|
ToggleComboBox(true); |
|
if (selectionChanged && OnSelectionChanged != null) |
|
OnSelectionChanged(index); |
|
} |
|
|
|
public void AddItems(params object[] list) |
|
{ |
|
var cbItems = new List<ComboBoxItem>(); |
|
foreach (var obj in list) |
|
{ |
|
if (obj is ComboBoxItem) |
|
{ |
|
var item = (ComboBoxItem)obj; |
|
cbItems.Add(item); |
|
continue; |
|
} |
|
if (obj is string) |
|
{ |
|
var item = new ComboBoxItem((string)obj, null, false, null); |
|
cbItems.Add(item); |
|
continue; |
|
} |
|
if (obj is Sprite) |
|
{ |
|
var item = new ComboBoxItem(null, (Sprite)obj, false, null); |
|
cbItems.Add(item); |
|
continue; |
|
} |
|
throw new Exception("Only ComboBoxItem, string and Sprite types are allowed"); |
|
} |
|
var newItems = new ComboBoxItem[Items.Length + cbItems.Count]; |
|
Items.CopyTo(newItems, 0); |
|
cbItems.ToArray().CopyTo(newItems, Items.Length); |
|
Refresh(); |
|
Items = newItems; |
|
} |
|
|
|
public void ClearItems() |
|
{ |
|
Items = new ComboBoxItem[0]; |
|
} |
|
|
|
public void CreateControl() |
|
{ |
|
rectTransform = GetComponent<RectTransform>(); |
|
|
|
var buttonGO = new GameObject("Button"); |
|
buttonGO.transform.SetParent(transform, false); |
|
buttonRectTransform = buttonGO.AddComponent<RectTransform>(); |
|
buttonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, rectTransform.sizeDelta.x); |
|
buttonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, rectTransform.sizeDelta.y); |
|
buttonRectTransform.anchoredPosition = Vector2.zero; |
|
|
|
var comboButtonGO = new GameObject("ComboButton"); |
|
comboButtonGO.transform.SetParent(buttonRectTransform, false); |
|
comboButtonRectTransform = comboButtonGO.AddComponent<RectTransform>(); |
|
comboButtonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, buttonRectTransform.sizeDelta.x); |
|
comboButtonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, buttonRectTransform.sizeDelta.y); |
|
comboButtonRectTransform.anchoredPosition = Vector2.zero; |
|
|
|
var comboButtonImage = comboButtonGO.AddComponent<Image>(); |
|
comboButtonImage.sprite = Sprite_UISprite; |
|
comboButtonImage.type = Image.Type.Sliced; |
|
var comboButtonButton = comboButtonGO.AddComponent<Button>(); |
|
comboButtonButton.targetGraphic = comboButtonImage; |
|
var comboButtonColors = new ColorBlock(); |
|
comboButtonColors.normalColor = new Color32(255, 255, 255, 255); |
|
comboButtonColors.highlightedColor = new Color32(245, 245, 245, 255); |
|
comboButtonColors.pressedColor = new Color32(200, 200, 200, 255); |
|
comboButtonColors.disabledColor = new Color32(200, 200, 200, 128); |
|
comboButtonColors.colorMultiplier = 1.0f; |
|
comboButtonColors.fadeDuration = 0.1f; |
|
comboButtonButton.colors = comboButtonColors; |
|
|
|
var comboArrowGO = new GameObject("Arrow"); |
|
comboArrowGO.transform.SetParent(buttonRectTransform, false); |
|
var comboArrowText = comboArrowGO.AddComponent<Text>(); |
|
comboArrowText.color = new Color32(0, 0, 0, 255); |
|
comboArrowText.alignment = TextAnchor.MiddleCenter; |
|
comboArrowText.font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font; |
|
comboArrowText.text = "▼"; |
|
comboArrowRectTransform.localScale = new Vector3(1.0f, 0.5f, 1.0f); |
|
comboArrowRectTransform.pivot = new Vector2(1.0f, 0.5f); |
|
comboArrowRectTransform.anchorMin = Vector2.right; |
|
comboArrowRectTransform.anchorMax = Vector2.one; |
|
comboArrowRectTransform.anchoredPosition = Vector2.zero; |
|
comboArrowRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, comboButtonRectTransform.sizeDelta.y); |
|
comboArrowRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, comboButtonRectTransform.sizeDelta.y); |
|
var comboArrowCanvasGroup = comboArrowGO.AddComponent<CanvasGroup>(); |
|
comboArrowCanvasGroup.interactable = false; |
|
comboArrowCanvasGroup.blocksRaycasts = false; |
|
|
|
var comboImageGO = new GameObject("Image"); |
|
comboImageGO.transform.SetParent(comboButtonRectTransform, false); |
|
var comboImageImage = comboImageGO.AddComponent<Image>(); |
|
comboImageImage.color = new Color32(255, 255, 255, 0); |
|
comboImageRectTransform.pivot = Vector2.up; |
|
comboImageRectTransform.anchorMin = Vector2.zero; |
|
comboImageRectTransform.anchorMax = Vector2.up; |
|
comboImageRectTransform.anchoredPosition = new Vector2(4.0f, -4.0f); |
|
comboImageRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, comboButtonRectTransform.sizeDelta.y - 8.0f); |
|
comboImageRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, comboButtonRectTransform.sizeDelta.y - 8.0f); |
|
|
|
var comboTextGO = new GameObject("Text"); |
|
comboTextGO.transform.SetParent(comboButtonRectTransform, false); |
|
var comboTextText = comboTextGO.AddComponent<Text>(); |
|
comboTextText.color = new Color32(0, 0, 0, 255); |
|
comboTextText.alignment = TextAnchor.MiddleLeft; |
|
comboTextText.lineSpacing = 1.2f; |
|
comboTextText.font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font; |
|
comboTextRectTransform.pivot = Vector2.up; |
|
comboTextRectTransform.anchorMin = Vector2.zero; |
|
comboTextRectTransform.anchorMax = Vector2.one; |
|
comboTextRectTransform.anchoredPosition = new Vector2(10.0f, 0.0f); |
|
comboTextRectTransform.offsetMax = new Vector2(4.0f, 0.0f); |
|
comboTextRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, comboButtonRectTransform.sizeDelta.y); |
|
} |
|
|
|
public void InitControl() |
|
{ |
|
var cbi = transform.Find("Button/ComboButton/Image"); |
|
var cbt = transform.Find("Button/ComboButton/Text"); |
|
var cba = transform.Find("Button/Arrow"); |
|
if (cbi == null || cbt == null || cba == null) |
|
{ |
|
foreach (Transform child in transform) |
|
Destroy(child); |
|
CreateControl(); |
|
} |
|
|
|
comboButtonRectTransform.GetComponent<Button>().onClick.AddListener(() => { ToggleComboBox(false); }); |
|
var dropdownHeight = comboButtonRectTransform.sizeDelta.y * Mathf.Min(ItemsToDisplay, Items.Length - (HideFirstItem ? 1 : 0)); |
|
|
|
overlayGO = new GameObject("Overlay"); |
|
overlayGO.SetActive(false); |
|
var overlayImage = overlayGO.AddComponent<Image>(); |
|
overlayImage.color = new Color32(0, 0, 0, 0); |
|
var canvasTransform = transform; |
|
while (canvasTransform.GetComponent<Canvas>() == null) |
|
canvasTransform = canvasTransform.parent; |
|
overlayGO.transform.SetParent(canvasTransform, false); |
|
var overlayRectTransform = overlayGO.GetComponent<RectTransform>(); |
|
overlayRectTransform.anchorMin = Vector2.zero; |
|
overlayRectTransform.anchorMax = Vector2.one; |
|
overlayRectTransform.offsetMin = Vector2.zero; |
|
overlayRectTransform.offsetMax = Vector2.zero; |
|
overlayGO.transform.SetParent(transform, false); |
|
var overlayButton = overlayGO.AddComponent<Button>(); |
|
overlayButton.targetGraphic = overlayImage; |
|
overlayButton.onClick.AddListener(() => { ToggleComboBox(false); }); |
|
|
|
var scrollPanelGO = new GameObject("ScrollPanel"); |
|
var scrollPanelImage = scrollPanelGO.AddComponent<Image>(); |
|
scrollPanelImage.sprite = Sprite_UISprite; |
|
scrollPanelImage.type = Image.Type.Sliced; |
|
scrollPanelGO.transform.SetParent(overlayGO.transform, false); |
|
scrollPanelRectTransfrom.pivot = new Vector2(0.5f, 1.0f); |
|
scrollPanelRectTransfrom.anchorMin = Vector2.zero; |
|
scrollPanelRectTransfrom.anchorMax = Vector2.one; |
|
scrollPanelGO.transform.SetParent(transform, false); |
|
scrollPanelRectTransfrom.anchoredPosition = new Vector2(0.0f, -comboButtonRectTransform.sizeDelta.y); |
|
scrollPanelGO.transform.SetParent(overlayGO.transform, false); |
|
scrollPanelRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, comboButtonRectTransform.sizeDelta.x); |
|
scrollPanelRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight); |
|
var scrollPanelScrollRect = scrollPanelGO.AddComponent<ScrollRect>(); |
|
scrollPanelScrollRect.horizontal = false; |
|
scrollPanelScrollRect.elasticity = 0.0f; |
|
scrollPanelScrollRect.movementType = ScrollRect.MovementType.Clamped; |
|
scrollPanelScrollRect.inertia = false; |
|
scrollPanelScrollRect.scrollSensitivity = comboButtonRectTransform.sizeDelta.y; |
|
scrollPanelGO.AddComponent<Mask>(); |
|
|
|
var scrollbarWidth = Items.Length - (HideFirstItem ? 1 : 0) > _itemsToDisplay ? _scrollbarWidth : 0.0f; |
|
|
|
var itemsGO = new GameObject("Items"); |
|
itemsGO.transform.SetParent(scrollPanelGO.transform, false); |
|
itemsRectTransfrom = itemsGO.AddComponent<RectTransform>(); |
|
itemsRectTransfrom.pivot = Vector2.up; |
|
itemsRectTransfrom.anchorMin = Vector2.up; |
|
itemsRectTransfrom.anchorMax = Vector2.one; |
|
itemsRectTransfrom.anchoredPosition = Vector2.right; |
|
itemsRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollPanelRectTransfrom.sizeDelta.x - scrollbarWidth); |
|
var itemsContentSizeFitter = itemsGO.AddComponent<ContentSizeFitter>(); |
|
itemsContentSizeFitter.horizontalFit = ContentSizeFitter.FitMode.PreferredSize; |
|
itemsContentSizeFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize; |
|
var itemsGridLayoutGroup = itemsGO.AddComponent<GridLayoutGroup>(); |
|
itemsGridLayoutGroup.cellSize = new Vector2(comboButtonRectTransform.sizeDelta.x - scrollbarWidth, comboButtonRectTransform.sizeDelta.y); |
|
itemsGridLayoutGroup.constraint = GridLayoutGroup.Constraint.FixedColumnCount; |
|
itemsGridLayoutGroup.constraintCount = 1; |
|
scrollPanelScrollRect.content = itemsRectTransfrom; |
|
|
|
var scrollbarGO = new GameObject("Scrollbar"); |
|
scrollbarGO.transform.SetParent(scrollPanelGO.transform, false); |
|
var scrollbarImage = scrollbarGO.AddComponent<Image>(); |
|
scrollbarImage.sprite = Sprite_Background; |
|
scrollbarImage.type = Image.Type.Sliced; |
|
var scrollbarScrollbar = scrollbarGO.AddComponent<Scrollbar>(); |
|
var scrollbarColors = new ColorBlock(); |
|
scrollbarColors.normalColor = new Color32(128, 128, 128, 128); |
|
scrollbarColors.highlightedColor = new Color32(128, 128, 128, 178); |
|
scrollbarColors.pressedColor = new Color32(88, 88, 88, 178); |
|
scrollbarColors.disabledColor = new Color32(64, 64, 64, 128); |
|
scrollbarColors.colorMultiplier = 2.0f; |
|
scrollbarColors.fadeDuration = 0.1f; |
|
scrollbarScrollbar.colors = scrollbarColors; |
|
scrollPanelScrollRect.verticalScrollbar = scrollbarScrollbar; |
|
scrollbarScrollbar.direction = Scrollbar.Direction.BottomToTop; |
|
scrollbarRectTransfrom.pivot = Vector2.one; |
|
scrollbarRectTransfrom.anchorMin = Vector2.one; |
|
scrollbarRectTransfrom.anchorMax = Vector2.one; |
|
scrollbarRectTransfrom.anchoredPosition = Vector2.zero; |
|
scrollbarRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollbarWidth); |
|
scrollbarRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight); |
|
|
|
var slidingAreaGO = new GameObject("SlidingArea"); |
|
slidingAreaGO.transform.SetParent(scrollbarGO.transform, false); |
|
slidingAreaRectTransform = slidingAreaGO.AddComponent<RectTransform>(); |
|
slidingAreaRectTransform.anchoredPosition = Vector2.zero; |
|
slidingAreaRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 0); |
|
slidingAreaRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight - scrollbarRectTransfrom.sizeDelta.x); |
|
|
|
var handleGO = new GameObject("Handle"); |
|
handleGO.transform.SetParent(slidingAreaGO.transform, false); |
|
var handleImage = handleGO.AddComponent<Image>(); |
|
handleImage.sprite = Sprite_UISprite; |
|
handleImage.type = Image.Type.Sliced; |
|
handleImage.color = new Color32(255, 255, 255, 150); |
|
scrollbarScrollbar.targetGraphic = handleImage; |
|
scrollbarScrollbar.handleRect = handleRectTransfrom; |
|
handleRectTransfrom.pivot = new Vector2(0.5f, 0.5f); |
|
handleRectTransfrom.anchorMin = new Vector2(0.5f, 0.5f); |
|
handleRectTransfrom.anchorMax = new Vector2(0.5f, 0.5f); |
|
handleRectTransfrom.anchoredPosition = Vector2.zero; |
|
handleRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollbarWidth); |
|
handleRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scrollbarWidth); |
|
|
|
Interactable = Interactable; |
|
|
|
if (Items.Length < 1) |
|
return; |
|
Refresh(); |
|
} |
|
|
|
public void Refresh() |
|
{ |
|
var itemsGridLayoutGroup = itemsRectTransfrom.GetComponent<GridLayoutGroup>(); |
|
var itemsLength = Items.Length - (HideFirstItem ? 1 : 0); |
|
var dropdownHeight = comboButtonRectTransform.sizeDelta.y * Mathf.Min(_itemsToDisplay, itemsLength); |
|
var scrollbarWidth = itemsLength > ItemsToDisplay ? _scrollbarWidth : 0.0f; |
|
scrollPanelRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight); |
|
scrollbarRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollbarWidth); |
|
scrollbarRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight); |
|
slidingAreaRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight - scrollbarRectTransfrom.sizeDelta.x); |
|
itemsRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollPanelRectTransfrom.sizeDelta.x - scrollbarWidth); |
|
itemsGridLayoutGroup.cellSize = new Vector2(comboButtonRectTransform.sizeDelta.x - scrollbarWidth, comboButtonRectTransform.sizeDelta.y); |
|
for (var i = itemsRectTransfrom.childCount - 1; i > -1; i--) |
|
DestroyImmediate(itemsRectTransfrom.GetChild(0).gameObject); |
|
for (var i = 0; i < Items.Length; i++) |
|
{ |
|
if (HideFirstItem && i == 0) |
|
continue; |
|
var item = Items[i]; |
|
item.OnUpdate = Refresh; |
|
var itemTransform = Instantiate(comboButtonRectTransform) as Transform; |
|
itemTransform.SetParent(itemsRectTransfrom, false); |
|
itemTransform.GetComponent<Image>().sprite = null; |
|
var itemText = itemTransform.Find("Text").GetComponent<Text>(); |
|
itemText.text = item.Caption; |
|
if (item.IsDisabled) |
|
itemText.color = new Color32(174, 174, 174, 255); |
|
var itemImage = itemTransform.Find("Image").GetComponent<Image>(); |
|
itemImage.sprite = item.Image; |
|
itemImage.color = item.Image == null ? new Color32(255, 255, 255, 0) : item.IsDisabled ? new Color32(255, 255, 255, 147) : new Color32(255, 255, 255, 255); |
|
var itemButton = itemTransform.GetComponent<Button>(); |
|
itemButton.interactable = !item.IsDisabled; |
|
var index = i; |
|
itemButton.onClick.AddListener( |
|
delegate() |
|
{ |
|
OnItemClicked(index); |
|
if (item.OnSelect != null) |
|
item.OnSelect(); |
|
} |
|
); |
|
} |
|
RefreshSelected(); |
|
UpdateComboBoxImages(); |
|
UpdateGraphics(); |
|
FixScrollOffset(); |
|
} |
|
|
|
public void RefreshSelected() |
|
{ |
|
var comboButtonImage = comboImageRectTransform.GetComponent<Image>(); |
|
var item = SelectedIndex > -1 && SelectedIndex < Items.Length ? Items[SelectedIndex] : null; |
|
var includeImage = item != null && item.Image != null; |
|
comboButtonImage.sprite = includeImage ? item.Image : null; |
|
var comboButtonButton = comboButtonRectTransform.GetComponent<Button>(); |
|
comboButtonImage.color = includeImage ? (Interactable ? comboButtonButton.colors.normalColor : comboButtonButton.colors.disabledColor) : new Color(1.0f, 1.0f, 1.0f, 0); |
|
UpdateComboBoxImage(comboButtonRectTransform, includeImage); |
|
comboTextRectTransform.GetComponent<Text>().text = item != null ? item.Caption : ""; |
|
if (!Application.isPlaying) |
|
return; |
|
var i = 0; |
|
foreach (Transform child in itemsRectTransfrom) |
|
{ |
|
comboButtonImage = child.GetComponent<Image>(); |
|
comboButtonImage.color = SelectedIndex == i + (HideFirstItem ? 1 : 0) ? comboButtonButton.colors.highlightedColor : comboButtonButton.colors.normalColor; |
|
i++; |
|
} |
|
} |
|
|
|
private void UpdateComboBoxImages() |
|
{ |
|
var includeImages = false; |
|
foreach (var item in Items) |
|
{ |
|
if (item.Image != null) |
|
{ |
|
includeImages = true; |
|
break; |
|
} |
|
} |
|
foreach (Transform child in itemsRectTransfrom) |
|
UpdateComboBoxImage(child, includeImages); |
|
} |
|
|
|
private void UpdateComboBoxImage(Transform comboButton, bool includeImage) |
|
{ |
|
comboButton.Find("Text").GetComponent<RectTransform>().offsetMin = Vector2.right * (includeImage ? comboImageRectTransform.rect.width + 8.0f : 10.0f); |
|
} |
|
|
|
private void FixScrollOffset() |
|
{ |
|
var selectedIndex = SelectedIndex + (HideFirstItem ? 1 : 0); |
|
if (selectedIndex < scrollOffset) |
|
scrollOffset = selectedIndex; |
|
else |
|
if (selectedIndex > scrollOffset + ItemsToDisplay - 1) |
|
scrollOffset = selectedIndex - ItemsToDisplay + 1; |
|
var itemsCount = Items.Length - (HideFirstItem ? 1 : 0); |
|
if (scrollOffset > itemsCount - ItemsToDisplay) |
|
scrollOffset = itemsCount - ItemsToDisplay; |
|
if (scrollOffset < 0) |
|
scrollOffset = 0; |
|
itemsRectTransfrom.anchoredPosition = new Vector2(0.0f, scrollOffset * rectTransform.sizeDelta.y); |
|
} |
|
|
|
private void ToggleComboBox(bool directClick) |
|
{ |
|
overlayGO.SetActive(!overlayGO.activeSelf); |
|
if (overlayGO.activeSelf) |
|
{ |
|
var curTransform = transform; |
|
do |
|
{ |
|
curTransform.SetAsLastSibling(); |
|
} |
|
while ((curTransform = curTransform.parent) != null); |
|
FixScrollOffset(); |
|
} |
|
else |
|
if (directClick) |
|
scrollOffset = (int)Mathf.Round(itemsRectTransfrom.anchoredPosition.y / rectTransform.sizeDelta.y); |
|
} |
|
|
|
public void UpdateGraphics() |
|
{ |
|
if (overlayGO != null) |
|
{ |
|
var scrollbarWidth = Items.Length - (HideFirstItem ? 1 : 0) > ItemsToDisplay ? _scrollbarWidth : 0.0f; |
|
handleRectTransfrom.offsetMin = -scrollbarWidth / 2 * Vector2.one; |
|
handleRectTransfrom.offsetMax = scrollbarWidth / 2 * Vector2.one; |
|
} |
|
if (rectTransform.sizeDelta != buttonRectTransform.sizeDelta && buttonRectTransform.sizeDelta == comboButtonRectTransform.sizeDelta) |
|
{ |
|
buttonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, rectTransform.sizeDelta.x); |
|
buttonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, rectTransform.sizeDelta.y); |
|
comboButtonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, rectTransform.sizeDelta.x); |
|
comboButtonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, rectTransform.sizeDelta.y); |
|
comboArrowRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, rectTransform.sizeDelta.y); |
|
comboImageRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, comboImageRectTransform.rect.height); |
|
comboTextRectTransform.offsetMax = new Vector2(4.0f, 0.0f); |
|
if (overlayGO == null) |
|
return; |
|
scrollPanelRectTransfrom.SetParent(transform, false); |
|
scrollPanelRectTransfrom.anchoredPosition = new Vector2(0.0f, -comboButtonRectTransform.sizeDelta.y); |
|
scrollPanelRectTransfrom.SetParent(overlayGO.transform, false); |
|
scrollPanelRectTransfrom.GetComponent<ScrollRect>().scrollSensitivity = comboButtonRectTransform.sizeDelta.y; |
|
UpdateComboBoxImage(comboButtonRectTransform, Items[SelectedIndex].Image != null); |
|
Refresh(); |
|
} |
|
} |
|
} |