217 lines
5.8 KiB
C#
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;
|
|
}
|
|
}
|