Files
XRLib/Assets/Scripts/Simulator/UI/PropertyWindow/NodeProperty.cs
2026-03-17 10:52:33 +09:00

112 lines
3.6 KiB
C#

using Simulator.Data;
using System;
using System.Collections.Generic;
using UnityEngine;
using UVC.UI.Window.PropertyWindow;
public class NodeProperty : MonoBehaviour
{
[SerializeField]
private PropertyWindow propertyWindow;
private void Awake()
{
propertyWindow.PropertyValueChanged += OnPropertyValueChanged;
}
public void SetPropertyWindow(ConveyorNode data)
{
if (PlayerPropertyDataBase.isPlaying)
{
return;
}
Debug.Log(data);
InitNodeProperty(data);
}
void SaveChange(object source, object value, string name)
{
var path = PathIndexer.GetNodePath(source);
Patch updateData = new Patch();
updateData.value = value;
UpdateValueStack.AddPatch($"{path}.{name}", value);
}
public void InitNodeProperty(ConveyorNode node)
{
var entries = new List<IPropertyEntry>
{
new StringProperty("name", "이름", node.name)
{
IsReadOnly=true
},
new StringProperty("label", "라벨", node.label)
{
IsReadOnly=false
}.Bind(
setter: v => {node.label = v;SaveChange(node,v,"label"); }
),
new ListProperty("type","타입",new List<string> { "start","junction","endpoint"},node.node_type)
{
IsReadOnly=true
}.Bind(
setter: v => {node.node_type=v; SaveChange(node,v,"node_type"); }
),
CreateInputDetailGroup(node),
CreateOutputDetailGroup(node),
new IntProperty("capacity", "용량", node.capacity)
{
IsReadOnly=false
}.Bind(
setter: v => {node.capacity = v;SaveChange(node,v,"capacity"); }
),
};
entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries(
"ProcessingTimePolicy", "보관 비용 정책", "display_mode_ProcessingTimePolicy",
() => node.processing_time_policy, v => node.processing_time_policy = v,
"processing_time_policy", node, SaveChange));
propertyWindow.LoadMixedProperties(entries);
PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ProcessingTimePolicy", node.processing_time_policy.policy.ToString());
HandleDisplayModeChanged_InputOutput(node.node_type);
}
private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e)
{
PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ProcessingTimePolicy", "ProcessingTimePolicy");
}
private PropertyGroup CreateInputDetailGroup(ConveyorNode node)
{
return PropertyHelper.CreateConnectionGroup("inputs", "투입 대상 컴포넌트", node.inputs, SaveChange);
}
private PropertyGroup CreateOutputDetailGroup(ConveyorNode node)
{
return PropertyHelper.CreateConnectionGroup("outputs", "출하 대상 컴포넌트", node.outputs, SaveChange);
}
private void HandleDisplayModeChanged_InputOutput(string mode)
{
propertyWindow.SetGroupVisibility("inputs", false);
propertyWindow.SetGroupVisibility("outputs", false);
switch (mode)
{
case "start":
propertyWindow.SetGroupVisibility("inputs", true);
break;
case "endpoint":
propertyWindow.SetGroupVisibility("outputs", true);
break;
}
}
private void OnDestroy()
{
if (propertyWindow != null)
propertyWindow.PropertyValueChanged -= OnPropertyValueChanged;
}
}