#nullable enable using System; using System.Collections.Generic; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using T3.Core.DataTypes; using T3.Core.Operator; namespace T3.Editor.Gui.Windows.Output; /// /// Persisted per-symbol state for an OutputWindow instance. /// Stored as an array under "OutputWindows" in the .t3ui Settings block. /// internal sealed class OutputWindowState { public static readonly OutputWindowState Defaults = new(); // Gizmo state [JsonConverter(typeof(StringEnumConverter))] public GizmoVisibility ShowGizmos = GizmoVisibility.On; [JsonConverter(typeof(StringEnumConverter))] public TransformGizmoModes TransformGizmoMode = TransformGizmoModes.Move; // Background public float[] BackgroundColor = [0.1f, 0.1f, 0.1f, 1.0f]; // Camera [JsonConverter(typeof(StringEnumConverter))] public CameraControlModes CameraControlMode = CameraControlModes.AutoUseFirstCam; public float[] CameraPosition = [0, 0, 2.4142134f]; // DefaultCameraDistance public float[] CameraTarget = [0, 0, 0]; public float CameraRoll; public float CameraSpeed = 1; // Resolution public string? ResolutionTitle; public int ResolutionWidth; public int ResolutionHeight; public bool ResolutionUseAsAspectRatio; // Pinning public bool IsPinned; public Guid[] PinnedInstancePath = []; public Guid PinnedOutputId = Guid.Empty; /// /// Camera control modes — mirrors CameraSelectionHandling.ControlModes /// but as a public enum for serialization. /// public enum CameraControlModes { SceneViewerFollowing, UseViewer, AutoUseFirstCam, PickedACamera, } #region Serialization internal void WriteToJson(JsonTextWriter writer) { writer.WriteRawValue(JsonConvert.SerializeObject(this, Formatting.Indented)); } internal static OutputWindowState? ReadFromJson(JToken token) { return token.ToObject(); } internal static void WriteAllToJson(JsonTextWriter writer, List? states) { if (states == null || states.Count == 0) return; writer.WritePropertyName("OutputWindows"); writer.WriteStartArray(); foreach (var state in states) { state.WriteToJson(writer); } writer.WriteEndArray(); } internal static List? ReadAllFromJson(JToken? settingsToken) { if (settingsToken == null) return null; var arrayToken = settingsToken["OutputWindows"] as JArray; if (arrayToken == null) return null; var result = new List(); foreach (var item in arrayToken) { var state = ReadFromJson(item); if (state != null) result.Add(state); } return result.Count > 0 ? result : null; } #endregion }