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

105 lines
3.7 KiB
C#

using System;
using System.Collections.Generic;
using Simulator.Data;
using UVC.UI.Window.PropertyWindow;
public static class PropertyHelper
{
public static 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 static PropertyGroup CreatePositionGroup(
string groupId,
ComponentDataBase data,
PropertyWindow propertyWindow,
Action<object, object, string> saveChange)
{
var group = new PropertyGroup(groupId, "위치 및 회전", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("x_position", "X 좌표(m)", data.physical.position.x)
{
}.Bind(
setter: v => { data.physical.position.x = v; saveChange(data, v, "physical.position.x"); }
),
new FloatProperty("y_position", "y 좌표(m)", data.physical.position.y)
{
}.Bind(
setter: v => { data.physical.position.y = v; saveChange(data, v, "physical.position.y"); }
),
new FloatProperty("orientation", "회전(°)", data.physical.orientation)
{
}.Bind(
setter: v => { data.physical.orientation = v; saveChange(data, v, "physical.orientation"); propertyWindow.ApplyExternalValue("orientation", RotationSnap.SnapOrientation(v), false); }
),
});
return group;
}
public static PropertyGroup CreatePositionGroup(
string groupId,
Physical physical,
object dataOwner,
PropertyWindow propertyWindow,
Action<object, object, string> saveChange)
{
var group = new PropertyGroup(groupId, "위치 및 회전", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("x_position", "X 좌표(m)", physical.position.x)
{
}.Bind(
setter: v => { physical.position.x = v; saveChange(dataOwner, v, "physical.position.x"); }
),
new FloatProperty("y_position", "y 좌표(m)", physical.position.y)
{
}.Bind(
setter: v => { physical.position.y = v; saveChange(dataOwner, v, "physical.position.y"); }
),
new FloatProperty("orientation", "회전(°)", physical.orientation)
{
}.Bind(
setter: v => { physical.orientation = v; saveChange(dataOwner, v, "physical.orientation"); propertyWindow.ApplyExternalValue("orientation", RotationSnap.SnapOrientation(v), false); }
),
});
return group;
}
public static PropertyGroup CreateConnectionGroup(
string groupId,
string label,
List<InOutItem> items,
Action<object, object, string> saveChange)
{
var group = new PropertyGroup(groupId, label, isExpanded: true);
if (items == null || items.Count == 0)
{
group.AddItem(new StringProperty($"{groupId}.no_locs", "", "연결된 항목이 없습니다.")
{
IsReadOnly = true
});
return group;
}
foreach (var item in items)
{
string itemId = $"{groupId}.count.{item.target}";
var countProp = new IntProperty(itemId, item.target, item.required_items)
.Bind(setter: v =>
{
item.required_items = v; saveChange(item, item.required_items, "required_items");
});
group.AddItem(countProp);
}
return group;
}
}