FittsLaw/Assets/GoogleVR/Editor/Controller/GvrControllerVisualEditor.cs
2018-10-08 23:54:11 -04:00

142 lines
5.6 KiB
C#

// Copyright 2017 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using UnityEngine;
using UnityEditor;
using System.Collections;
/// Custom editor for GvrControllerVisual.
/// Enhances the visualization of the displayState and ensures that it can only be edited
/// if the application isn't playing or if readControllerState is turned off.
[CustomEditor(typeof(GvrControllerVisual)), CanEditMultipleObjects]
public class GvrControllerVisualEditor : Editor {
private SerializedProperty attachmentPrefabs;
private SerializedProperty touchPadColor;
private SerializedProperty appButtonColor;
private SerializedProperty systemButtonColor;
private SerializedProperty readControllerState;
private SerializedProperty displayState;
private SerializedProperty maximumAlpha;
private GUIStyle displayStateHeaderStyle;
private GUIContent displayStateHeaderContent;
private float displayStateHeaderHeight;
private const string DISPLAY_STATE_HEADER_TEXT = "DisplayState:";
private const string DISPLAY_STATE_ITEM_PREFIX = "• ";
private const int DISPLAY_STATE_HEADER_FONT_SIZE_OFFSET = 2;
private const string ATTACHMENT_PREFABS_PROP_NAME = "attachmentPrefabs";
private const string TOUCH_PAD_COLOR_PROP_NAME = "touchPadColor";
private const string APP_BUTTON_COLOR_PROP_NAME = "appButtonColor";
private const string SYSTEM_BUTTON_COLOR_PROP_NAME = "systemButtonColor";
private const string READ_CONTROLLER_STATE_PROP_NAME = "readControllerState";
private const string DISPLAY_STATE_PROP_NAME = "displayState";
private const string MAXIMUM_ALPHA_PROP_NAME = "maximumAlpha";
void OnEnable() {
attachmentPrefabs = serializedObject.FindProperty(ATTACHMENT_PREFABS_PROP_NAME);
touchPadColor = serializedObject.FindProperty(TOUCH_PAD_COLOR_PROP_NAME);
appButtonColor = serializedObject.FindProperty(APP_BUTTON_COLOR_PROP_NAME);
systemButtonColor = serializedObject.FindProperty(SYSTEM_BUTTON_COLOR_PROP_NAME);
readControllerState = serializedObject.FindProperty(READ_CONTROLLER_STATE_PROP_NAME);
displayState = serializedObject.FindProperty(DISPLAY_STATE_PROP_NAME);
maximumAlpha = serializedObject.FindProperty(MAXIMUM_ALPHA_PROP_NAME);
}
public override void OnInspectorGUI() {
serializedObject.Update();
// Add clickable script field, as would have been provided by DrawDefaultInspector()
MonoScript script = MonoScript.FromMonoBehaviour (target as MonoBehaviour);
EditorGUI.BeginDisabledGroup (true);
EditorGUILayout.ObjectField ("Script", script, typeof(MonoScript), false);
EditorGUI.EndDisabledGroup ();
CreateStylesAndContent();
// Show all properties except for display state.
EditorGUILayout.PropertyField(attachmentPrefabs, true);
EditorGUILayout.PropertyField(touchPadColor);
EditorGUILayout.PropertyField(appButtonColor);
EditorGUILayout.PropertyField(systemButtonColor);
EditorGUILayout.PropertyField(readControllerState);
// Determine if the display state can currently be edited in the inspector.
bool allowEditDisplayState = !readControllerState.boolValue || !Application.isPlaying;
if (!allowEditDisplayState) {
// Prevents editing the display state in the inspector.
GUI.enabled = false;
}
Rect displayStateRect = EditorGUILayout.BeginVertical();
GUI.Box(displayStateRect, "");
// Show the display state header.
EditorGUILayout.LabelField(displayStateHeaderContent,
displayStateHeaderStyle,
GUILayout.Height(displayStateHeaderHeight));
// Indent the display state properties.
EditorGUI.indentLevel++;
// Iterate through the child properties of the displayState property.
SerializedProperty iter = displayState.Copy();
SerializedProperty nextElement = displayState.Copy();
bool hasNextElement = nextElement.Next(false);
iter.NextVisible(true);
do {
// It iter is the same as nextElement, then the iter has moved beyond the children of the
// display state which means it has finished showing the display state.
if (hasNextElement && SerializedProperty.EqualContents(nextElement, iter)) {
break;
}
GUIContent content = new GUIContent(DISPLAY_STATE_ITEM_PREFIX + iter.displayName);
EditorGUILayout.PropertyField(iter, content);
} while (iter.NextVisible(false));
// End the vertical region and draw the box.
EditorGUI.indentLevel--;
EditorGUILayout.Space();
EditorGUILayout.EndVertical();
// Reset GUI.enabled.
if (!allowEditDisplayState) {
GUI.enabled = true;
}
EditorGUILayout.PropertyField(maximumAlpha);
serializedObject.ApplyModifiedProperties();
}
private void CreateStylesAndContent() {
if (displayStateHeaderContent == null) {
displayStateHeaderContent = new GUIContent(DISPLAY_STATE_HEADER_TEXT);
}
if (displayStateHeaderStyle == null) {
displayStateHeaderStyle = new GUIStyle(EditorStyles.boldLabel);
displayStateHeaderStyle.fontSize =
displayStateHeaderStyle.font.fontSize + DISPLAY_STATE_HEADER_FONT_SIZE_OFFSET;
displayStateHeaderHeight = displayStateHeaderStyle.CalcSize(displayStateHeaderContent).y;
}
}
}