69 lines
2.6 KiB
C#
69 lines
2.6 KiB
C#
/*
|
|
Yarn Spinner is licensed to you under the terms found in the file LICENSE.md.
|
|
*/
|
|
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using Yarn.Unity.Attributes;
|
|
|
|
namespace Yarn.Unity.Editor
|
|
{
|
|
|
|
[CustomPropertyDrawer(typeof(LanguageAttribute))]
|
|
public class LanguageAttributeEditor : PropertyDrawer
|
|
{
|
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
|
{
|
|
using (var scope = new EditorGUI.PropertyScope(position, label, property))
|
|
{
|
|
// If this property is not a string, show an error label. (We
|
|
// can't call EditorGUI.PropertyField, because that would cause
|
|
// an infinite recursion - Unity would invoke this property
|
|
// drawer again.)
|
|
if (property.propertyType != SerializedPropertyType.String)
|
|
{
|
|
EditorGUI.HelpBox(position, $"{property.name} is not a string.", MessageType.Error);
|
|
return;
|
|
}
|
|
|
|
// Display this property as a dropdown that lets you select a
|
|
// language.
|
|
var allCultures = Cultures.GetCultures().ToList();
|
|
var indices = Enumerable.Range(0, allCultures.Count());
|
|
|
|
var culturesToIndicies = allCultures.Zip(indices, (culture, index) => new { culture, index }).ToDictionary(pair => pair.culture.Name, pair => pair.index);
|
|
|
|
var value = property.stringValue;
|
|
|
|
int currentCultureIndex;
|
|
|
|
if (culturesToIndicies.ContainsKey(value))
|
|
{
|
|
currentCultureIndex = culturesToIndicies[value];
|
|
}
|
|
else
|
|
{
|
|
// The property doesn't contain a valid culture name. Show
|
|
// an 'empty' value, which will be replaced when the user
|
|
// selects a valid value from the dropdown.
|
|
currentCultureIndex = -1;
|
|
}
|
|
|
|
var allCultureDisplayNames = allCultures.Select(c => (c.DisplayName + $":({c.Name})")).Select(n => new GUIContent(n)).ToArray();
|
|
|
|
using (var changeCheck = new EditorGUI.ChangeCheckScope())
|
|
{
|
|
var selectedIndex = EditorGUI.Popup(position, label, currentCultureIndex, allCultureDisplayNames);
|
|
if (changeCheck.changed)
|
|
{
|
|
property.stringValue = allCultures[selectedIndex].Name;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|