Files
ChunilENG/Assets/Scripts/UI/Panel_MachineDashBoard.cs

219 lines
6.7 KiB
C#

using CHN;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using WI;
using static MQTT;
namespace CHN
{
public class Panel_MachineDashBoard : PanelBase
{
Toggle Toggle_Lock;
Button Button_Close;
Button Button_Simple;
Button Button_Detail;
Button Button_Refresh;
ScrollRect scrollView_SimpleInfo;
ScrollRect scrollView_DetailInfo;
TextMeshProUGUI text_MachineName;
private ObjectPoolManager poolManager;
public UI_MachineInfoItem prf_InfoItem;
public HashSet<UI_MachineInfoItem> infoItems = new();
private FieldInfo[] fields;
private Dictionary<FieldInfo, UI_MachineInfoItem> machineInfoItem = new();
private HashSet<string> simpleviewField = new();
public Action<Machine> onClickDetail;
public Action<Machine> onClickSimple;
public Action<Machine, HashSet<string>> simpleView;
private Machine machine;
private Button currentTabButton;
public override void AfterAwake()
{
prf_InfoItem = Resources.Load<UI_MachineInfoItem>("Prefabs/UI/PRF_UI_MachineInfoItem");
Toggle_Lock.onValueChanged.AddListener(OnChangedLock);
Button_Close.onClick.AddListener(Close);
Button_Simple.onClick.AddListener(OnClickSimple);
Button_Detail.onClick.AddListener(OnClickDetail);
ChangeTabButtonState(Button_Simple);
SetActive(false);
fields = typeof(CompleteInfo).GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
}
private void SimpleViewItem(string field, bool ison)
{
if (machine == null)
return;
var fields = simpleviewField;
if (ison)
{
fields.Add(field);
}
else
{
fields.Remove(field);
}
simpleviewField = fields;
simpleView?.Invoke(machine, simpleviewField);
}
private void OnClickDetail()
{
Toggle_Lock.interactable = true;
scrollView_DetailInfo.gameObject.SetActive(true);
scrollView_SimpleInfo.gameObject.SetActive(false);
ChangeTabButtonState(Button_Detail);
onClickDetail?.Invoke(machine);
}
//요약된 정보를 보여준다
//요역된 정보 -> 상세펭
private void OnClickSimple()
{
Toggle_Lock.interactable = false;
Toggle_Lock.isOn = false;
scrollView_SimpleInfo.gameObject.SetActive(true);
scrollView_DetailInfo.gameObject.SetActive(false);
ChangeTabButtonState(Button_Simple);
onClickSimple?.Invoke(machine);
}
private void ChangeTabButtonState(Button button)
{
if (currentTabButton != null)
{
var preSelectImage = currentTabButton.GetComponentInChildren<RawImage>(true);
preSelectImage.gameObject.SetActive(false);
}
currentTabButton = button;
var selectImage = currentTabButton.GetComponentInChildren<RawImage>(true);
selectImage.gameObject.SetActive(true);
}
void OnChangedLock(bool value)
{
if (value)
{
foreach (var i in infoItems)
{
i.Unlock();
}
}
else
{
foreach (var i in infoItems)
{
i.Lock();
}
}
}
private void SetMachineName()
{
var machineName = machine.name;
text_MachineName.SetText(machineName);
}
public void OpenFromLibraryButton(UI_LibraryButton libraryButton)
{
if (this.gameObject.activeSelf)
return;
machine = libraryButton.machine;
SetMachineName();
SetActive(true);
OnClickSimple();
}
public void OpenFromMachineClick(Machine clickMachine)
{
if (this.gameObject.activeSelf)
return;
this.machine = clickMachine;
SetMachineName();
SetActive(true);
OnClickSimple();
}
public void Close()
{
Clear();
SetActive(false);
}
public void Clear()
{
foreach (var item in infoItems)
{
item.Pool.Release(item);
}
machineInfoItem.Clear();
infoItems.Clear();
}
public void SimpleInfoView(SimpleField machineInfo)
{
foreach (var field in fields)
{
if (machineInfo.simpleField.Contains(field.Name))
{
var item = CreateItem(field);
item.transform.SetParent(scrollView_SimpleInfo.content);
var info = (string)field.GetValue(machineInfo.machineInfo);
item.Setting(field.Name, info);
infoItems.Add(item);
item.ToggleIsOn(true);
simpleviewField.Add(field.Name);
}
}
OnChangedLock(false);
}
public void DetailInfoView(SimpleField simpleField)
{
foreach (var field in fields)
{
var item = CreateItem(field);
item.transform.SetParent(scrollView_DetailInfo.content);
item.transform.SetAsLastSibling();
var info = (string)field.GetValue(simpleField.machineInfo);
item.Setting(field.Name, info);
var ison = simpleField.simpleField.Contains(field.Name);
item.ToggleIsOn(ison);
}
OnChangedLock(false);
}
private UI_MachineInfoItem CreateItem(FieldInfo field)
{
if (machineInfoItem.ContainsKey(field))
return machineInfoItem[field];
var item = poolManager.Get<UI_MachineInfoItem>();
item.onFavoritItem = SimpleViewItem;
infoItems.Add(item);
machineInfoItem.Add(field, item);
return item;
}
string UpperFirstChar(string input)
{
if (string.IsNullOrEmpty(input))
{
return null;
}
return char.ToUpper(input[0]) + input.Substring(1);
}
}
}