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.
mapbox-sdk/Unity/Editor/StyleSearchWindow.cs

213 lines
5.7 KiB

1 year ago
namespace Mapbox.Editor
{
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using Mapbox.Unity;
using Mapbox.Json;
using Mapbox.Unity.Utilities;
using Mapbox.Unity.Map;
using System.Collections;
using UnityEngine.Networking;
public class StyleSearchWindow : EditorWindow
{
SerializedProperty _property;
string _username = "";
string _errorString = "";
List<Style> _styles;
const string searchFieldName = "searchField";
const float width = 320f;
const float height = 300f;
bool _isSearching = false;
Vector2 scrollPos;
void OnEnable()
{
EditorApplication.playModeStateChanged += OnModeChanged;
}
void OnDisable()
{
EditorApplication.playModeStateChanged -= OnModeChanged;
}
public static void Open(SerializedProperty property)
{
StyleSearchWindow window = GetWindow<StyleSearchWindow>(true, "Search for style");
window._property = property;
window._username = property.FindPropertyRelative("UserName").stringValue;
if (!string.IsNullOrEmpty(window._username))
{
window.Search(window._username);
}
Runnable.EnableRunnableInEditor();
Event e = Event.current;
Vector2 mousePos = GUIUtility.GUIToScreenPoint(e.mousePosition);
window.position = new Rect(mousePos.x - width, mousePos.y, width, height);
window.minSize = new Vector2(400, 500);
}
void OnModeChanged(PlayModeStateChange state)
{
Close();
}
void OnGUI()
{
var st = new GUIStyle();
st.padding = new RectOffset(15, 15, 15, 15);
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.HelpBox("User styles are bound to usernames, enter your Mapbox Username to search for your personal styles.", MessageType.Info);
_username = EditorGUILayout.TextField("Mapbox Username: ", _username);
scrollPos = EditorGUILayout.BeginScrollView(scrollPos, st);
if (_username.Length == 0)
{
GUILayout.Label("Enter a user name");
}
else
{
if (!_isSearching)
{
if (GUILayout.Button("Search"))
{
Search(_username);
_property.FindPropertyRelative("UserName").stringValue = _username;
_property.serializedObject.ApplyModifiedProperties();
}
}
if (_styles != null && _styles.Count > 0)
{
GUILayout.Label("Results:");
for (int i = 0; i < _styles.Count; i++)
{
var style = _styles[i];
if (GUILayout.Button(style.Name))
{
_property.FindPropertyRelative("Name").stringValue = style.Name;
_property.FindPropertyRelative("Id").stringValue = style.Id;
_property.FindPropertyRelative("Modified").stringValue = style.Modified;
_property.FindPropertyRelative("UserName").stringValue = style.UserName;
_property.serializedObject.ApplyModifiedProperties();
EditorUtility.SetDirty(_property.serializedObject.targetObject);
Close();
}
}
}
else
{
if (_isSearching)
{
GUI.enabled = false;
if (GUILayout.Button("Searching..."))
{
}
GUI.enabled = true;
}
else if (!string.IsNullOrEmpty(_errorString))
{
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.HelpBox(_errorString, MessageType.Error);
if (GUILayout.Button("Check username/get token with styles:list support"))
{
Application.OpenURL("https://www.mapbox.com/studio/account/tokens/");
}
}
else
GUILayout.Label("No search results");
}
}
EditorGUILayout.EndScrollView();
}
void Search(string searchString)
{
_errorString = "";
if (!string.IsNullOrEmpty(searchString) && !_isSearching)
{
Runnable.Run(ListStyles(MapboxAccess.Instance.Configuration.AccessToken));
_isSearching = true;
}
}
IEnumerator ListStyles(string token)
{
#if UNITY_2017_1_OR_NEWER
UnityWebRequest webRequest = new UnityWebRequest(Utils.Constants.BaseAPI + string.Format("styles/v1/{0}?access_token={1}", _username, token))
{
downloadHandler = new DownloadHandlerBuffer()
};
yield return webRequest.SendWebRequest();
while (!webRequest.isDone)
{
yield return 0;
}
var json = webRequest.downloadHandler.text;
if (!string.IsNullOrEmpty(json))
{
ParseResponse(json);
}
#else
// "https://api.mapbox.com/styles/v1/{username}?access_token=your-access-token"
var www = new WWW(Utils.Constants.BaseAPI + string.Format("styles/v1/{0}?access_token={1}", _username, token));
while (!www.isDone)
{
yield return 0;
}
var json = www.text;
if (!string.IsNullOrEmpty(json))
{
ParseResponse(json);
}
#endif
}
void ParseResponse(string json)
{
_styles = new List<Style>();
if (json.Contains("This API requires a token with styles:list scope"))
{
_errorString = "The Mapbox Access Token you're using at the moment doesn't have \"styles: list\" scope this feature requires.\r\n\r\nYou can create a new token from link below and check \"styles: list\" in the Token Scopes list to enable this feature.";
_isSearching = false;
return;
}
if (json.Contains("Forbidden"))
{
_errorString = "Forbidden!";
_isSearching = false;
return;
}
var settings = new JsonSerializerSettings();
settings.DateParseHandling = DateParseHandling.None;
var styleArray = JsonConvert.DeserializeObject<object[]>(json);
foreach (var style in styleArray)
{
var styleData = JsonConvert.DeserializeObject<Dictionary<string, object>>(style.ToString(), settings);
string id = string.Format("mapbox://styles/{0}/{1}", _username, styleData["id"]);
_styles.Add(new Style() { Name = styleData["name"].ToString(), Id = id, Modified = styleData["modified"].ToString(), UserName = _username });
}
_isSearching = false;
Repaint();
}
}
}