///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/ComboBox/AutoComplete ComboBox")]
public class AutoCompleteComboBox : MonoBehaviour
{
public Color disabledTextColor;
public DropDownListItem SelectedItem { get; private set; } //outside world gets to get this, not set it
///
/// Contains the included items. To add and remove items to/from this list, use the ,
/// and methods as these also execute
/// the required methods to update to the current collection.
///
public List AvailableOptions;
private bool _isPanelActive = false;
private bool _hasDrawnOnce = false;
private InputField _mainInput;
private RectTransform _inputRT;
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 drop-down
private List _prunedPanelItems; //items that used to show in the drop-down
private Dictionary panelObjects;
private GameObject itemTemplate;
public string Text { get; private set; }
[SerializeField]
private float dropdownOffset;
[SerializeField]
private float _scrollBarWidth = 20.0f;
public float ScrollBarWidth
{
get { return _scrollBarWidth; }
set
{
_scrollBarWidth = value;
RedrawPanel();
}
}
[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();
}
}
}
public float DropdownOffset = 10f;
public Color ValidSelectionTextColor = Color.green;
public Color MatchingItemsRemainingTextColor = Color.black;
public Color NoItemsRemainingTextColor = Color.red;
public AutoCompleteSearchType autocompleteSearchType = AutoCompleteSearchType.Linq;
[SerializeField]
private bool _displayPanelAbove = false;
private bool _selectionIsValid = false;
[System.Serializable]
public class SelectionChangedEvent : Events.UnityEvent { }
[System.Serializable]
public class SelectionTextChangedEvent : Events.UnityEvent { }
[System.Serializable]
public class SelectionValidityChangedEvent : Events.UnityEvent { }
// fires when input text is changed;
public SelectionTextChangedEvent OnSelectionTextChanged;
// fires 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]);
}
RedrawPanel();
}
private bool Initialize()
{
bool success = true;
try
{
_rectTransform = GetComponent();
_inputRT = _rectTransform.Find("InputField").GetComponent();
_mainInput = _inputRT.GetComponent();
_overlayRT = _rectTransform.Find("Overlay").GetComponent();
_overlayRT.gameObject.SetActive(false);
_scrollPanelRT = _overlayRT.Find("ScrollPanel").GetComponent();
_scrollBarRT = _scrollPanelRT.Find("Scrollbar").GetComponent();
_slidingAreaRT = _scrollBarRT.Find("SlidingArea").GetComponent();
_scrollHandleRT = _slidingAreaRT.Find("Handle").GetComponent();
_itemsPanelRT = _scrollPanelRT.Find("Items").GetComponent();
_canvas = GetComponentInParent