ISAP/Assets/Scripts/Tools/ToggleTab.cs

217 lines
5.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using System;
using System.Diagnostics;
[RequireComponent(typeof(ToggleGroup))]
public class ToggleTab : MonoBehaviour
{
private ToggleGroup toggleGroup;
private List<Toggle> toggles;
private Toggle currentSelectToggle;
private int currentSelectedIndex;
private List<Action<string, int>> selectedListener;
private List<Action<string, int>> unselectedListener;
private bool isInit = false;
private void Awake()
{
Init();
}
private void Init()
{
if (isInit)
{
return;
}
isInit = true;
selectedListener = new List<Action<string, int>>(3);
unselectedListener = new List<Action<string, int>>(3);
toggles = new List<Toggle>();
toggleGroup = GetComponent<ToggleGroup>();
GetComponentsInChildren(true, toggles);
for (int i = 0; i < toggles.Count; i++)
{
Toggle toggle = toggles[i];
toggle.group = toggleGroup;
toggle.onValueChanged.AddListener(OnTabChange);
if (toggle.isOn)
{
if (currentSelectToggle == null)
{
currentSelectToggle = toggle;
}
else
{
toggle.isOn = false;
}
}
}
}
public string GetSelectedName()
{
if(currentSelectToggle!= null)
{
return currentSelectToggle.name;
}
return null;
}
public void SetSelectedName(string toggleName)
{
for (int i = 0; i < toggles.Count; i++)
{
if (toggles[i].name == toggleName)
{
if (!toggles[i].isOn)
{
toggles[i].isOn = true;
}
break;
}
}
}
public int GetSelectedIndex()
{
if (currentSelectToggle != null)
{
return toggles.IndexOf(currentSelectToggle);
}
return -1;
}
public void SetSelectedIndex(int index)
{
if (index >= 0 && index < toggles.Count)
{
toggles[index].isOn = true;
}
}
public int AddToggle(Toggle toggle)
{
if (toggle != null)
{
bool isExist = toggles.Contains(toggle);
if (!isExist)
{
toggle.isOn = false;
toggle.group = toggleGroup;
toggles.Add(toggle);
return toggles.Count;
}
}
return -1;
}
public void RemoveToggle(Toggle toggle)
{
if (toggle != null)
{
int index = toggles.IndexOf(toggle);
if (index >= 0)
{
toggles.RemoveAt(index);
if (currentSelectToggle == toggle)
{
currentSelectToggle = null;
currentSelectedIndex = -1;
if (toggles.Count > 0)
{
currentSelectToggle = toggles[0];
currentSelectToggle.isOn = true;
currentSelectedIndex = 0;
}
}
else
{
for (int i = index; i < toggles.Count; i++)
{
if (currentSelectToggle == toggles[i])
{
currentSelectedIndex = i;
break;
}
}
}
}
}
}
public void AddSelectedListener(Action<string, int> listener)
{
Init();
selectedListener.Add(listener);
}
public void AddUnselectedListener(Action<string, int> listener)
{
unselectedListener.Add(listener);
}
public void RemoveSelectedListener(Action<string, int> listener)
{
selectedListener.Remove(listener);
}
public void RemoveAllSelectedListeners()
{
selectedListener.Clear();
}
public void RemoveUnselectedListener(Action<string, int> listener)
{
unselectedListener.Remove(listener);
}
public void RemoveAllUnselectedListeners()
{
unselectedListener.Clear();
}
private void OnTabChange(bool isSelect)
{
if (isSelect)
{
for (int i = 0; i < toggles.Count; i++)
{
Toggle toggle = toggles[i];
if (toggle.isOn)
{
if (toggle == currentSelectToggle)
{
return;
}
if (currentSelectToggle != null)
{
CallUnselectedListener(currentSelectToggle, currentSelectedIndex + 1);
}
currentSelectToggle = toggle;
currentSelectedIndex = i;
CallSelectedListener(currentSelectToggle, currentSelectedIndex + 1);
break;
}
}
}
}
private void CallSelectedListener(Toggle toggle, int index)
{
for (int i = selectedListener.Count - 1; i >= 0; i--)
{
selectedListener[i]?.Invoke(toggle.name, index);
}
}
private void CallUnselectedListener(Toggle toggle, int index)
{
for (int i = unselectedListener.Count - 1; i >= 0; i--)
{
unselectedListener[i]?.Invoke(toggle.name, index);
}
}
private void OnDestroy()
{
RemoveAllSelectedListeners();
RemoveAllUnselectedListeners();
toggles.Clear();
selectedListener = null;
}
}