123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- #if UNITY_EDITOR
- using System;
- using UnityEditor;
- using UnityEngine.InputSystem.Editor.Lists;
- using UnityEngine.InputSystem.Utilities;
-
- ////TODO: show parameters for selected interaction or processor inline in list rather than separately underneath list
-
- namespace UnityEngine.InputSystem.Editor
- {
- /// <summary>
- /// Base class for views that show the properties of actions or bindings.
- /// </summary>
- internal abstract class PropertiesViewBase
- {
- protected PropertiesViewBase(string label, SerializedProperty bindingOrAction, Action<FourCC> onChange, string expectedControlLayout = null)
- {
- if (bindingOrAction == null)
- throw new ArgumentNullException(nameof(bindingOrAction));
-
- m_InteractionsProperty = bindingOrAction.FindPropertyRelative("m_Interactions");
- m_ProcessorsProperty = bindingOrAction.FindPropertyRelative("m_Processors");
-
- m_InteractionsList = new InteractionsListView(m_InteractionsProperty, OnInteractionsModified, expectedControlLayout);
- UpdateProcessors(expectedControlLayout);
-
- m_OnChange = onChange;
- m_GeneralFoldoutLabel = EditorGUIUtility.TrTextContent(label);
- }
-
- protected void UpdateProcessors(string expectedControlLayout)
- {
- m_ProcessorsList = new ProcessorsListView(m_ProcessorsProperty, OnProcessorsModified, expectedControlLayout);
- }
-
- public void OnGUI()
- {
- EditorGUILayout.BeginVertical();
- DrawGeneralGroup();
- if (!m_IsPartOfComposite)
- {
- EditorGUILayout.Space();
- DrawInteractionsGroup();
- }
- EditorGUILayout.Space();
- DrawProcessorsGroup();
- GUILayout.FlexibleSpace();
- EditorGUILayout.EndVertical();
- }
-
- protected abstract void DrawGeneralProperties();
-
- private void DrawGeneralGroup()
- {
- m_GeneralFoldout = DrawFoldout(m_GeneralFoldoutLabel, m_GeneralFoldout);
- if (m_GeneralFoldout)
- {
- EditorGUI.indentLevel++;
- DrawGeneralProperties();
- EditorGUI.indentLevel--;
- }
- }
-
- private void DrawProcessorsGroup()
- {
- m_ProcessorsFoldout = DrawFoldout(s_ProcessorsFoldoutLabel, m_ProcessorsFoldout, s_ProcessorsAddButton, m_ProcessorsList.OnAddDropdown);
- if (m_ProcessorsFoldout)
- m_ProcessorsList.OnGUI();
- }
-
- private void DrawInteractionsGroup()
- {
- m_InteractionsFoldout = DrawFoldout(s_InteractionsFoldoutLabel, m_InteractionsFoldout, s_InteractionsAddButton, m_InteractionsList.OnAddDropdown);
- if (m_InteractionsFoldout)
- m_InteractionsList.OnGUI();
- }
-
- private static bool DrawFoldout(GUIContent content, bool folded, GUIContent addButton = null, Action<Rect> addDropDown = null)
- {
- const int k_PopupSize = 20;
- var bgRect = GUILayoutUtility.GetRect(content, Styles.s_FoldoutBackgroundStyle);
- EditorGUI.LabelField(bgRect, GUIContent.none, Styles.s_FoldoutBackgroundStyle);
- var foldoutRect = bgRect;
- foldoutRect.xMax -= k_PopupSize;
- var retval = EditorGUI.Foldout(foldoutRect, folded, content, true, Styles.s_FoldoutStyle);
- if (addButton != null)
- {
- var popupRect = bgRect;
- popupRect.xMin = popupRect.xMax - k_PopupSize;
- if (GUI.Button(popupRect, addButton, EditorStyles.label))
- addDropDown(popupRect);
- }
- return retval;
- }
-
- private void OnProcessorsModified()
- {
- m_ProcessorsProperty.stringValue = m_ProcessorsList.ToSerializableString();
- m_ProcessorsProperty.serializedObject.ApplyModifiedProperties();
- m_OnChange(k_ProcessorsChanged);
- }
-
- private void OnInteractionsModified()
- {
- m_InteractionsProperty.stringValue = m_InteractionsList.ToSerializableString();
- m_InteractionsProperty.serializedObject.ApplyModifiedProperties();
- m_OnChange(k_InteractionsChanged);
- }
-
- public Action<FourCC> onChange => m_OnChange;
-
- private bool m_GeneralFoldout = true;
- private bool m_InteractionsFoldout = true;
- private bool m_ProcessorsFoldout = true;
- protected bool m_IsPartOfComposite;
-
- private readonly Action<FourCC> m_OnChange;
-
- private readonly InteractionsListView m_InteractionsList;
- private ProcessorsListView m_ProcessorsList;
-
- private readonly SerializedProperty m_InteractionsProperty;
- private readonly SerializedProperty m_ProcessorsProperty;
-
- private readonly GUIContent m_GeneralFoldoutLabel;
-
- ////TODO: tooltips
- private static readonly GUIContent s_ProcessorsFoldoutLabel = EditorGUIUtility.TrTextContent("Processors");
- public static readonly GUIContent s_ProcessorsAddButton = EditorGUIUtility.TrIconContent("Toolbar Plus More", "Add Processor");
- private static readonly GUIContent s_InteractionsFoldoutLabel = EditorGUIUtility.TrTextContent("Interactions");
- public static readonly GUIContent s_InteractionsAddButton = EditorGUIUtility.TrIconContent("Toolbar Plus More", "Add Interaction");
-
- public static FourCC k_InteractionsChanged => new FourCC("IACT");
- public static FourCC k_ProcessorsChanged => new FourCC("PROC");
-
- private static class Styles
- {
- public static readonly GUIStyle s_FoldoutBackgroundStyle = new GUIStyle("Label")
- .WithNormalBackground(AssetDatabase.LoadAssetAtPath<Texture2D>(InputActionTreeView.ResourcesPath + "foldoutBackground.png"))
- .WithBorder(new RectOffset(3, 3, 3, 3))
- .WithMargin(new RectOffset(1, 1, 3, 3));
- public static readonly GUIStyle s_FoldoutStyle = new GUIStyle("foldout");
- }
- }
- }
- #endif // UNITY_EDITOR
|