using System; namespace Mapbox.Editor { using UnityEngine; using UnityEditor; using Mapbox.Unity.Map; using Mapbox.Platform.TilesetTileJSON; using System.Collections.Generic; using Mapbox.VectorTile.ExtensionMethods; [CustomEditor(typeof(AbstractMap))] [CanEditMultipleObjects] public class MapManagerEditor : Editor { private string objectId = ""; private Color previewButtonColor = new Color(0.7f, 1.0f, 0.7f); /// /// Gets or sets a value indicating whether to show general section . /// /// true then show general section; otherwise hide, false. bool ShowGeneral { get { return EditorPrefs.GetBool(objectId + "MapManagerEditor_showGeneral"); } set { EditorPrefs.SetBool(objectId + "MapManagerEditor_showGeneral", value); } } /// /// Gets or sets a value to show or hide Image section. /// /// true if show image; otherwise, false. bool ShowImage { get { return EditorPrefs.GetBool(objectId + "MapManagerEditor_showImage"); } set { EditorPrefs.SetBool(objectId + "MapManagerEditor_showImage", value); } } /// /// Gets or sets a value to show or hide Terrain section /// /// true if show terrain; otherwise, false. bool ShowTerrain { get { return EditorPrefs.GetBool(objectId + "MapManagerEditor_showTerrain"); } set { EditorPrefs.SetBool(objectId + "MapManagerEditor_showTerrain", value); } } /// /// Gets or sets a value to show or hide Map Layers section show features. /// /// true if show features; otherwise, false. bool ShowMapLayers { get { return EditorPrefs.GetBool(objectId + "MapManagerEditor_showMapLayers"); } set { EditorPrefs.SetBool(objectId + "MapManagerEditor_showMapLayers", value); } } bool ShowPosition { get { return EditorPrefs.GetBool(objectId + "MapManagerEditor_showPosition"); } set { EditorPrefs.SetBool(objectId + "MapManagerEditor_showPosition", value); } } private GUIContent tilesetIdGui = new GUIContent { text = "Tileset Id", tooltip = "Id of the tileset." }; bool _isGUIContentSet = false; GUIContent[] _sourceTypeContent; static float _lineHeight = EditorGUIUtility.singleLineHeight; VectorLayerPropertiesDrawer _vectorLayerDrawer = new VectorLayerPropertiesDrawer(); public override void OnInspectorGUI() { objectId = serializedObject.targetObject.GetInstanceID().ToString(); serializedObject.Update(); EditorGUILayout.BeginVertical(); EditorGUILayout.Space(); var previewOptions = serializedObject.FindProperty("_previewOptions"); var prevProp = previewOptions.FindPropertyRelative("isPreviewEnabled"); var prev = prevProp.boolValue; Color guiColor = GUI.color; GUI.color = (prev) ? previewButtonColor : guiColor; GUIStyle style = new GUIStyle("Button"); style.alignment = TextAnchor.MiddleCenter; if (!Application.isPlaying) { prevProp.boolValue = GUILayout.Toggle(prevProp.boolValue, "Enable Preview", style); GUI.color = guiColor; EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); } ShowGeneral = EditorGUILayout.Foldout(ShowGeneral, new GUIContent { text = "GENERAL", tooltip = "Options related to map data" }); if (ShowGeneral) { DrawMapOptions(serializedObject); } ShowSepartor(); ShowImage = EditorGUILayout.Foldout(ShowImage, "IMAGE"); if (ShowImage) { GUILayout.Space(-1.5f * _lineHeight); ShowSection(serializedObject.FindProperty("_imagery"), "_layerProperty"); } ShowSepartor(); ShowTerrain = EditorGUILayout.Foldout(ShowTerrain, "TERRAIN"); if (ShowTerrain) { GUILayout.Space(-1.5f * _lineHeight); ShowSection(serializedObject.FindProperty("_terrain"), "_layerProperty"); } ShowSepartor(); ShowMapLayers = EditorGUILayout.Foldout(ShowMapLayers, "MAP LAYERS"); if (ShowMapLayers) { DrawMapLayerOptions(); } EditorGUILayout.EndVertical(); EditorGUILayout.Space(); serializedObject.ApplyModifiedProperties(); var vectorDataProperty = serializedObject.FindProperty("_vectorData"); var layerProperty = vectorDataProperty.FindPropertyRelative("_layerProperty"); _vectorLayerDrawer.PostProcessLayerProperties(layerProperty); if (!Application.isPlaying) { if (prevProp.boolValue && !prev) { ((AbstractMap)serializedObject.targetObject).EnableEditorPreview(); } else if (prev && !prevProp.boolValue) { ((AbstractMap)serializedObject.targetObject).DisableEditorPreview(); } } } void ShowSection(SerializedProperty property, string propertyName) { EditorGUILayout.Space(); EditorGUILayout.PropertyField(property.FindPropertyRelative(propertyName)); } void ShowSepartor() { EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); EditorGUILayout.Space(); } void DrawMapOptions(SerializedObject mapObject) { var property = mapObject.FindProperty("_options"); if (!((AbstractMap)serializedObject.targetObject).IsAccessTokenValid) { EditorGUILayout.HelpBox("Invalid Access Token. Please add a valid access token using the Mapbox > Setup Menu", MessageType.Error); } EditorGUILayout.LabelField("Location ", GUILayout.Height(_lineHeight)); EditorGUILayout.PropertyField(property.FindPropertyRelative("locationOptions")); var extentOptions = property.FindPropertyRelative("extentOptions"); var extentOptionsType = extentOptions.FindPropertyRelative("extentType"); if ((MapExtentType)extentOptionsType.enumValueIndex == MapExtentType.Custom) { var tileProviderProperty = mapObject.FindProperty("_tileProvider"); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(extentOptionsType); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(extentOptions); } EditorGUI.indentLevel++; EditorGUILayout.PropertyField(tileProviderProperty); EditorGUI.indentLevel--; } else { GUILayout.Space(-_lineHeight); EditorGUILayout.PropertyField(extentOptions); } EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(serializedObject.FindProperty("_initializeOnStart")); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(property); } ShowPosition = EditorGUILayout.Foldout(ShowPosition, "Others"); if (ShowPosition) { GUILayout.Space(-_lineHeight); EditorGUI.BeginChangeCheck(); var placementOptions = property.FindPropertyRelative("placementOptions"); EditorGUILayout.PropertyField(placementOptions); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(placementOptions); } GUILayout.Space(-_lineHeight); EditorGUI.BeginChangeCheck(); var scalingOptions = property.FindPropertyRelative("scalingOptions"); EditorGUILayout.PropertyField(scalingOptions); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(scalingOptions); } EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(property.FindPropertyRelative("loadingTexture")); EditorGUILayout.PropertyField(property.FindPropertyRelative("tileMaterial")); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(property); } } } void DrawMapLayerOptions() { var vectorDataProperty = serializedObject.FindProperty("_vectorData"); var layerProperty = vectorDataProperty.FindPropertyRelative("_layerProperty"); var layerSourceProperty = layerProperty.FindPropertyRelative("sourceOptions"); var sourceTypeProperty = layerProperty.FindPropertyRelative("_sourceType"); VectorSourceType sourceTypeValue = (VectorSourceType)sourceTypeProperty.enumValueIndex; var layerSourceId = layerProperty.FindPropertyRelative("sourceOptions.layerSource.Id"); string layerString = layerSourceId.stringValue; var isActiveProperty = layerSourceProperty.FindPropertyRelative("isActive"); var displayNames = sourceTypeProperty.enumDisplayNames; var names = sourceTypeProperty.enumNames; int count = sourceTypeProperty.enumDisplayNames.Length; if (!_isGUIContentSet) { _sourceTypeContent = new GUIContent[count]; var index = 0; foreach (var name in names) { _sourceTypeContent[index] = new GUIContent { text = displayNames[index], tooltip = ((VectorSourceType)Enum.Parse(typeof(VectorSourceType), name)).Description(), }; index++; } // // for (int extIdx = 0; extIdx < count; extIdx++) // { // _sourceTypeContent[extIdx] = new GUIContent // { // text = displayNames[extIdx], // tooltip = ((VectorSourceType)extIdx).Description(), // }; // } _isGUIContentSet = true; } EditorGUI.BeginChangeCheck(); sourceTypeProperty.enumValueIndex = EditorGUILayout.Popup(new GUIContent { text = "Data Source", tooltip = "Source tileset for Vector Data" }, sourceTypeProperty.enumValueIndex, _sourceTypeContent); //sourceTypeValue = (VectorSourceType)sourceTypeProperty.enumValueIndex; sourceTypeValue = ((VectorSourceType)Enum.Parse(typeof(VectorSourceType), names[sourceTypeProperty.enumValueIndex])); switch (sourceTypeValue) { case VectorSourceType.MapboxStreets: case VectorSourceType.MapboxStreetsV8: case VectorSourceType.MapboxStreetsWithBuildingIds: case VectorSourceType.MapboxStreetsV8WithBuildingIds: var sourcePropertyValue = MapboxDefaultVector.GetParameters(sourceTypeValue); layerSourceId.stringValue = sourcePropertyValue.Id; GUI.enabled = false; EditorGUILayout.PropertyField(layerSourceProperty, tilesetIdGui); GUI.enabled = true; isActiveProperty.boolValue = true; break; case VectorSourceType.Custom: EditorGUILayout.PropertyField(layerSourceProperty, tilesetIdGui); isActiveProperty.boolValue = true; break; case VectorSourceType.None: isActiveProperty.boolValue = false; break; default: isActiveProperty.boolValue = false; break; } if (sourceTypeValue != VectorSourceType.None) { var isStyleOptimized = layerProperty.FindPropertyRelative("useOptimizedStyle"); EditorGUILayout.PropertyField(isStyleOptimized); if (isStyleOptimized.boolValue) { EditorGUILayout.PropertyField(layerProperty.FindPropertyRelative("optimizedStyle"), new GUIContent("Style Options")); } GUILayout.Space(-_lineHeight); EditorGUILayout.PropertyField(layerProperty.FindPropertyRelative("performanceOptions"), new GUIContent("Perfomance Options")); } EditorGUILayout.Space(); ShowSepartor(); _vectorLayerDrawer.DrawUI(layerProperty); if (EditorGUI.EndChangeCheck()) { EditorHelper.CheckForModifiedProperty(layerProperty); } } } }