/// <summary> /// Ends drawing a property tree, and handles management of undo, as well as marking scenes and drawn assets dirty. /// </summary> /// <param name="tree">The tree.</param> public static void EndDrawPropertyTree(PropertyTree tree) { tree.InvokeDelayedActions(); if (tree.UnitySerializedObject != null) { if (mPropertyFieldGetter != null) { var obj = tree.UnitySerializedObject; IntPtr ptr = mPropertyFieldGetter(ref obj); if (ptr == IntPtr.Zero) { // SerializedObject has been disposed, likely due to a scene change invoked from GUI code. // BAIL THE F**K OUT! :D Crashes will happen. return; } } if (tree.WillUndo) { tree.UnitySerializedObject.ApplyModifiedProperties(); } else { tree.UnitySerializedObject.ApplyModifiedPropertiesWithoutUndo(); } } bool appliedOdinChanges = false; if (tree.ApplyChanges()) { appliedOdinChanges = true; GUIHelper.RequestRepaint(); if (tree.TargetType.ImplementsOrInherits(typeof(UnityEngine.Object))) { var targets = tree.WeakTargets; for (int i = 0; i < targets.Count; i++) { var target = (UnityEngine.Object)targets[i]; if (AssetDatabase.Contains(target)) { EditorUtility.SetDirty(target); } else if (Application.isPlaying == false) { #if UNITY_5_3_OR_NEWER if (tree.TargetType.ImplementsOrInherits(typeof(Component))) { Component component = (Component)target; UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(component.gameObject.scene); } else { // We can't find out where this thing is from // It is probably a "temporary" UnityObject created from a script somewhere // Just to be safe, mark it as dirty, and mark all scenes as dirty EditorUtility.SetDirty(target); UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty(); } #else EditorApplication.MarkSceneDirty(); #endif } } } } // This is very important, as applying changes may cause more actions to be delayed tree.InvokeDelayedActions(); if (appliedOdinChanges) { tree.InvokeOnValidate(); } drawnInspectorDepthCount--; #if ODIN_TRIAL_VERSION if (drawnInspectorDepthCount == 0) { float height = OdinTrialVersionInfo.IsExpired ? 22 : 17; var rect = GUILayoutUtility.GetRect(16, height, GUILayoutOptions.ExpandWidth().Height(height)); var bgRect = rect; bgRect.xMin -= 20; bgRect.xMax += 20; bgRect.y += 2; AllEditorGUI.DrawBorders(bgRect, 0, 0, 1, 0, SirenixGUIStyles.LightBorderColor); rect.y += 2; if (OdinTrialVersionInfo.IsExpired) { EditorGUI.DrawRect(bgRect, Color.black); GUIHelper.PushContentColor(Color.red); GUI.Label(rect.AddY(3), "ODIN Inspector Trial expired!", SirenixGUIStyles.Label); GUIHelper.PopContentColor(); var btnRect = rect.AlignRight(EditorStyles.miniButton.CalcSize(new GUIContent("Purchase ODIN Inspector")).x); btnRect.yMin += 2; btnRect.yMax -= 2; GUIHelper.PushColor(Color.green); if (GUI.Button(btnRect, "Purchase ODIN Inspector", EditorStyles.miniButton)) { UnityEditorInternal.AssetStore.Open("content/89041"); } GUIHelper.PopColor(); } else { GUI.Label(rect, "ODIN Inspector Trial Version", SirenixGUIStyles.LeftAlignedGreyMiniLabel); GUI.Label(rect, "Expires " + OdinTrialVersionInfo.ExpirationDate.ToShortDateString(), EditorStyles.centeredGreyMiniLabel); GUI.Label(rect, OdinTrialVersionInfo.ExpirationDate.Subtract(System.DateTime.Now).TotalHours.ToString("F2") + " hours remaining.", SirenixGUIStyles.RightAlignedGreyMiniLabel); } } #endif }
/// <summary> /// Ends drawing a property tree, and handles management of undo, as well as marking scenes and drawn assets dirty. /// </summary> /// <param name="tree">The tree.</param> public static void EndDrawPropertyTree(PropertyTree tree) { tree.InvokeDelayedActions(); if (tree.UnitySerializedObject != null) { if (SerializedObject_nativeObjectPtrGetter != null) { var obj = tree.UnitySerializedObject; IntPtr ptr = SerializedObject_nativeObjectPtrGetter(ref obj); if (ptr == IntPtr.Zero) { // SerializedObject has been disposed, likely due to a scene change invoked from GUI code. // BAIL THE F**K OUT! :D Crashes will happen. return; } } if (tree.WillUndo) { tree.UnitySerializedObject.ApplyModifiedProperties(); } else { tree.UnitySerializedObject.ApplyModifiedPropertiesWithoutUndo(); } } bool appliedOdinChanges = false; if (tree.ApplyChanges()) { appliedOdinChanges = true; GUIHelper.RequestRepaint(); } // This is very important, as applying changes may cause more actions to be delayed tree.InvokeDelayedActions(); if (appliedOdinChanges) { tree.InvokeOnValidate(); if (tree.PrefabModificationHandler.HasPrefabs) { var targets = tree.WeakTargets; for (int i = 0; i < targets.Count; i++) { if (tree.PrefabModificationHandler.TargetPrefabs[i] == null) { continue; } var target = (UnityEngine.Object)targets[i]; PrefabUtility.RecordPrefabInstancePropertyModifications(target); } } } if (tree.WillUndo) { Undo.FlushUndoRecordObjects(); } drawnInspectorDepthCount--; #if ODIN_TRIAL_VERSION if (drawnInspectorDepthCount == 0) { float height = OdinTrialVersionInfo.IsExpired ? 22 : 17; var rect = GUILayoutUtility.GetRect(16, height, GUILayoutOptions.ExpandWidth().Height(height)); var bgRect = rect; bgRect.xMin -= 20; bgRect.xMax += 20; bgRect.y += 2; SirenixEditorGUI.DrawBorders(bgRect, 0, 0, 1, 0, SirenixGUIStyles.LightBorderColor); rect.y += 2; if (OdinTrialVersionInfo.IsExpired) { EditorGUI.DrawRect(bgRect, Color.black); GUIHelper.PushContentColor(Color.red); GUI.Label(rect.AddY(3), "Odin Inspector Trial expired!", SirenixGUIStyles.Label); GUIHelper.PopContentColor(); var btnRect = rect.AlignRight(EditorStyles.miniButton.CalcSize(new GUIContent("Purchase Odin Inspector")).x); btnRect.yMin += 2; btnRect.yMax -= 2; GUIHelper.PushColor(Color.green); if (GUI.Button(btnRect, "Purchase Odin Inspector", EditorStyles.miniButton)) { UnityEditorInternal.AssetStore.Open("content/89041"); } GUIHelper.PopColor(); } else { GUI.Label(rect, "Odin Inspector Trial Version", SirenixGUIStyles.LeftAlignedGreyMiniLabel); GUI.Label(rect, "Expires " + OdinTrialVersionInfo.ExpirationDate.ToShortDateString(), EditorStyles.centeredGreyMiniLabel); GUI.Label(rect, OdinTrialVersionInfo.ExpirationDate.Subtract(System.DateTime.Now).TotalHours.ToString("F2") + " hours remaining.", SirenixGUIStyles.RightAlignedGreyMiniLabel); } } #endif }