142 lines
5.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|