using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.UIElements; using UnityEditorInternal; using UnityEngine; using UnityEngine.UIElements; namespace AibisDream.FrameAnimation.Editor { public sealed class FrameAnimationGraphEditorWindow : EditorWindow { private enum ResourceTab { Clips, Flows, Sources } private enum BottomTab { ImportDiff, Validation } private enum ValidationKindFilter { All, Graph, Clip, Flow, Source, Node, Edge } private const string LastGraphGuidKey = "AibisDream.FrameAnimation.Workspace.LastGraphGuid"; [SerializeField] private FrameAnimationGraph graph; private ObjectField graphField; private ToolbarButton graphPropertiesButton; private ToolbarButton graphBreadcrumbButton; private Label dirtyLabel; private Label canvasLabel; private FrameAnimationGraphView graphView; private PopupField flowFocusField; private string focusedFlowId = string.Empty; private IReadOnlyList multiSelectedNodes = Array.Empty(); private AnimationNode lastSelectedNode; private Vector2 browserDragStart; private bool browserDragPending; private ListView resourceList; private readonly List browserEntries = new List(); private ToolbarSearchField searchField; private EnumField filterField; private EnumField sortField; private VisualElement propertyContainer; private VisualElement bottomContainer; private VisualElement leftPanel; private VisualElement rightPanel; private VisualElement bottomPanel; private VisualElement globalToolbarHost; private VisualElement mainHost; private VisualElement bottomHost; private readonly List resourceTabButtons = new List(); private readonly List bottomTabButtons = new List(); private ResourceTab resourceTab; private BottomTab bottomTab; private FrameAnimationClipFilter clipFilter; private FrameAnimationClipSort clipSort; private FrameAnimationEditorSelection selection; private FrameAnimationImportPreview importPreview; private IReadOnlyList validationIssues = Array.Empty(); private bool bottomCollapsed; private bool showErrors = true; private bool showWarnings = true; private bool showInfo = true; private ValidationKindFilter validationKindFilter; private double validateAt = -1d; private SerializedObject clipSerializedObject; private FrameClip frameListClip; private ReorderableList frameList; private bool frameListEditable; private readonly FrameAnimationPreviewCoordinator previewCoordinator = new FrameAnimationPreviewCoordinator(); private readonly List previewTimelineSliders = new List(); private readonly List