397 lines
16 KiB
C#
397 lines
16 KiB
C#
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;
|
||
}
|
||
}
|