// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System.Collections.Generic; using UnityEditor; using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; namespace Microsoft.MixedReality.GraphicsTools.Editor { /// /// A ScriptableObject that holds and persists the settings for the Measure Tool /// public class MeasureToolSettings : ScriptableObject { public const string MeasureToolSettingsPath = "Assets/Editor/MeasureToolSettings.asset"; public enum ToolMode { Auto = 0, Rect = 1, Collider = 2, Renderer = 3, BetweenObjects = 4, } public enum ToolUnits { Millimeter = 0, Centimeter = 1, Meter = 2, } public enum ToolScale { World = 0, Local = 1, } [SerializeField] private ToolMode mode; [SerializeField] private ToolUnits unit; [SerializeField] private ToolScale scale; [SerializeField] private Color lineColor = Color.black; [SerializeField] private float handlesSize = 0.01f; [SerializeField] private Color handlesColor = Color.white; [SerializeField] private float textSize = 16f; [SerializeField] private Color textColor = Color.yellow; [SerializeField] private float offset = 0.03f; [SerializeField] private float lineThickness = 4f; public ToolMode Mode { get => mode; } public ToolUnits Unit { get => unit; } public ToolScale Scale { get => scale; } public Color LineColor { get => lineColor; } public float HandlesSize { get => handlesSize; } public Color HandlesColor { get => handlesColor; } public float TextSize { get => textSize; } public Color TextColor { get => textColor; } public float Offset { get => offset; } public float LineThickness { get => lineThickness; set => lineThickness = value; } /// /// Handles getting the settings from a .asset file or creating a new one. /// /// Returns the current settings for the Measure Tool internal static MeasureToolSettings GetOrCreateSettings() { var settings = AssetDatabase.LoadAssetAtPath(MeasureToolSettingsPath); if (settings == null) { settings = CreateInstance(); if (!AssetDatabase.IsValidFolder("Assets/Editor")) { AssetDatabase.CreateFolder("Assets", "Editor"); AssetDatabase.Refresh(); } settings.mode = ToolMode.Auto; settings.unit = ToolUnits.Millimeter; settings.scale = ToolScale.World; settings.lineColor = Color.black; settings.handlesSize = 0.01f; settings.handlesColor = Color.white; settings.textSize = 16f; settings.textColor = Color.yellow; settings.offset = 0.03f; settings.lineThickness = 4f; AssetDatabase.CreateAsset(settings, MeasureToolSettingsPath); AssetDatabase.SaveAssets(); } return settings; } internal static SerializedObject GetSerializedSettings() { return new SerializedObject(GetOrCreateSettings()); } /// /// Integrates the settings into the Unity Editor /// Edit/Project Settings/Measure Tool Settings /// /// [SettingsProvider] private static SettingsProvider CreateMeasureToolSettingsProvider() { var provider = new SettingsProvider("Project/Measure Tool Settings", SettingsScope.Project) { activateHandler = (searchContext, rootElement) => { var settings = MeasureToolSettings.GetSerializedSettings(); rootElement.Add(SettingsUI()); rootElement.Bind(settings); }, keywords = new HashSet(new[] { "Measure", "Tool" }) }; return provider; } /// /// Returns a Visual Element to draw the Settings UI. /// This ensures that the settings are drawn consistently everywhere. /// /// public static VisualElement SettingsUI() { ScrollView scrollView = new ScrollView(); EnumField modeField = new EnumField("Mode"); modeField.bindingPath = "mode"; scrollView.Add(modeField); Foldout settingsFoldout = new Foldout(); settingsFoldout.text = "Settings"; settingsFoldout.value = false; scrollView.Add(settingsFoldout); EnumField unitField = new EnumField("Units"); unitField.name = "unitField"; unitField.bindingPath = "unit"; settingsFoldout.Add(unitField); EnumField scaleField = new EnumField("Scale"); scaleField.name = "scaleField"; scaleField.bindingPath = "scale"; settingsFoldout.Add(scaleField); ColorField textColorField = new ColorField("Text Color"); textColorField.name = "textColorField"; textColorField.bindingPath = "textColor"; settingsFoldout.Add(textColorField); Slider textSizeField = new Slider("Text Size", 10f, 28f); textSizeField.name = "textSizeField"; textSizeField.bindingPath = "textSize"; settingsFoldout.Add(textSizeField); ColorField lineColorField = new ColorField("Line Color"); lineColorField.name = "lineColorField"; lineColorField.bindingPath = "lineColor"; settingsFoldout.Add(lineColorField); Slider offsetField = new Slider("Lines Offset", 0f, 0.1f); offsetField.name = "offsetField"; offsetField.bindingPath = "offset"; settingsFoldout.Add(offsetField); Slider lineThicknessField = new Slider("Line Thickness", 1f, 12f); lineThicknessField.bindingPath = "lineThickness"; settingsFoldout.Add(lineThicknessField); return scrollView; } } }