namespace Mapbox.Editor { using System; using UnityEngine; using UnityEditor; using Mapbox.Unity.Map; public class VectorLayerPropertiesDrawer { private string objectId = ""; /// /// Gets or sets a value to show or hide Vector section . /// /// true if show vector; otherwise, false. bool ShowLocationPrefabs { get { return EditorPrefs.GetBool(objectId + "VectorLayerProperties_showLocationPrefabs"); } set { EditorPrefs.SetBool(objectId + "VectorLayerProperties_showLocationPrefabs", value); } } /// /// Gets or sets a value to show or hide Vector section . /// /// true if show vector; otherwise, false. bool ShowFeatures { get { return EditorPrefs.GetBool(objectId + "VectorLayerProperties_showFeatures"); } set { EditorPrefs.SetBool(objectId + "VectorLayerProperties_showFeatures", value); } } private GUIContent _requiredTilesetIdGui = new GUIContent { text = "Required Tileset Id", tooltip = "For location prefabs to spawn the \"streets-v7\" tileset needs to be a part of the Vector data source" }; FeaturesSubLayerPropertiesDrawer _vectorSublayerDrawer = new FeaturesSubLayerPropertiesDrawer(); PointsOfInterestSubLayerPropertiesDrawer _poiSublayerDrawer = new PointsOfInterestSubLayerPropertiesDrawer(); void ShowSepartor() { EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); EditorGUILayout.Space(); } public void DrawUI(SerializedProperty property) { objectId = property.serializedObject.targetObject.GetInstanceID().ToString(); var layerSourceProperty = property.FindPropertyRelative("sourceOptions"); var sourceTypeProperty = property.FindPropertyRelative("_sourceType"); var names = sourceTypeProperty.enumNames; VectorSourceType sourceTypeValue = ((VectorSourceType) Enum.Parse(typeof(VectorSourceType), names[sourceTypeProperty.enumValueIndex])); //VectorSourceType sourceTypeValue = (VectorSourceType)sourceTypeProperty.enumValueIndex; string streets_v7 = MapboxDefaultVector.GetParameters(VectorSourceType.MapboxStreets).Id; var layerSourceId = layerSourceProperty.FindPropertyRelative("layerSource.Id"); string layerString = layerSourceId.stringValue; //Draw POI Section if (sourceTypeValue == VectorSourceType.None) { return; } ShowLocationPrefabs = EditorGUILayout.Foldout(ShowLocationPrefabs, "POINTS OF INTEREST"); if (ShowLocationPrefabs) { if (sourceTypeValue != VectorSourceType.None && layerString.Contains(streets_v7)) { GUI.enabled = false; EditorGUILayout.TextField(_requiredTilesetIdGui, streets_v7); GUI.enabled = true; _poiSublayerDrawer.DrawUI(property); } else { EditorGUILayout.HelpBox("In order to place points of interest please add \"mapbox.mapbox-streets-v7\" to the data source.", MessageType.Error); } } ShowSepartor(); //Draw Feature section. ShowFeatures = EditorGUILayout.Foldout(ShowFeatures, "FEATURES"); if (ShowFeatures) { _vectorSublayerDrawer.DrawUI(property); } } public void PostProcessLayerProperties(SerializedProperty property) { var layerSourceProperty = property.FindPropertyRelative("sourceOptions"); var sourceTypeProperty = property.FindPropertyRelative("_sourceType"); VectorSourceType sourceTypeValue = (VectorSourceType)sourceTypeProperty.enumValueIndex; string streets_v7 = MapboxDefaultVector.GetParameters(VectorSourceType.MapboxStreets).Id; var layerSourceId = layerSourceProperty.FindPropertyRelative("layerSource.Id"); string layerString = layerSourceId.stringValue; if (ShowLocationPrefabs) { if (_poiSublayerDrawer.isLayerAdded == true && sourceTypeValue != VectorSourceType.None && layerString.Contains(streets_v7)) { var prefabItemArray = property.FindPropertyRelative("locationPrefabList"); var prefabItem = prefabItemArray.GetArrayElementAtIndex(prefabItemArray.arraySize - 1); PrefabItemOptions prefabItemOptionToAdd = (PrefabItemOptions)EditorHelper.GetTargetObjectOfProperty(prefabItem) as PrefabItemOptions; ((VectorLayerProperties)EditorHelper.GetTargetObjectOfProperty(property)).OnSubLayerPropertyAdded(new VectorLayerUpdateArgs { property = prefabItemOptionToAdd }); _poiSublayerDrawer.isLayerAdded = false; } } if (ShowFeatures) { if (_vectorSublayerDrawer.isLayerAdded == true) { var subLayerArray = property.FindPropertyRelative("vectorSubLayers"); var subLayer = subLayerArray.GetArrayElementAtIndex(subLayerArray.arraySize - 1); ((VectorLayerProperties)EditorHelper.GetTargetObjectOfProperty(property)).OnSubLayerPropertyAdded(new VectorLayerUpdateArgs { property = EditorHelper.GetTargetObjectOfProperty(subLayer) as MapboxDataProperty }); _vectorSublayerDrawer.isLayerAdded = false; } } } } }