You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
7.8 KiB
232 lines
7.8 KiB
namespace Mapbox.Unity.Map
|
|
{
|
|
using UnityEngine;
|
|
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
using Mapbox.Editor;
|
|
using UnityEditor.IMGUI.Controls;
|
|
using System.Linq;
|
|
|
|
public class PointsOfInterestSubLayerPropertiesDrawer
|
|
{
|
|
string objectId = "";
|
|
static float _lineHeight = EditorGUIUtility.singleLineHeight;
|
|
|
|
FeatureSubLayerTreeView layerTreeView;
|
|
IList<int> selectedLayers = new List<int>();
|
|
|
|
private TreeModel<FeatureTreeElement> treeModel;
|
|
[SerializeField]
|
|
TreeViewState m_TreeViewState;
|
|
|
|
[SerializeField]
|
|
MultiColumnHeaderState m_MultiColumnHeaderState;
|
|
|
|
bool m_Initialized = false;
|
|
public bool isLayerAdded = false;
|
|
|
|
int SelectionIndex
|
|
{
|
|
get
|
|
{
|
|
return EditorPrefs.GetInt(objectId + "LocationPrefabsLayerProperties_selectionIndex");
|
|
}
|
|
set
|
|
{
|
|
EditorPrefs.SetInt(objectId + "LocationPrefabsLayerProperties_selectionIndex", value);
|
|
}
|
|
}
|
|
|
|
public void DrawUI(SerializedProperty property)
|
|
{
|
|
objectId = property.serializedObject.targetObject.GetInstanceID().ToString();
|
|
var prefabItemArray = property.FindPropertyRelative("locationPrefabList");
|
|
var layersRect = EditorGUILayout.GetControlRect(GUILayout.MinHeight(Mathf.Max(prefabItemArray.arraySize + 1, 1) * _lineHeight + MultiColumnHeader.DefaultGUI.defaultHeight),
|
|
GUILayout.MaxHeight((prefabItemArray.arraySize + 1) * _lineHeight + MultiColumnHeader.DefaultGUI.defaultHeight));
|
|
|
|
if (!m_Initialized)
|
|
{
|
|
bool firstInit = m_MultiColumnHeaderState == null;
|
|
var headerState = FeatureSubLayerTreeView.CreateDefaultMultiColumnHeaderState();
|
|
if (MultiColumnHeaderState.CanOverwriteSerializedFields(m_MultiColumnHeaderState, headerState))
|
|
{
|
|
MultiColumnHeaderState.OverwriteSerializedFields(m_MultiColumnHeaderState, headerState);
|
|
}
|
|
m_MultiColumnHeaderState = headerState;
|
|
|
|
var multiColumnHeader = new FeatureSectionMultiColumnHeader(headerState);
|
|
|
|
if (firstInit)
|
|
{
|
|
multiColumnHeader.ResizeToFit();
|
|
}
|
|
|
|
treeModel = new TreeModel<FeatureTreeElement>(GetData(prefabItemArray));
|
|
if (m_TreeViewState == null)
|
|
{
|
|
m_TreeViewState = new TreeViewState();
|
|
}
|
|
|
|
if (layerTreeView == null)
|
|
{
|
|
layerTreeView = new FeatureSubLayerTreeView(m_TreeViewState, multiColumnHeader, treeModel, FeatureSubLayerTreeView.uniqueIdPoI);
|
|
}
|
|
layerTreeView.multiColumnHeader = multiColumnHeader;
|
|
m_Initialized = true;
|
|
}
|
|
|
|
|
|
layerTreeView.Layers = prefabItemArray;
|
|
layerTreeView.Reload();
|
|
layerTreeView.OnGUI(layersRect);
|
|
|
|
if (layerTreeView.hasChanged)
|
|
{
|
|
EditorHelper.CheckForModifiedProperty(property);
|
|
layerTreeView.hasChanged = false;
|
|
}
|
|
|
|
selectedLayers = layerTreeView.GetSelection();
|
|
//if there are selected elements, set the selection index at the first element.
|
|
//if not, use the Selection index to persist the selection at the right index.
|
|
if (selectedLayers.Count > 0)
|
|
{
|
|
//ensure that selectedLayers[0] isn't out of bounds
|
|
if (selectedLayers[0] - FeatureSubLayerTreeView.uniqueIdPoI > prefabItemArray.arraySize - 1)
|
|
{
|
|
selectedLayers[0] = prefabItemArray.arraySize - 1 + FeatureSubLayerTreeView.uniqueIdPoI;
|
|
}
|
|
|
|
SelectionIndex = selectedLayers[0];
|
|
|
|
}
|
|
else
|
|
{
|
|
selectedLayers = new int[1] { SelectionIndex };
|
|
if (SelectionIndex > 0 && (SelectionIndex - FeatureSubLayerTreeView.uniqueIdPoI <= prefabItemArray.arraySize - 1))
|
|
{
|
|
layerTreeView.SetSelection(selectedLayers);
|
|
}
|
|
}
|
|
|
|
|
|
GUILayout.Space(EditorGUIUtility.singleLineHeight);
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
if (GUILayout.Button(new GUIContent("Add Layer"), (GUIStyle)"minibuttonleft"))
|
|
{
|
|
prefabItemArray.arraySize++;
|
|
|
|
var prefabItem = prefabItemArray.GetArrayElementAtIndex(prefabItemArray.arraySize - 1);
|
|
var prefabItemName = prefabItem.FindPropertyRelative("coreOptions.sublayerName");
|
|
|
|
prefabItemName.stringValue = "New Location";
|
|
|
|
// Set defaults here because SerializedProperty copies the previous element.
|
|
prefabItem.FindPropertyRelative("coreOptions.isActive").boolValue = true;
|
|
prefabItem.FindPropertyRelative("coreOptions.snapToTerrain").boolValue = true;
|
|
prefabItem.FindPropertyRelative("presetFeatureType").enumValueIndex = (int)PresetFeatureType.Points;
|
|
var categories = prefabItem.FindPropertyRelative("categories");
|
|
categories.intValue = (int)(LocationPrefabCategories.AnyCategory);//To select any category option
|
|
|
|
var density = prefabItem.FindPropertyRelative("density");
|
|
density.intValue = 15;//To select all locations option
|
|
|
|
//Refreshing the tree
|
|
layerTreeView.Layers = prefabItemArray;
|
|
layerTreeView.AddElementToTree(prefabItem);
|
|
layerTreeView.Reload();
|
|
|
|
selectedLayers = new int[1] { prefabItemArray.arraySize - 1 };
|
|
layerTreeView.SetSelection(selectedLayers);
|
|
|
|
if (EditorHelper.DidModifyProperty(property))
|
|
{
|
|
isLayerAdded = true;
|
|
}
|
|
}
|
|
|
|
if (GUILayout.Button(new GUIContent("Remove Selected"), (GUIStyle)"minibuttonright"))
|
|
{
|
|
foreach (var index in selectedLayers.OrderByDescending(i => i))
|
|
{
|
|
if (layerTreeView != null)
|
|
{
|
|
var poiSubLayer = prefabItemArray.GetArrayElementAtIndex(index - FeatureSubLayerTreeView.uniqueIdPoI);
|
|
|
|
VectorLayerProperties vectorLayerProperties = (VectorLayerProperties)EditorHelper.GetTargetObjectOfProperty(property);
|
|
PrefabItemOptions poiSubLayerProperties = (PrefabItemOptions)EditorHelper.GetTargetObjectOfProperty(poiSubLayer);
|
|
|
|
vectorLayerProperties.OnSubLayerPropertyRemoved(new VectorLayerUpdateArgs { property = poiSubLayerProperties });
|
|
|
|
layerTreeView.RemoveItemFromTree(index);
|
|
prefabItemArray.DeleteArrayElementAtIndex(index - FeatureSubLayerTreeView.uniqueIdPoI);
|
|
layerTreeView.treeModel.SetData(GetData(prefabItemArray));
|
|
}
|
|
}
|
|
selectedLayers = new int[0];
|
|
layerTreeView.SetSelection(selectedLayers);
|
|
}
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
if (selectedLayers.Count == 1 && prefabItemArray.arraySize != 0 && selectedLayers[0] - FeatureSubLayerTreeView.uniqueIdPoI >= 0)
|
|
{
|
|
//ensure that selectedLayers[0] isn't out of bounds
|
|
if (selectedLayers[0] - FeatureSubLayerTreeView.uniqueIdPoI > prefabItemArray.arraySize - 1)
|
|
{
|
|
selectedLayers[0] = prefabItemArray.arraySize - 1 + FeatureSubLayerTreeView.uniqueIdPoI;
|
|
}
|
|
SelectionIndex = selectedLayers[0];
|
|
|
|
var layerProperty = prefabItemArray.GetArrayElementAtIndex(SelectionIndex - FeatureSubLayerTreeView.uniqueIdPoI);
|
|
|
|
layerProperty.isExpanded = true;
|
|
var subLayerCoreOptions = layerProperty.FindPropertyRelative("coreOptions");
|
|
bool isLayerActive = subLayerCoreOptions.FindPropertyRelative("isActive").boolValue;
|
|
if (!isLayerActive)
|
|
{
|
|
GUI.enabled = false;
|
|
}
|
|
DrawLayerLocationPrefabProperties(layerProperty, property);
|
|
if (!isLayerActive)
|
|
{
|
|
GUI.enabled = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GUILayout.Space(15);
|
|
GUILayout.Label("Select a visualizer to see properties");
|
|
}
|
|
}
|
|
|
|
void DrawLayerLocationPrefabProperties(SerializedProperty layerProperty, SerializedProperty property)
|
|
{
|
|
EditorGUILayout.PropertyField(layerProperty);
|
|
}
|
|
|
|
IList<FeatureTreeElement> GetData(SerializedProperty subLayerArray)
|
|
{
|
|
List<FeatureTreeElement> elements = new List<FeatureTreeElement>();
|
|
string name = string.Empty;
|
|
string type = string.Empty;
|
|
int id = 0;
|
|
var root = new FeatureTreeElement("Root", -1, 0);
|
|
elements.Add(root);
|
|
for (int i = 0; i < subLayerArray.arraySize; i++)
|
|
{
|
|
var subLayer = subLayerArray.GetArrayElementAtIndex(i);
|
|
name = subLayer.FindPropertyRelative("coreOptions.sublayerName").stringValue;
|
|
id = i + FeatureSubLayerTreeView.uniqueIdPoI;
|
|
type = PresetFeatureType.Points.ToString();
|
|
FeatureTreeElement element = new FeatureTreeElement(name, 0, id);
|
|
element.Name = name;
|
|
element.name = name;
|
|
element.Type = type;
|
|
elements.Add(element);
|
|
}
|
|
return elements;
|
|
}
|
|
}
|
|
}
|
|
|