CultivationOfBrewing-2/Assets/Scripts/Project/UI/UI_Panel/UI_FaultRegistrationFormPan...

397 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class UI_FaultRegistrationFormPanel : BasePanel
{
public UI_GenerateItemsBtn itemUIPrefab;//生成的预制体
public Transform backpack; // 生成物体的父物体
private int currentNumber = 1; // 用于记录当前生成的数字
private int number = 0;
private string triggerName;
private bool submit = false;
private bool readOrginalOnly = false;
private List<string> recordedFaults = new List<string>();//记录之前已经故障
public TMP_Dropdown DeviceDropdown;//故障设备
public TMP_Dropdown AppearanceFailureDropdown;
public TMP_Dropdown AppearanceDamageDropdown;
public TMP_Dropdown TerminalCoverDamagedDropdown;
public FaultOptions faultOptions = new FaultOptions();
/// <summary>
/// 初始化
/// </summary>
/// <param name="triggerName"></param>
/// <param name="readOrginalOnly"></param>
public void Init(string triggerName, bool readOrginalOnly = false)
{
this.triggerName = triggerName;
this.readOrginalOnly = readOrginalOnly;
if (readOrginalOnly)
{
//读取原版的故障选项
faultOptions = JsonManager.Instance.LoadData<FaultOptions>("FaultOptions");
}
else
{
if (GameManager.RunModelMgr.ModeType == E_ModeType.Study)
{
GetControl<Button>("Button_Close").gameObject.SetActive(false);
faultOptions = FaultManager.Instance.selectedFaultOptions;
}
else
{
faultOptions = FaultManager.Instance.originalFaultOptions;
}
}
DeviceDropdown.gameObject.SetActive(false);
AppearanceFailureDropdown.gameObject.SetActive(false);
AppearanceDamageDropdown.gameObject.SetActive(false);
TerminalCoverDamagedDropdown.gameObject.SetActive(false);
if (faultOptions.FaultDevice != null)
{
DeviceDropdown.gameObject.SetActive(true);
DeviceDropdown.options.Clear();
DeviceDropdown.options.Add(new TMP_Dropdown.OptionData() { text = faultOptions.FaultDevice });
}
if (faultOptions.dataFaultType != null && faultOptions.dataFaultType.Count > 0)
{
AppearanceFailureDropdown.gameObject.SetActive(true);
AppearanceFailureDropdown.options.Clear();
faultOptions.dataFaultType.ForEach(item =>
{
AppearanceFailureDropdown.options.Add(new TMP_Dropdown.OptionData() { text = item.name });
});
AppearanceDamageDropdown.gameObject.SetActive(true);
AppearanceDamageDropdown.options.Clear();
faultOptions.dataFaultType[0].dataFaultSituationL1.ForEach(item =>
{
AppearanceDamageDropdown.options.Add(new TMP_Dropdown.OptionData() { text = item.name });
});
TerminalCoverDamagedDropdown.gameObject.SetActive(true);
TerminalCoverDamagedDropdown.options.Clear();
faultOptions.dataFaultType[0].dataFaultSituationL1[0].dataFaultSituationL2.ForEach(item =>
{
TerminalCoverDamagedDropdown.options.Add(new TMP_Dropdown.OptionData() { text = item.L2name });
});
}
DeviceDropdown.gameObject.SetActive(faultOptions.FaultDeviceShow);
AppearanceFailureDropdown.gameObject.SetActive(faultOptions.FaultTypeShow);
AppearanceDamageDropdown.gameObject.SetActive(faultOptions.FaultSituationL1Show);
TerminalCoverDamagedDropdown.gameObject.SetActive(faultOptions.FaultSituationL2Show);
// 为DeviceDropdown添加监听器
DeviceDropdown.onValueChanged.AddListener(OnDeviceDropdownValueChanged);
AppearanceFailureDropdown.onValueChanged.AddListener(OnAppearanceFailureDropdownValueChanged);//注意value不change是不会触发更新事件的
AppearanceDamageDropdown.onValueChanged.AddListener(OnAppearanceDamageDropdownValueChanged);
// 初始化时禁用其他Dropdown因为还没有选择Device
//AppearanceFailureDropdown.interactable = false;
//AppearanceDamageDropdown.interactable = false;
//TerminalCoverDamagedDropdown.interactable = false;
number = 0;
this.triggerName = triggerName;
}
/// <summary>
/// 隐藏面板
/// </summary>
public override void HideMe()
{
base.HideMe();
GameManager.EventMgr.EventTrigger<bool>(Enum_EventType.PlayerCanMove, true);
}
/// <summary>
/// 显示面板
/// </summary>
public override void ShowMe()
{
base.ShowMe();
Init(triggerName, readOrginalOnly);
recordedFaults = new List<string>(GameManager.FaultManager.selectedFaultsInReg);
ClearItemUIPrefab();
foreach (var item in FaultManager.Instance.selectedFaultsInReg)
{
AddItemUIPrefab(item);
}
if (GameManager.RunModelMgr.ModeType == E_ModeType.Study)
{
Transform tip = ToolFuncManager.GetChild(transform, "ImageTips_1");
ToolFuncManager.ActiveEmbededTip(tip.gameObject);
}
}
protected override void OnClick(string btnName)
{
switch (btnName)
{
case "Button_Close":
FaultManager.Instance.selectedFaultsInReg.Clear();
FaultManager.Instance.selectedFaultsInReg = new List<string>(recordedFaults);
GameManager.UIMgr.HidePanel<UI_FaultRegistrationFormPanel>();
break;
case "AddBtn":
if (GameManager.RunModelMgr.ModeType == E_ModeType.Study)
{
ClearItemUIPrefab();
List<string> selectedFaults = FaultManager.Instance.FaultOptionsToStringList(FaultManager.Instance.selectedFaultOptions);
foreach (var item in selectedFaults)
{
AddItemUIPrefab(item);
if (!FaultManager.Instance.selectedFaultsInReg.Contains(item))//保存选择的故障
{
FaultManager.Instance.selectedFaultsInReg.Add(item);
}
}
Transform tip1 = ToolFuncManager.GetChild(transform, "ImageTips_1");
tip1.gameObject.SetActive(false);
Transform tip2 = ToolFuncManager.GetChild(transform, "ImageTips_2");
ToolFuncManager.ActiveEmbededTip(tip2.gameObject);
}
else
{
string genInfo = "";
if (DeviceDropdown.gameObject.activeInHierarchy)
genInfo += DeviceDropdown.options[DeviceDropdown.value].text;
if (AppearanceFailureDropdown.gameObject.activeInHierarchy)
{
if (genInfo.Equals("") == false) genInfo += "_";
genInfo += AppearanceFailureDropdown.options[AppearanceFailureDropdown.value].text;
}
if (AppearanceDamageDropdown.gameObject.activeInHierarchy)
{
if (genInfo.Equals("") == false) genInfo += "_";
genInfo += AppearanceDamageDropdown.options[AppearanceDamageDropdown.value].text;
}
if (TerminalCoverDamagedDropdown.gameObject.activeInHierarchy)
{
if (genInfo.Equals("") == false) genInfo += "_";
genInfo += TerminalCoverDamagedDropdown.options[TerminalCoverDamagedDropdown.value].text;
}
if (!FaultManager.Instance.selectedFaultsInReg.Contains(genInfo))//保存选择的故障
{
AddItemUIPrefab(genInfo);
FaultManager.Instance.selectedFaultsInReg.Add(genInfo);
}
}
break;
case "Button_Confirm":
submit = true;
Debug.Log(submit);
bool confirmEnable = true;
if (GameManager.RunModelMgr.ModeType == E_ModeType.Study)
{
Transform tip1 = ToolFuncManager.GetChild(transform, "ImageTips_1");
Transform tip2 = ToolFuncManager.GetChild(transform, "ImageTips_2");
confirmEnable = (tip1.gameObject.activeInHierarchy == false && tip2.gameObject.activeInHierarchy == true);
}
if (GameManager.RunModelMgr.ModeType == E_ModeType.Study && !confirmEnable)
{
TipPanel.ShowTip("请完成新增故障");
}
else
{
SaveSelectedFaults();//保存选择的故障
if (GameManager.ProcessMgr.IsRightSubProcessStepsTriggerID(triggerName, true) == 0)
{
ScoreManager.instance.Check(triggerName, null);
//GameManager.ProcessMgr.CheckSubProcessSteps(GameManager.ProcessMgr.subProcessStepId);
GameManager.UIMgr.HidePanel<UI_FaultRegistrationFormPanel>();
}
}
break;
default:
break;
}
}
public void AddItemUIPrefab(string genInfo)
{
UI_GenerateItemsBtn temp = Instantiate(itemUIPrefab, backpack);
temp.gameObject.SetActive(true);
temp.callBack += OnSetUIRect;
TMP_Text genText = temp.transform.GetComponentInChildren<TMP_Text>();
TextMeshProUGUI numberText = temp.transform.Find("TagImage").GetComponentInChildren<TextMeshProUGUI>();
genText.text = genInfo;
if (numberText.text != null)
{
numberText.text = currentNumber.ToString();
}
currentNumber++;
}
public void SaveSelectedFaults()
{
FaultManager.Instance.selectedFaultsInReg.Clear();
for (int i = 0; i < backpack.childCount; i++)
{
TMP_Text textInfo = backpack.GetChild(i).GetComponentInChildren<TMP_Text>();
FaultManager.Instance.selectedFaultsInReg.Add(textInfo.text);
}
}
public void ClearItemUIPrefab()
{
foreach (Transform child in backpack)
{
DestroyImmediate(child.gameObject);
}
}
/// <summary>
/// 回调函数,用于设置UI的Rect
/// </summary>
/// <param name="obj"></param>
public void OnSetUIRect(GameObject obj)
{
StartCoroutine(SetUIRect(obj));
}
private IEnumerator SetUIRect(GameObject obj)
{
if (GameManager.RunModelMgr.ModeType != E_ModeType.Study)
{
TMP_Text textInfo = obj.GetComponentInChildren<TMP_Text>();
for (int i = 0; i < FaultManager.Instance.selectedFaultsInReg.Count; i++)
{
if (FaultManager.Instance.selectedFaultsInReg[i].Equals(textInfo.text))
{
FaultManager.Instance.selectedFaultsInReg.RemoveAt(i);
break;
}
}
Transform genPanel = obj.transform.parent;
DestroyImmediate(obj);
for (int i = 0; i < genPanel.childCount; i++)
{
genPanel.GetChild(i).Find("TagImage/TextNumber").GetComponentInChildren<TextMeshProUGUI>().text = (i + 1).ToString();
}
}
yield return new WaitForEndOfFrame();
}
private void OnDeviceDropdownValueChanged(int index)
{
//if (index < 0) return;
//string selectedDevice = DeviceDropdown.options[index].text;
//List<FaultOptions.FaultType> faultTypes = faultOptions.dataFaultType;
//if (faultTypes.Count > 0)
//{
// PopulateDropdown(AppearanceFailureDropdown, faultTypes); // 假设FaultType的name是你想显示的
// AppearanceFailureDropdown.interactable = true;
//ResetSubsequentDropdowns(AppearanceFailureDropdown);
//}
}
private void OnAppearanceFailureDropdownValueChanged(int index)
{
if (index < 0) return;
FaultOptions.FaultType selectedFaultType = GetSelectedFaultType(DeviceDropdown, AppearanceFailureDropdown);
if (selectedFaultType != null)
{
List<FaultOptions.FaultSituationL1> faultSituationL1s = selectedFaultType.dataFaultSituationL1;
List<string> L1sNames = new List<string>();
faultSituationL1s.ForEach(s => { L1sNames.Add(s.name); });
PopulateDropdown(AppearanceDamageDropdown, L1sNames); // 假设FaultSituationL1的name是你想显示的
AppearanceDamageDropdown.interactable = true;
if (L1sNames.Count == 1)
{
OnAppearanceDamageDropdownValueChanged(0);
}
else {
TerminalCoverDamagedDropdown.ClearOptions();
}
//ResetSubsequentDropdowns(AppearanceDamageDropdown);
}
}
private void OnAppearanceDamageDropdownValueChanged(int index)
{
if (index < 0) return;
FaultOptions.FaultSituationL1 selectedFaultSituationL1 = GetSelectedFaultSituationL1(DeviceDropdown, AppearanceFailureDropdown, AppearanceDamageDropdown);
if (selectedFaultSituationL1 != null)
{
List<string> faultSituationL2s = new List<string>();
foreach (var item in selectedFaultSituationL1.dataFaultSituationL2)
{
faultSituationL2s.Add(item.L2name);
}
PopulateDropdown(TerminalCoverDamagedDropdown, faultSituationL2s); // 这里直接显示string列表
TerminalCoverDamagedDropdown.interactable = true;
}
}
private void PopulateDropdown(TMP_Dropdown dropdown, List<string> data)
{
dropdown.ClearOptions();
List<string> options = new List<string>();
foreach (var item in data)
{
options.Add(item);
}
dropdown.AddOptions(options);
}
private void ResetSubsequentDropdowns(TMP_Dropdown currentDropdown)
{
TMP_Dropdown[] allDropdowns = { DeviceDropdown, AppearanceFailureDropdown, AppearanceDamageDropdown, TerminalCoverDamagedDropdown };
foreach (var dropdown in allDropdowns)
{
if (dropdown != currentDropdown && dropdown.interactable)
{
dropdown.ClearOptions();
dropdown.interactable = false;
}
}
}
private FaultOptions.FaultType GetSelectedFaultType(TMP_Dropdown deviceDropdown, TMP_Dropdown faultTypeDropdown)
{
string selectedDevice = deviceDropdown.options[deviceDropdown.value].text;
string selectedFaultTypeName = faultTypeDropdown.options[faultTypeDropdown.value].text;
return faultOptions.dataFaultType.Find(ft => ft.name == selectedFaultTypeName); // 这里可能需要根据实际情况调整如果FaultType的name不是唯一标识则需要更改
}
private FaultOptions.FaultSituationL1 GetSelectedFaultSituationL1(TMP_Dropdown deviceDropdown, TMP_Dropdown faultTypeDropdown, TMP_Dropdown faultSituationL1Dropdown)
{
FaultOptions.FaultType selectedFaultType = GetSelectedFaultType(deviceDropdown, faultTypeDropdown);
if (selectedFaultType != null)
{
string selectedFaultSituationL1Name = faultSituationL1Dropdown.options[faultSituationL1Dropdown.value].text;
return selectedFaultType.dataFaultSituationL1.Find(fsl1 => fsl1.name == selectedFaultSituationL1Name); // 同样,这里可能需要根据实际情况调整
}
return null;
}
}