using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
namespace FairyGUIEditor
{
///
///
///
[CustomEditor(typeof(FairyGUI.UIPanel))]
public class UIPanelEditor : Editor
{
SerializedProperty packageName;
SerializedProperty componentName;
SerializedProperty packagePath;
SerializedProperty renderMode;
SerializedProperty renderCamera;
SerializedProperty sortingOrder;
SerializedProperty position;
SerializedProperty scale;
SerializedProperty rotation;
SerializedProperty fairyBatching;
SerializedProperty fitScreen;
SerializedProperty touchDisabled;
SerializedProperty hitTestMode;
SerializedProperty setNativeChildrenOrder;
string[] propertyToExclude;
void OnEnable()
{
packageName = serializedObject.FindProperty("packageName");
componentName = serializedObject.FindProperty("componentName");
packagePath = serializedObject.FindProperty("packagePath");
renderMode = serializedObject.FindProperty("renderMode");
renderCamera = serializedObject.FindProperty("renderCamera");
sortingOrder = serializedObject.FindProperty("sortingOrder");
position = serializedObject.FindProperty("position");
scale = serializedObject.FindProperty("scale");
rotation = serializedObject.FindProperty("rotation");
fairyBatching = serializedObject.FindProperty("fairyBatching");
fitScreen = serializedObject.FindProperty("fitScreen");
touchDisabled = serializedObject.FindProperty("touchDisabled");
hitTestMode = serializedObject.FindProperty("hitTestMode");
setNativeChildrenOrder = serializedObject.FindProperty("setNativeChildrenOrder");
propertyToExclude = new string[] { "m_Script", "packageName", "componentName", "packagePath", "renderMode",
"renderCamera", "sortingOrder", "position", "scale", "rotation", "fairyBatching", "fitScreen","touchDisabled",
"hitTestMode","cachedUISize","setNativeChildrenOrder"
};
}
public override void OnInspectorGUI()
{
serializedObject.Update();
FairyGUI.UIPanel panel = target as FairyGUI.UIPanel;
DrawPropertiesExcluding(serializedObject, propertyToExclude);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Package Name");
if (GUILayout.Button(packageName.stringValue, "ObjectField"))
EditorWindow.GetWindow(true, "Select a UI Component").SetSelection(packageName.stringValue, componentName.stringValue);
if (GUILayout.Button("Clear", GUILayout.Width(50)))
{
#if UNITY_2018_3_OR_NEWER
bool isPrefab = PrefabUtility.GetPrefabAssetType(panel) != PrefabAssetType.NotAPrefab;
#else
bool isPrefab = PrefabUtility.GetPrefabType(panel) == PrefabType.Prefab;
#endif
panel.SendMessage("OnUpdateSource", new object[] { null, null, null, !isPrefab });
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Component Name");
if (GUILayout.Button(componentName.stringValue, "ObjectField"))
EditorWindow.GetWindow(true, "Select a UI Component").SetSelection(packageName.stringValue, componentName.stringValue);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Package Path");
EditorGUILayout.LabelField(packagePath.stringValue, (GUIStyle)"helpbox");
EditorGUILayout.EndHorizontal();
if (Application.isPlaying)
EditorGUILayout.EnumPopup("Render Mode", panel.container.renderMode);
else
EditorGUILayout.PropertyField(renderMode);
if ((RenderMode)renderMode.enumValueIndex != RenderMode.ScreenSpaceOverlay)
EditorGUILayout.PropertyField(renderCamera);
int oldSortingOrder = panel.sortingOrder;
EditorGUILayout.PropertyField(sortingOrder);
EditorGUILayout.PropertyField(fairyBatching);
EditorGUILayout.PropertyField(hitTestMode);
EditorGUILayout.PropertyField(touchDisabled);
EditorGUILayout.PropertyField(setNativeChildrenOrder);
EditorGUILayout.Separator();
EditorGUILayout.LabelField("UI Transform", (GUIStyle)"OL Title");
EditorGUILayout.Separator();
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(position);
EditorGUILayout.PropertyField(rotation);
EditorGUILayout.PropertyField(scale);
EditorGUILayout.Space();
FairyGUI.FitScreen oldFitScreen = (FairyGUI.FitScreen)fitScreen.enumValueIndex;
EditorGUILayout.PropertyField(fitScreen);
if (serializedObject.ApplyModifiedProperties())
{
#if UNITY_2018_3_OR_NEWER
bool isPrefab = PrefabUtility.GetPrefabAssetType(panel) != PrefabAssetType.NotAPrefab;
#else
bool isPrefab = PrefabUtility.GetPrefabType(panel) == PrefabType.Prefab;
#endif
if (!isPrefab)
{
panel.ApplyModifiedProperties(sortingOrder.intValue != oldSortingOrder, (FairyGUI.FitScreen)fitScreen.enumValueIndex != oldFitScreen);
}
}
}
void OnSceneGUI()
{
FairyGUI.UIPanel panel = (target as FairyGUI.UIPanel);
if (panel.container == null)
return;
Vector3 pos = panel.GetUIWorldPosition();
float sizeFactor = HandleUtility.GetHandleSize(pos);
#if UNITY_2022_2_OR_NEWER
Vector3 newPos = Handles.FreeMoveHandle(pos, sizeFactor, Vector3.one, Handles.ArrowHandleCap);
#elif UNITY_2017_1_OR_NEWER
Vector3 newPos = Handles.FreeMoveHandle(pos, Quaternion.identity, sizeFactor, Vector3.one, Handles.ArrowHandleCap);
#else
Vector3 newPos = Handles.FreeMoveHandle(pos, Quaternion.identity, sizeFactor, Vector3.one, Handles.ArrowCap);
#endif
if (newPos != pos)
{
Vector2 v1 = HandleUtility.WorldToGUIPoint(pos);
Vector2 v2 = HandleUtility.WorldToGUIPoint(newPos);
Vector3 delta = v2 - v1;
delta.x = (int)delta.x;
delta.y = (int)delta.y;
panel.MoveUI(delta);
}
}
}
}