Files
aibis-dream/Assets/Plugins/CleanFlatUI/Scripts/Dropdown/DropdownMultiCheck.cs
T
2024-10-10 12:46:34 +08:00

187 lines
4.9 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using TMPro;
/*
//Set properties in C# example codes.
using RainbowArt.CleanFlatUI;
public class DropdownMultiCheckDemo : MonoBehaviour
{
//The DropdownMultiCheck Component.
public DropdownMultiCheck m_Dropdown;
void Start()
{
//Add OnSelectValueChanged event listener.
m_Dropdown.OnSelectValueChanged.AddListener(DropdownSelectValueChange);
}
//Set all of the selected option indexes.
public void SetSelectedOptions()
{
m_Dropdown.SelectedOptions = new int[] {1, 3};
}
//Set an option to be selected.
public void SetOneSelectedOption()
{
m_Dropdown.SetOptionSelected(1, true);
}
//Unselect all options.
public void UnSelectAllOptions()
{
m_Dropdown.UnSelecteAll();
}
//Check whether an option is selected.
public bool IsOptionSelected(int index)
{
return m_Dropdown.IsOptionSelected(index);
}
//It will be triggered when select value changed.
public void DropdownSelectValueChange()
{
int[] selectedIndexes = m_Dropdown.SelectedOptions;
Debug.Log("DropdownSelectValueChange, index : ");
foreach (int index in selectedIndexes)
{
Debug.Log(index +",");
}
}
}
*/
namespace RainbowArt.CleanFlatUI
{
public class DropdownMultiCheck : TMP_Dropdown
{
[SerializeField]
List<int> selectedOptions = new List<int>();
[Serializable]
public class DropdownMultiCheckEvent : UnityEvent { }
[SerializeField]
DropdownMultiCheckEvent onSelectValueChanged = new DropdownMultiCheckEvent();
Toggle[] toggleList;
HashSet<int> selectedOptionsHashSet = new HashSet<int>();
public int[] SelectedOptions
{
get
{
int[] ret = new int[selectedOptionsHashSet.Count];
selectedOptionsHashSet.CopyTo(ret);
return ret;
}
set
{
selectedOptionsHashSet.Clear();
if (value != null)
{
foreach (int index in value)
{
selectedOptionsHashSet.Add(index);
}
}
onSelectValueChanged.Invoke();
}
}
public DropdownMultiCheckEvent OnSelectValueChanged
{
get => onSelectValueChanged;
set
{
onSelectValueChanged = value;
}
}
protected override void OnEnable()
{
base.OnEnable();
foreach(int index in selectedOptions)
{
selectedOptionsHashSet.Add(index);
}
}
public bool IsOptionSelected(int index)
{
return selectedOptionsHashSet.Contains(index);
}
public void SetOptionSelected(int index,bool selected,bool sendEvent = true)
{
if (IsOptionSelected(index) == selected)
{
return;
}
if(selected)
{
selectedOptionsHashSet.Add(index);
}
else
{
selectedOptionsHashSet.Remove(index);
}
if(sendEvent)
{
onSelectValueChanged.Invoke();
}
}
public void UnSelecteAll()
{
int count = selectedOptionsHashSet.Count;
selectedOptionsHashSet.Clear();
if(count > 0)
{
onSelectValueChanged.Invoke();
}
}
public new void Show()
{
Transform dropdownList = transform.Find("Dropdown List");
if(dropdownList != null)
{
return;
}
base.Show();
Transform contentTransform = transform.Find("Dropdown List/Viewport/Content");
toggleList = contentTransform.GetComponentsInChildren<Toggle>(false);
for (int i = 0; i < toggleList.Length; i++)
{
int index = i;
Toggle item = toggleList[i];
item.onValueChanged.RemoveAllListeners();
item.onValueChanged.AddListener(x => OnSelectItemCustom(index,x));
item.SetIsOnWithoutNotify(IsOptionSelected(i));
}
}
public new void Hide()
{
base.Hide();
}
public override void OnPointerClick(PointerEventData eventData)
{
Show();
}
void OnSelectItemCustom(int selectedIndex, bool isSelected)
{
SetOptionSelected(selectedIndex, isSelected);
}
}
}