using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; using UnityEngine.UI; using SFB; namespace RimWorldAnimationStudio { public class ApplicationManager : Singleton { public DialogBox exitDialog; public SelectAnimationDialog selectAnimationDialog; public void TryToCloseApplication() { exitDialog.Pop(); } public void CloseApplication() { Debug.Log("Exiting application"); Application.Quit(); } public void TryToLoadAnimation() { var paths = StandaloneFileBrowser.OpenFilePanel("Open AnimationDef File", "", "xml", false); if (paths == null || paths.Any() == false) { Debug.LogError("Selected file was null or invalid"); return; } Defs defs = XmlUtility.ReadXML(paths[0]); if (defs?.animationDefs == null) { Debug.LogError("Selected file contains no animation data"); return; } if (defs.animationDefs.Count == 1) { LoadAnimation(defs.animationDefs[0]); return; } selectAnimationDialog.Initialize(defs); selectAnimationDialog.Pop(); } public void LoadAnimation(AnimationDef animationDef) { Debug.Log("Loaded AnimationDef: " + animationDef.defName); Workspace.animationDef = animationDef; animationDef.Initialize(); Workspace.isDirty = true; var animationDefCards = Resources.FindObjectsOfTypeAll(typeof(AnimationDefCard)) as AnimationDefCard[]; if (animationDefCards != null) { animationDefCards[0].Initialize(); animationDefCards[0].gameObject.SetActive(true); } } public void TrySaveAnimation() { if (Workspace.animationDef == null) { return; } string defName = Workspace.animationDef.defName != null && Workspace.animationDef.defName != "" ? Workspace.animationDef.defName : "newAnimationDef"; var path = StandaloneFileBrowser.SaveFilePanel("Save AnimationDef File", "", defName, "xml"); if (path != null && path != "") { SaveAnimation(path); } } public void SaveAnimation(string path) { Debug.Log("Saving AnimationDef: " + Workspace.animationDef.defName); AnimationDef animationDef = Workspace.animationDef; foreach (AnimationStage stage in animationDef.animationStages) { foreach (PawnAnimationClip clip in stage.animationClips) { clip.keyframes = clip.keyframes.OrderBy(x => x.atTick).ToList(); } } Defs defs = new Defs(); defs.animationDefs.Add(animationDef); XmlUtility.WriteXML(defs, path); } public void NewAnimation() { return; AnimationDef animationDef = new AnimationDef(); // Add one stage, add one actor, add one clip, add one frame Workspace.animationDef = new AnimationDef(); Workspace.isDirty = true; var animationDefCards = Resources.FindObjectsOfTypeAll(typeof(AnimationDefCard)) as GameObject[]; if (animationDefCards != null) { animationDefCards[0].SetActive(true); } } } }