| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | using System.Linq;using System;using System.Xml.Linq;using UnityEngine;using UnityEditor;using UnityEditor.Callbacks;using UnityEngine.UIElements;using UnityEngine.SceneManagement;using UnityEditor.SceneManagement;namespace GraphProcessor{	[System.Serializable]	public abstract class BaseGraphWindow : EditorWindow	{		protected VisualElement		rootView;		protected BaseGraphView		graphView;		[SerializeField]		protected BaseGraph			graph;		readonly string				graphWindowStyle = "GraphProcessorStyles/BaseGraphView";		public bool					isGraphLoaded		{			get { return graphView != null && graphView.graph != null; }		}		bool						reloadWorkaround = false;		public event Action< BaseGraph >	graphLoaded;		public event Action< BaseGraph >	graphUnloaded;		/// <summary>		/// Called by Unity when the window is enabled / opened		/// </summary>		protected virtual void OnEnable()		{			InitializeRootView();			if (graph != null)				LoadGraph();			else				reloadWorkaround = true;		}			protected virtual void Update()		{			// Workaround for the Refresh option of the editor window:			// When Refresh is clicked, OnEnable is called before the serialized data in the			// editor window is deserialized, causing the graph view to not be loaded			if (reloadWorkaround && graph != null)			{				LoadGraph();				reloadWorkaround = false;			}		}		void LoadGraph()		{            // We wait for the graph to be initialized            if (graph.isEnabled)                InitializeGraph(graph);            else                graph.onEnabled += () => InitializeGraph(graph);		}		/// <summary>		/// Called by Unity when the window is disabled (happens on domain reload)		/// </summary>		protected virtual void OnDisable()		{			if (graph != null && graphView != null)				graphView.SaveGraphToDisk();		}				/// <summary>		/// Called by Unity when the window is closed		/// </summary>		protected virtual void OnDestroy() { }		void InitializeRootView()		{			rootView = base.rootVisualElement;			rootView.name = "graphRootView";			rootView.styleSheets.Add(Resources.Load<StyleSheet>(graphWindowStyle));		}		public void InitializeGraph(BaseGraph graph)		{			if (this.graph != null && graph != this.graph)			{				// Save the graph to the disk				EditorUtility.SetDirty(this.graph);				AssetDatabase.SaveAssets();				// Unload the graph				graphUnloaded?.Invoke(this.graph);			}			graphLoaded?.Invoke(graph);			this.graph = graph;			if (graphView != null)				rootView.Remove(graphView);			//Initialize will provide the BaseGraphView			InitializeWindow(graph);			graphView = rootView.Children().FirstOrDefault(e => e is BaseGraphView) as BaseGraphView;			if (graphView == null)			{				Debug.LogError("GraphView has not been added to the BaseGraph root view !");				return ;			}			graphView.Initialize(graph);			InitializeGraphView(graphView);			// TOOD: onSceneLinked...			if (graph.IsLinkedToScene())				LinkGraphWindowToScene(graph.GetLinkedScene());			else				graph.onSceneLinked += LinkGraphWindowToScene;		}		void LinkGraphWindowToScene(Scene scene)		{			EditorSceneManager.sceneClosed += CloseWindowWhenSceneIsClosed;			void CloseWindowWhenSceneIsClosed(Scene closedScene)			{				if (scene == closedScene)				{					Close();					EditorSceneManager.sceneClosed -= CloseWindowWhenSceneIsClosed;				}			}		}		public virtual void OnGraphDeleted()		{			if (graph != null && graphView != null)				rootView.Remove(graphView);			graphView = null;		}		protected abstract void	InitializeWindow(BaseGraph graph);		protected virtual void InitializeGraphView(BaseGraphView view) {}	}}
 |