| | |
| | | using System; |
| | | using UnityEngine; |
| | | using System.Collections.Generic; |
| | | using System.Globalization; |
| | | using System.Reflection; |
| | | using UnityEngine.PostProcessing; |
| | | |
| | | namespace UnityEditor.PostProcessing |
| | | { |
| | | public static class EditorGUIHelper |
| | | { |
| | | static EditorGUIHelper() |
| | | { |
| | | s_GUIContentCache = new Dictionary<string, GUIContent>(); |
| | | } |
| | | |
| | | #region GUIContent caching |
| | | |
| | | static Dictionary<string, GUIContent> s_GUIContentCache; |
| | | |
| | | public static GUIContent GetContent(string textAndTooltip) |
| | | { |
| | | if (string.IsNullOrEmpty(textAndTooltip)) |
| | | return GUIContent.none; |
| | | |
| | | GUIContent content; |
| | | |
| | | if (!s_GUIContentCache.TryGetValue(textAndTooltip, out content)) |
| | | { |
| | | var s = textAndTooltip.Split('|'); |
| | | content = new GUIContent(s[0]); |
| | | |
| | | if (s.Length > 1 && !string.IsNullOrEmpty(s[1])) |
| | | content.tooltip = s[1]; |
| | | |
| | | s_GUIContentCache.Add(textAndTooltip, content); |
| | | } |
| | | |
| | | return content; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | public static bool Header(string title, SerializedProperty group, Action resetAction) |
| | | { |
| | | var rect = GUILayoutUtility.GetRect(16f, 22f, FxStyles.header); |
| | | GUI.Box(rect, title, FxStyles.header); |
| | | |
| | | var display = group == null || group.isExpanded; |
| | | |
| | | var foldoutRect = new Rect(rect.x + 4f, rect.y + 2f, 13f, 13f); |
| | | var e = Event.current; |
| | | |
| | | var popupRect = new Rect(rect.x + rect.width - FxStyles.paneOptionsIcon.width - 5f, rect.y + FxStyles.paneOptionsIcon.height / 2f + 1f, FxStyles.paneOptionsIcon.width, FxStyles.paneOptionsIcon.height); |
| | | GUI.DrawTexture(popupRect, FxStyles.paneOptionsIcon); |
| | | |
| | | if (e.type == EventType.Repaint) |
| | | FxStyles.headerFoldout.Draw(foldoutRect, false, false, display, false); |
| | | |
| | | if (e.type == EventType.MouseDown) |
| | | { |
| | | if (popupRect.Contains(e.mousePosition)) |
| | | { |
| | | var popup = new GenericMenu(); |
| | | popup.AddItem(GetContent("Reset"), false, () => resetAction()); |
| | | popup.AddSeparator(string.Empty); |
| | | popup.AddItem(GetContent("Copy Settings"), false, () => CopySettings(group)); |
| | | |
| | | if (CanPaste(group)) |
| | | popup.AddItem(GetContent("Paste Settings"), false, () => PasteSettings(group)); |
| | | else |
| | | popup.AddDisabledItem(GetContent("Paste Settings")); |
| | | |
| | | popup.ShowAsContext(); |
| | | } |
| | | else if (rect.Contains(e.mousePosition) && group != null) |
| | | { |
| | | display = !display; |
| | | |
| | | if (group != null) |
| | | group.isExpanded = !group.isExpanded; |
| | | |
| | | e.Use(); |
| | | } |
| | | } |
| | | |
| | | return display; |
| | | } |
| | | |
| | | public static bool Header(string title, SerializedProperty group, SerializedProperty enabledField, Action resetAction) |
| | | { |
| | | var field = ReflectionUtils.GetFieldInfoFromPath(enabledField.serializedObject.targetObject, enabledField.propertyPath); |
| | | object parent = null; |
| | | PropertyInfo prop = null; |
| | | |
| | | if (field != null && field.IsDefined(typeof(GetSetAttribute), false)) |
| | | { |
| | | var attr = (GetSetAttribute)field.GetCustomAttributes(typeof(GetSetAttribute), false)[0]; |
| | | parent = ReflectionUtils.GetParentObject(enabledField.propertyPath, enabledField.serializedObject.targetObject); |
| | | prop = parent.GetType().GetProperty(attr.name); |
| | | } |
| | | |
| | | var display = group == null || group.isExpanded; |
| | | var enabled = enabledField.boolValue; |
| | | |
| | | var rect = GUILayoutUtility.GetRect(16f, 22f, FxStyles.header); |
| | | GUI.Box(rect, title, FxStyles.header); |
| | | |
| | | var toggleRect = new Rect(rect.x + 4f, rect.y + 4f, 13f, 13f); |
| | | var e = Event.current; |
| | | |
| | | var popupRect = new Rect(rect.x + rect.width - FxStyles.paneOptionsIcon.width - 5f, rect.y + FxStyles.paneOptionsIcon.height / 2f + 1f, FxStyles.paneOptionsIcon.width, FxStyles.paneOptionsIcon.height); |
| | | GUI.DrawTexture(popupRect, FxStyles.paneOptionsIcon); |
| | | |
| | | if (e.type == EventType.Repaint) |
| | | FxStyles.headerCheckbox.Draw(toggleRect, false, false, enabled, false); |
| | | |
| | | if (e.type == EventType.MouseDown) |
| | | { |
| | | const float kOffset = 2f; |
| | | toggleRect.x -= kOffset; |
| | | toggleRect.y -= kOffset; |
| | | toggleRect.width += kOffset * 2f; |
| | | toggleRect.height += kOffset * 2f; |
| | | |
| | | if (toggleRect.Contains(e.mousePosition)) |
| | | { |
| | | enabledField.boolValue = !enabledField.boolValue; |
| | | |
| | | if (prop != null) |
| | | prop.SetValue(parent, enabledField.boolValue, null); |
| | | |
| | | e.Use(); |
| | | } |
| | | else if (popupRect.Contains(e.mousePosition)) |
| | | { |
| | | var popup = new GenericMenu(); |
| | | popup.AddItem(GetContent("Reset"), false, () => resetAction()); |
| | | popup.AddSeparator(string.Empty); |
| | | popup.AddItem(GetContent("Copy Settings"), false, () => CopySettings(group)); |
| | | |
| | | if (CanPaste(group)) |
| | | popup.AddItem(GetContent("Paste Settings"), false, () => PasteSettings(group)); |
| | | else |
| | | popup.AddDisabledItem(GetContent("Paste Settings")); |
| | | |
| | | popup.ShowAsContext(); |
| | | } |
| | | else if (rect.Contains(e.mousePosition) && group != null) |
| | | { |
| | | display = !display; |
| | | group.isExpanded = !group.isExpanded; |
| | | e.Use(); |
| | | } |
| | | } |
| | | |
| | | return display; |
| | | } |
| | | |
| | | static void CopySettings(SerializedProperty settings) |
| | | { |
| | | var t = typeof(PostProcessingProfile); |
| | | var settingsStruct = ReflectionUtils.GetFieldValueFromPath(settings.serializedObject.targetObject, ref t, settings.propertyPath); |
| | | var serializedString = t.ToString() + '|' + JsonUtility.ToJson(settingsStruct); |
| | | EditorGUIUtility.systemCopyBuffer = serializedString; |
| | | } |
| | | |
| | | static bool CanPaste(SerializedProperty settings) |
| | | { |
| | | var data = EditorGUIUtility.systemCopyBuffer; |
| | | |
| | | if (string.IsNullOrEmpty(data)) |
| | | return false; |
| | | |
| | | var parts = data.Split('|'); |
| | | |
| | | if (string.IsNullOrEmpty(parts[0])) |
| | | return false; |
| | | |
| | | var field = ReflectionUtils.GetFieldInfoFromPath(settings.serializedObject.targetObject, settings.propertyPath); |
| | | return parts[0] == field.FieldType.ToString(); |
| | | } |
| | | |
| | | static void PasteSettings(SerializedProperty settings) |
| | | { |
| | | Undo.RecordObject(settings.serializedObject.targetObject, "Paste effect settings"); |
| | | var field = ReflectionUtils.GetFieldInfoFromPath(settings.serializedObject.targetObject, settings.propertyPath); |
| | | var json = EditorGUIUtility.systemCopyBuffer.Substring(field.FieldType.ToString().Length + 1); |
| | | var obj = JsonUtility.FromJson(json, field.FieldType); |
| | | var parent = ReflectionUtils.GetParentObject(settings.propertyPath, settings.serializedObject.targetObject); |
| | | field.SetValue(parent, obj, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, CultureInfo.CurrentCulture); |
| | | } |
| | | } |
| | | } |
| | | using System;
|
| | | using UnityEngine;
|
| | | using System.Collections.Generic;
|
| | | using System.Globalization;
|
| | | using System.Reflection;
|
| | | using UnityEngine.PostProcessing;
|
| | |
|
| | | namespace UnityEditor.PostProcessing
|
| | | {
|
| | | public static class EditorGUIHelper
|
| | | {
|
| | | static EditorGUIHelper()
|
| | | {
|
| | | s_GUIContentCache = new Dictionary<string, GUIContent>();
|
| | | }
|
| | |
|
| | | #region GUIContent caching
|
| | |
|
| | | static Dictionary<string, GUIContent> s_GUIContentCache;
|
| | |
|
| | | public static GUIContent GetContent(string textAndTooltip)
|
| | | {
|
| | | if (string.IsNullOrEmpty(textAndTooltip))
|
| | | return GUIContent.none;
|
| | |
|
| | | GUIContent content;
|
| | |
|
| | | if (!s_GUIContentCache.TryGetValue(textAndTooltip, out content))
|
| | | {
|
| | | var s = textAndTooltip.Split('|');
|
| | | content = new GUIContent(s[0]);
|
| | |
|
| | | if (s.Length > 1 && !string.IsNullOrEmpty(s[1]))
|
| | | content.tooltip = s[1];
|
| | |
|
| | | s_GUIContentCache.Add(textAndTooltip, content);
|
| | | }
|
| | |
|
| | | return content;
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | public static bool Header(string title, SerializedProperty group, Action resetAction)
|
| | | {
|
| | | var rect = GUILayoutUtility.GetRect(16f, 22f, FxStyles.header);
|
| | | GUI.Box(rect, title, FxStyles.header);
|
| | |
|
| | | var display = group == null || group.isExpanded;
|
| | |
|
| | | var foldoutRect = new Rect(rect.x + 4f, rect.y + 2f, 13f, 13f);
|
| | | var e = Event.current;
|
| | |
|
| | | var popupRect = new Rect(rect.x + rect.width - FxStyles.paneOptionsIcon.width - 5f, rect.y + FxStyles.paneOptionsIcon.height / 2f + 1f, FxStyles.paneOptionsIcon.width, FxStyles.paneOptionsIcon.height);
|
| | | GUI.DrawTexture(popupRect, FxStyles.paneOptionsIcon);
|
| | |
|
| | | if (e.type == EventType.Repaint)
|
| | | FxStyles.headerFoldout.Draw(foldoutRect, false, false, display, false);
|
| | |
|
| | | if (e.type == EventType.MouseDown)
|
| | | {
|
| | | if (popupRect.Contains(e.mousePosition))
|
| | | {
|
| | | var popup = new GenericMenu();
|
| | | popup.AddItem(GetContent("Reset"), false, () => resetAction());
|
| | | popup.AddSeparator(string.Empty);
|
| | | popup.AddItem(GetContent("Copy Settings"), false, () => CopySettings(group));
|
| | |
|
| | | if (CanPaste(group))
|
| | | popup.AddItem(GetContent("Paste Settings"), false, () => PasteSettings(group));
|
| | | else
|
| | | popup.AddDisabledItem(GetContent("Paste Settings"));
|
| | |
|
| | | popup.ShowAsContext();
|
| | | }
|
| | | else if (rect.Contains(e.mousePosition) && group != null)
|
| | | {
|
| | | display = !display;
|
| | |
|
| | | if (group != null)
|
| | | group.isExpanded = !group.isExpanded;
|
| | |
|
| | | e.Use();
|
| | | }
|
| | | }
|
| | |
|
| | | return display;
|
| | | }
|
| | |
|
| | | public static bool Header(string title, SerializedProperty group, SerializedProperty enabledField, Action resetAction)
|
| | | {
|
| | | var field = ReflectionUtils.GetFieldInfoFromPath(enabledField.serializedObject.targetObject, enabledField.propertyPath);
|
| | | object parent = null;
|
| | | PropertyInfo prop = null;
|
| | |
|
| | | if (field != null && field.IsDefined(typeof(GetSetAttribute), false))
|
| | | {
|
| | | var attr = (GetSetAttribute)field.GetCustomAttributes(typeof(GetSetAttribute), false)[0];
|
| | | parent = ReflectionUtils.GetParentObject(enabledField.propertyPath, enabledField.serializedObject.targetObject);
|
| | | prop = parent.GetType().GetProperty(attr.name);
|
| | | }
|
| | |
|
| | | var display = group == null || group.isExpanded;
|
| | | var enabled = enabledField.boolValue;
|
| | |
|
| | | var rect = GUILayoutUtility.GetRect(16f, 22f, FxStyles.header);
|
| | | GUI.Box(rect, title, FxStyles.header);
|
| | |
|
| | | var toggleRect = new Rect(rect.x + 4f, rect.y + 4f, 13f, 13f);
|
| | | var e = Event.current;
|
| | |
|
| | | var popupRect = new Rect(rect.x + rect.width - FxStyles.paneOptionsIcon.width - 5f, rect.y + FxStyles.paneOptionsIcon.height / 2f + 1f, FxStyles.paneOptionsIcon.width, FxStyles.paneOptionsIcon.height);
|
| | | GUI.DrawTexture(popupRect, FxStyles.paneOptionsIcon);
|
| | |
|
| | | if (e.type == EventType.Repaint)
|
| | | FxStyles.headerCheckbox.Draw(toggleRect, false, false, enabled, false);
|
| | |
|
| | | if (e.type == EventType.MouseDown)
|
| | | {
|
| | | const float kOffset = 2f;
|
| | | toggleRect.x -= kOffset;
|
| | | toggleRect.y -= kOffset;
|
| | | toggleRect.width += kOffset * 2f;
|
| | | toggleRect.height += kOffset * 2f;
|
| | |
|
| | | if (toggleRect.Contains(e.mousePosition))
|
| | | {
|
| | | enabledField.boolValue = !enabledField.boolValue;
|
| | |
|
| | | if (prop != null)
|
| | | prop.SetValue(parent, enabledField.boolValue, null);
|
| | |
|
| | | e.Use();
|
| | | }
|
| | | else if (popupRect.Contains(e.mousePosition))
|
| | | {
|
| | | var popup = new GenericMenu();
|
| | | popup.AddItem(GetContent("Reset"), false, () => resetAction());
|
| | | popup.AddSeparator(string.Empty);
|
| | | popup.AddItem(GetContent("Copy Settings"), false, () => CopySettings(group));
|
| | |
|
| | | if (CanPaste(group))
|
| | | popup.AddItem(GetContent("Paste Settings"), false, () => PasteSettings(group));
|
| | | else
|
| | | popup.AddDisabledItem(GetContent("Paste Settings"));
|
| | |
|
| | | popup.ShowAsContext();
|
| | | }
|
| | | else if (rect.Contains(e.mousePosition) && group != null)
|
| | | {
|
| | | display = !display;
|
| | | group.isExpanded = !group.isExpanded;
|
| | | e.Use();
|
| | | }
|
| | | }
|
| | |
|
| | | return display;
|
| | | }
|
| | |
|
| | | static void CopySettings(SerializedProperty settings)
|
| | | {
|
| | | var t = typeof(PostProcessingProfile);
|
| | | var settingsStruct = ReflectionUtils.GetFieldValueFromPath(settings.serializedObject.targetObject, ref t, settings.propertyPath);
|
| | | var serializedString = t.ToString() + '|' + JsonUtility.ToJson(settingsStruct);
|
| | | EditorGUIUtility.systemCopyBuffer = serializedString;
|
| | | }
|
| | |
|
| | | static bool CanPaste(SerializedProperty settings)
|
| | | {
|
| | | var data = EditorGUIUtility.systemCopyBuffer;
|
| | |
|
| | | if (string.IsNullOrEmpty(data))
|
| | | return false;
|
| | |
|
| | | var parts = data.Split('|');
|
| | |
|
| | | if (string.IsNullOrEmpty(parts[0]))
|
| | | return false;
|
| | |
|
| | | var field = ReflectionUtils.GetFieldInfoFromPath(settings.serializedObject.targetObject, settings.propertyPath);
|
| | | return parts[0] == field.FieldType.ToString();
|
| | | }
|
| | |
|
| | | static void PasteSettings(SerializedProperty settings)
|
| | | {
|
| | | Undo.RecordObject(settings.serializedObject.targetObject, "Paste effect settings");
|
| | | var field = ReflectionUtils.GetFieldInfoFromPath(settings.serializedObject.targetObject, settings.propertyPath);
|
| | | var json = EditorGUIUtility.systemCopyBuffer.Substring(field.FieldType.ToString().Length + 1);
|
| | | var obj = JsonUtility.FromJson(json, field.FieldType);
|
| | | var parent = ReflectionUtils.GetParentObject(settings.propertyPath, settings.serializedObject.targetObject);
|
| | | field.SetValue(parent, obj, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, CultureInfo.CurrentCulture);
|
| | | }
|
| | | }
|
| | | }
|