zombie_mp/Assets/Scripts/Menu/customDropDown.cs
2021-09-16 20:19:09 +05:30

109 lines
3.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
[RequireComponent(typeof(Button))]
public class customDropDown : MonoBehaviour
{
public Text label;
public GameObject dropmenu;
public GameObject template;
public GameObject contentParent;
[SerializeField]
private List<string> options;
public UnityEvent OnChangedValue;
public int selectedIndex;
public void SetValue(int value){
selectedIndex = value;
RefreshMenu();
}
public void SetOptions(List<string> _options){
options = _options;
RefreshMenu();
}
public void RemoveOption(string item){
options.Remove(item);
RefreshMenu();
}
public void AddOption(string item){
options.Add(item);
RefreshMenu();
}
public List<string> GetOptions(){
return options;
}
public int GetOption(string value){
for(int i =0; i < options.Count; i++){
if(options[i] == value){return i;}
}
return 0;
}
public void toggleDropmenu(){
if(!dropmenu.activeSelf){
RefreshMenu();
}
dropmenu.SetActive(!dropmenu.activeSelf);
}
List<GameObject> items;
public void RefreshMenu(){
//clean the list before adding new items
Transform[] children = contentParent.transform.GetComponentsInChildren<Transform>();
foreach(Transform child in children){
if(child != contentParent.transform && child != template.transform){
Destroy(child.gameObject);
}
}
if(items==null){items = new List<GameObject>();}
items.Clear();
//all clear; let's go
for(int i =0; i < options.Count; i++){
string option = options[i];
GameObject item = Instantiate(template, contentParent.transform);
try{
item.SetActive(true);
item.transform.GetChild(0).GetComponent<Image>().enabled=i == selectedIndex;
item.transform.GetChild(1).GetComponent<Text>().text = option;
}catch{}
int curIndex =i;
item.GetComponent<Button>().onClick.AddListener(()=>{_onSelectedOption(curIndex);});
items.Add(item);
if(selectedIndex ==i){
label.text = option;
}
}
label.text = options[selectedIndex];
}
private void _onSelectedOption(int id){
selectedIndex=id;
for(int i =0; i < items.Count; i++){
if(i != id){
items[i].transform.GetChild(0).GetComponent<Image>().enabled=false;
}else{
items[i].transform.GetChild(0).GetComponent<Image>().enabled = true;
}
}
dropmenu.SetActive(false);
label.text = options[id];
OnChangedValue.Invoke();
}
void Start()
{
GetComponent<Button>().onClick.AddListener(toggleDropmenu);
template.SetActive(false);
RefreshMenu();
dropmenu.SetActive(false);
}
}