void OnEnable()
        {
            BonsaiPreferences.Instance = BonsaiPreferences.LoadDefaultPreferences();
            BonsaiEditor.FetchBehaviourNodes();

            Editor = new BonsaiEditor();
            Viewer = new BonsaiViewer();
            Saver  = new BonsaiSaver();

            Saver.SaveMessage += (sender, message) => ShowNotification(new GUIContent(message));

            Editor.Viewer                   = Viewer;
            Editor.Input.SaveRequest       += (s, e) => Save();
            Editor.CanvasChanged           += (s, e) => Repaint();
            Editor.Input.MouseDown         += (s, e) => Repaint();
            Editor.Input.MouseUp           += (s, e) => Repaint();
            Editor.EditorMode.ValueChanged += (s, mode) => { EditorMode = mode; };

            EditorApplication.playModeStateChanged += PlayModeStateChanged;

            BuildCanvas();

            // Always start in edit mode.
            //
            // The only way it can be in view mode is if the window is
            // already opened and the user selects a game object with a
            // behaviour tree component.
            Editor.EditorMode.Value = BonsaiEditor.Mode.Edit;
        }
        /// <summary>
        /// Opens the tree in a Bonsai Window.
        /// </summary>
        /// <param name="tree">The tree to open</param>
        /// <returns>
        /// The window that opens the tree. Null if already opened.
        /// </returns>
        public static BonsaiWindow OpenTree(BehaviourTree tree, BonsaiEditor.Mode mode = BonsaiEditor.Mode.Edit)
        {
            if (!tree)
            {
                return(null);
            }

            // Try to find an editor window without a canvas...
            var windows = Resources.FindObjectsOfTypeAll <BonsaiWindow>();

            bool isAlreadyOpened = windows.Any(w => w.Tree == tree);

            if (isAlreadyOpened)
            {
                return(null);
            }

            // Find a window without any tree.
            BonsaiWindow window = windows.FirstOrDefault(w => w.Tree == null);

            // No windows available, make a new one.
            if (!window)
            {
                window = CreateInstance <BonsaiWindow>();
                window.Show();
            }

            window.SetTree(tree, mode);
            return(window);
        }
        void OnEnable()
        {
            BonsaiPreferences.Instance = BonsaiPreferences.LoadDefaultPreferences();
            BonsaiEditor.FetchBehaviourNodes();

            Editor = new BonsaiEditor();
            Viewer = new BonsaiViewer();
            Saver  = new BonsaiSaver();

            Saver.SaveMessage += (sender, message) => ShowNotification(new GUIContent(message));

            Editor.Viewer                   = Viewer;
            Editor.Input.SaveRequest       += (s, e) => Save();
            Editor.CanvasChanged           += (s, e) => Repaint();
            Editor.Input.MouseDown         += (s, e) => Repaint();
            Editor.Input.MouseUp           += (s, e) => Repaint();
            Editor.EditorMode.ValueChanged += (s, mode) => { EditorMode = mode; };

            EditorApplication.playModeStateChanged    += PlayModeStateChanged;
            AssemblyReloadEvents.beforeAssemblyReload += BeforeAssemblyReload;
            Selection.selectionChanged += SelectionChanged;

            BuildCanvas();
            Editor.EditorMode.Value = BonsaiEditor.Mode.Edit;
            SwitchToViewModeIfRequired();
        }
        public void SetEditorMode(BonsaiEditor.Mode status)
        {
            editorMode = status;

            if (Canvas == null || Canvas.Tree == null)
            {
                editorModeLabel = "No Tree Set";
            }
            else
            {
                editorModeLabel = status == BonsaiEditor.Mode.Edit ? "Edit" : "View";
            }
        }
 public void SetTree(BehaviourTree bt, BonsaiEditor.Mode mode = BonsaiEditor.Mode.Edit)
 {
     behaviourTree = bt;
     BuildCanvas();
     Editor.EditorMode.Value = mode;
 }