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

180 lines
7.1 KiB
C#

using Simulator.Data;
using System;
using System.Collections.Generic;
using UnityEngine;
using UVC.UI.Window.PropertyWindow;
public class RackProperty : MonoBehaviour
{
[SerializeField]
private PropertyWindow propertyWindow;
private void Awake()
{
propertyWindow.PropertyValueChanged += OnPropertyValueChanged;
}
public void SetPropertyWindow(ComponentType type, ComponentDataBase data)
{
Debug.Log(PlayerPropertyDataBase.isPlaying);
Debug.Log("rack");
if (PlayerPropertyDataBase.isPlaying)
{
return;
}
InitRackProperty(data as RackDataClass);
}
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 InitRackProperty(RackDataClass rack)
{
var entries = new List<IPropertyEntry>
{
new StringProperty("name", "이름", rack.name)
{
IsReadOnly=true
},
new StringProperty("label", "라벨", rack.label)
{
IsReadOnly=false
}.Bind(
setter: v => {rack.label = v;SaveChange(rack,v,"label"); }
),
CreatePositionGroup(rack),
new BoolProperty("limited","용량 무제한", rack.is_unlimited)
{
IsReadOnly=false
}.Bind(
setter: v => {rack.is_unlimited=v; SaveChange(rack,v,"is_unlimited"); }
),
CreateRackLayoutGroup(rack),
new ButtonProperty("InitializeButton","초기 재고 설정",""){
}.BindClick(()=>FindAnyObjectByType<InitialInventoryWindow>(FindObjectsInactive.Include).OpenRack(rack,PathIndexer.GetNodePath(rack))),
};
entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries(
"ReceivingTimePolicy", "입고 시간 정책", "display_mode_ReceicingTimePolicy",
() => rack.receiving_time_policy, v => rack.receiving_time_policy = v,
"receiving_time_policy", rack, SaveChange));
entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries(
"ShippingTimePolicy", "출고 시간 정책", "display_mode_ShippingTimePolicy",
() => rack.shipping_time_policy, v => rack.shipping_time_policy = v,
"shipping_time_policy", rack, SaveChange));
entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries(
"StorageCostPolicy", "보관 비용 정책", "display_mode_StorageCostPolicy",
() => rack.storage_cost_policy, v => rack.storage_cost_policy = v,
"storage_cost_policy", rack, SaveChange));
entries.Add(new BoolProperty("fms_input_enabled","입력에 FMS 사용", rack.fms_input_enabled)
{
IsReadOnly=true
}.Bind(
setter: v => {rack.fms_input_enabled=v; SaveChange(rack,v,"fms_input_enabled"); }
));
entries.Add(new BoolProperty("fms_output_enabled","출력에 FMS 사용", rack.fms_output_enabled)
{
IsReadOnly=true
}.Bind(
setter: v => {rack.fms_output_enabled=v; SaveChange(rack,v,"fms_output_enabled"); }
));
propertyWindow.LoadMixedProperties(entries);
PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ReceivingTimePolicy", rack.receiving_time_policy.policy.ToString());
PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ShippingTimePolicy", rack.shipping_time_policy.policy.ToString());
PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "StorageCostPolicy", rack.storage_cost_policy.policy.ToString());
}
private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e)
{
Debug.Log($"[PropertyChanged] Id:{e.PropertyId}, Type:{e.PropertyType}, Value:{e.NewValue}");
PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ReceicingTimePolicy", "ReceivingTimePolicy");
PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ShippingTimePolicy", "ShippingTimePolicy");
PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_StorageCostPolicy", "StorageCostPolicy");
if(e.PropertyId== "limited")
{
bool flag=Convert.ToBoolean(e.NewValue);
propertyWindow.SetPropertyEnabled("x", !flag);
propertyWindow.SetPropertyEnabled("z", !flag);
propertyWindow.SetPropertyEnabled("entityperblock", !flag);
propertyWindow.SetPropertyEnabled("InitializeButton", !flag);
}
}
private PropertyGroup CreatePositionGroup(RackDataClass rack)
{
return PropertyHelper.CreatePositionGroup("rack_position", rack, propertyWindow, SaveChange);
}
private PropertyGroup CreateRackLayoutGroup(RackDataClass rack)
{
var group = new PropertyGroup("racklayout", "랙 구조", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new IntProperty("x", "행 개수(x)", rack.rack_layout.x)
{
}.Bind(
setter: v => {rack.rack_layout.x = v;SaveChange(rack,v,"rack_layout.x");CleanupByLayoutShrink(rack); }
),
new IntProperty("y", "열 개수(y)", rack.rack_layout.z)
{
IsReadOnly=true
}.Bind(
setter: v => {rack.rack_layout.z = v;SaveChange(rack,v,"rack_layout.z");CleanupByLayoutShrink(rack); }
),
new IntProperty("z", "층 수(z)", rack.rack_layout.y)
{
}.Bind(
setter: v => {rack.rack_layout.y = v;SaveChange(rack,v,"rack_layout.y");CleanupByLayoutShrink(rack); }
),
});
return group;
}
public void CleanupByLayoutShrink(RackDataClass rack)
{
if (rack == null) return;
rack.initialize.RemoveAll(e => IsOutOfNewBounds(e, rack.rack_layout));
SaveChange(rack, rack.initialize, "initialize");
}
private bool IsOutOfNewBounds(InitializeEntry e, rack_layout rack_layout)
{
if (e == null || e.from_position == null || e.to_position == null) return true;
var minX = Math.Min(e.from_position.x, e.to_position.x);
var maxX = Math.Max(e.from_position.x, e.to_position.x);
var minY = Math.Min(e.from_position.y, e.to_position.y);
var maxY = Math.Max(e.from_position.y, e.to_position.y);
var minZ = Math.Min(e.from_position.z, e.to_position.z);
var maxZ = Math.Max(e.from_position.z, e.to_position.z);
if (minX < 1 || minY < 1 || minZ < 1) return true;
if (maxX > rack_layout.x) return true;
if (maxY > rack_layout.y) return true;
if (maxZ > rack_layout.z) return true;
return false;
}
private void OnDestroy()
{
if (propertyWindow != null)
propertyWindow.PropertyValueChanged -= OnPropertyValueChanged;
}
}