UniversalViewer/Assets/Scripts/ModelViewerBase/UI/UIPoseContainer.cs

130 lines
3.7 KiB
C#

using UnityEngine;
using System.Linq;
using Newtonsoft.Json;
using System.IO;
using System;
public class UIPoseContainer : MonoBehaviour
{
public DataType Type;
public string PoseName;
public KeyframeData KeyframeData;
public TMPro.TMP_InputField NameLabel;
static UISaveLoadPanel SaveLoadPanel => ModelViewerInterface.GetInstance().CanvasContainer.SaveLoadPanel;
static ModelViewerMain Main => ModelViewerMain.GetInstance();
public static UIPoseContainer CreateNew(string poseName, KeyframeData poseData, bool forceOverride)
{
if (poseData == null) return null;
if (string.IsNullOrEmpty(poseName))
{
Error.Log(Color.red, "Name the pose first");
return null;
}
if (SaveLoadPanel.GetPoseByName(poseName, out var savedPose))
{
if (!forceOverride)
{
Error.Log(Color.red, "Preset with this name already exists");
return null;
}
}
else
{
savedPose = Instantiate(SharedResources.Instance.UIPoseContainer, SaveLoadPanel.ScrollPose.content);
SaveLoadPanel.AddPose(savedPose);
}
savedPose.Init(poseName, poseData);
return savedPose;
}
public void Init(string poseName, KeyframeData poseData)
{
NameLabel.text = poseName;
NameLabel.interactable = false;
KeyframeData = poseData;
transform.SetAsFirstSibling();
}
public void SaveNew()
{
var poseName = NameLabel.text;
if (SaveLoadPanel.GetPoseByName(poseName, out var savedPose))
{
Error.Log(Color.red, "Preset with this name already exists");
return;
}
else
{
savedPose = Instantiate(SharedResources.Instance.UIPoseContainer, SaveLoadPanel.ScrollPose.content);
savedPose.NameLabel.text = poseName;
SaveLoadPanel.AddPose(savedPose);
}
savedPose.Save();
}
public void Save()
{
Error.Log(Color.blue, $"Saving pose...");
var poseData = Main.SelectedObject.SerializeFrame();
string poseName = NameLabel.text;
string fileName = Path.GetFullPath(Path.Combine(UISaveLoadPanel.SavePoseDirectory, $"{poseName}.pose"));
try
{
var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto, DefaultValueHandling = DefaultValueHandling.Ignore };
var json = JsonConvert.SerializeObject(poseData, typeof(KeyframeData), Formatting.Indented, settings);
File.WriteAllText(fileName, json);
Error.Log(Color.green, $"Pose saved to {fileName}");
}
catch (Exception ex)
{
Error.Log(Color.red, ex.Message);
return;
}
Init(poseName, poseData);
}
public void Load()
{
if (Main.SelectedObject == null) return;
if (Input.GetKey(KeyCode.LeftShift))
{
LoadAdvanced();
}
else
{
Main.SelectedObject.PastePose(KeyframeData, new PoseLoadOptions(true));
}
}
public void LoadAdvanced()
{
if (Main.SelectedObject == null) return;
UIPopupPastePanel.Create(
(pasteOption) => { Main.SelectedObject.PastePose(KeyframeData, pasteOption); Debug.Log(pasteOption.Root); },
() => { });
}
public void Delete()
{
Destroy(this.gameObject);
string path = Path.GetFullPath(Path.Combine(UISaveLoadPanel.SavePoseDirectory, $"{NameLabel.text}.pose"));
if (File.Exists(path))
File.Delete(path);
Error.Log(Color.yellow, "Deleted " + path);
}
}