private void OnDestroy()
        {
            EditorToolManager.Remove(this);

            ToolManager.activeToolChanged -= HandleActivation;
            UnregisterCallbacks();
        }
        protected void DoOpenEndedInspector <U>(SerializedProperty isOpenEndedProperty) where U : PathEditorTool <T>
        {
            serializedObject.Update();

            using (var check = new EditorGUI.ChangeCheckScope())
            {
                EditorGUILayout.PropertyField(isOpenEndedProperty);

                if (check.changed)
                {
                    if (EditorToolManager.IsActiveTool <U>() && EditorToolManager.IsAvailable <U>())
                    {
                        var paths = EditorToolManager.GetEditorTool <U>().paths;

                        foreach (var path in paths)
                        {
                            path.undoObject.RegisterUndo("Set Open Ended");
                            path.isOpenEnded = isOpenEndedProperty.boolValue;
                        }
                    }
                }
            }

            serializedObject.ApplyModifiedProperties();
        }
 protected void DoSnappingInspector <U>() where U : PathEditorTool <T>
 {
     if (EditorToolManager.IsActiveTool <U>() && EditorToolManager.IsAvailable <U>())
     {
         var tool = EditorToolManager.GetEditorTool <U>();
         tool.enableSnapping = EditorGUILayout.Toggle(Contents.snappingLabel, tool.enableSnapping);
     }
 }
        private void OnEnable()
        {
            m_IsActive = false;
            EditorToolManager.Add(this);

            SetupRectSelector();
            HandleActivation();

            ToolManager.activeToolChanged += HandleActivation;
        }
        protected void DoEditButton <U>(GUIContent icon, string label) where U : PathEditorTool <T>
        {
            const float kButtonWidth  = 33;
            const float kButtonHeight = 23;
            const float k_SpaceBetweenLabelAndButton = 5;
            var         buttonStyle = new GUIStyle("EditModeSingleButton");

            var rect       = EditorGUILayout.GetControlRect(true, kButtonHeight, buttonStyle);
            var buttonRect = new Rect(rect.xMin + EditorGUIUtility.labelWidth, rect.yMin, kButtonWidth, kButtonHeight);

            var labelContent = new GUIContent(label);
            var labelSize    = GUI.skin.label.CalcSize(labelContent);

            var labelRect = new Rect(
                buttonRect.xMax + k_SpaceBetweenLabelAndButton,
                rect.yMin + (rect.height - labelSize.y) * .5f,
                labelSize.x,
                rect.height);

            using (new EditorGUI.DisabledGroupScope(!EditorToolManager.IsAvailable <U>()))
            {
                using (var check = new EditorGUI.ChangeCheckScope())
                {
                    var isActive = GUI.Toggle(buttonRect, EditorToolManager.IsActiveTool <U>(), icon, buttonStyle);

                    GUI.Label(labelRect, label);

                    if (check.changed)
                    {
                        if (isActive)
                        {
                            ToolManager.SetActiveTool <U>();
                        }
                        else
                        {
                            ToolManager.RestorePreviousTool();
                        }
                    }
                }
            }
        }
        protected void DoPathInspector <U>() where U : PathEditorTool <T>
        {
            if (EditorToolManager.IsActiveTool <U>() && EditorToolManager.IsAvailable <U>())
            {
                var paths = EditorToolManager.GetEditorTool <U>().paths;

                CreateCachedEditor(paths, null, ref m_CachedEditor);

                if (m_CachedEditor == null) //Needed to avoid a nullref on exiting playmode
                {
                    return;
                }

                using (var check = new EditorGUI.ChangeCheckScope())
                {
                    m_CachedEditor.OnInspectorGUI();

                    if (check.changed)
                    {
                        EditorToolManager.GetEditorTool <U>().SetShapes();
                    }
                }
            }
        }