using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEngine.XR.Interaction.Toolkit;
using UnityEngine.XR.Interaction.Toolkit.Inputs.Simulation;
namespace UnityEditor.XR.Interaction.Toolkit
{
///
/// Class configuration to display XR Interaction Toolkit settings in the Project Settings window.
///
class XRInteractionToolkitSettingsProvider : SettingsProvider
{
///
/// Scope that adds a top and a left margin.
///
class SettingsMarginScope : GUI.Scope
{
internal SettingsMarginScope()
{
const float topMargin = 10f;
const float leftMargin = 10f;
GUILayout.BeginHorizontal();
GUILayout.Space(leftMargin);
GUILayout.BeginVertical();
GUILayout.Space(topMargin);
}
protected override void CloseScope()
{
GUILayout.EndVertical();
GUILayout.EndHorizontal();
}
}
///
/// Contents of GUI elements used by this settings provider.
///
internal static class Contents
{
public static readonly GUIContent interactionSimulatorSettingsTitle = new GUIContent("Interaction Simulator Settings");
public static readonly GUIContent interactionLayerSettingsTitle = new GUIContent("Interaction Layer Settings");
public static readonly GUIContent editorSettingsTitle = new GUIContent("Editor Settings");
public static readonly GUIStyle sectionTitleStyle = new GUIStyle("Label")
{
fontSize = 15,
fontStyle = FontStyle.Bold,
};
}
///
/// The path to display this settings provider in the Project Settings window.
///
internal const string k_SettingsPath = "Project/XR Plug-in Management/XR Interaction Toolkit";
Editor m_InteractionLayerSettingsEditor;
Editor m_XRInteractionEditorSettingsEditor;
Editor m_XRDeviceSimulatorSettingsEditor;
///
/// Create and returns this settings provider.
///
/// Returns a new instance of this settings provider.
[SettingsProvider]
#pragma warning disable IDE0051 // Remove unused private members -- Invoked by Unity due to attribute
static SettingsProvider CreateInteractionLayerProvider()
#pragma warning restore IDE0051
{
var keywordsList = GetSearchKeywordsFromPath(AssetDatabase.GetAssetPath(InteractionLayerSettings.Instance)).ToList();
return new XRInteractionToolkitSettingsProvider { keywords = keywordsList };
}
XRInteractionToolkitSettingsProvider(string path = k_SettingsPath, SettingsScope scopes = SettingsScope.Project,
IEnumerable keywords = null)
: base(path, scopes, keywords)
{
}
///
/// Draws the editor.
///
void DrawXRInteractionEditorSettingsEditor()
{
if (m_XRInteractionEditorSettingsEditor != null)
{
GUILayout.Label(Contents.editorSettingsTitle, Contents.sectionTitleStyle);
m_XRInteractionEditorSettingsEditor.OnInspectorGUI();
}
}
///
/// Draws the editor.
///
void DrawInteractionLayerSettingsEditor()
{
if (m_InteractionLayerSettingsEditor != null)
{
GUILayout.Label(Contents.interactionLayerSettingsTitle, Contents.sectionTitleStyle);
m_InteractionLayerSettingsEditor.OnInspectorGUI();
}
}
///
/// Draws the editor.
///
void DrawXRDeviceSimulatorSettingsEditor()
{
if (m_InteractionLayerSettingsEditor != null)
{
GUILayout.Label(Contents.interactionSimulatorSettingsTitle, Contents.sectionTitleStyle);
m_XRDeviceSimulatorSettingsEditor.OnInspectorGUI();
}
}
///
public override void OnActivate(string searchContext, VisualElement rootElement)
{
base.OnActivate(searchContext, rootElement);
m_InteractionLayerSettingsEditor = Editor.CreateEditor(InteractionLayerSettings.Instance);
m_XRInteractionEditorSettingsEditor = Editor.CreateEditor(XRInteractionEditorSettings.Instance);
m_XRDeviceSimulatorSettingsEditor = Editor.CreateEditor(XRDeviceSimulatorSettings.Instance);
}
///
public override void OnDeactivate()
{
base.OnDeactivate();
if (m_InteractionLayerSettingsEditor != null)
Object.DestroyImmediate(m_InteractionLayerSettingsEditor);
if (m_XRInteractionEditorSettingsEditor != null)
Object.DestroyImmediate(m_XRInteractionEditorSettingsEditor);
if (m_XRDeviceSimulatorSettingsEditor != null)
Object.DestroyImmediate(m_XRDeviceSimulatorSettingsEditor);
}
///
public override void OnGUI(string searchContext)
{
base.OnGUI(searchContext);
using (new SettingsMarginScope())
{
DrawXRDeviceSimulatorSettingsEditor();
EditorGUILayout.Space();
DrawXRInteractionEditorSettingsEditor();
EditorGUILayout.Space();
DrawInteractionLayerSettingsEditor();
}
}
}
}