An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
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.

81 lines
2.8 KiB

// Adapted from the Unity Test Tools project (MIT license)
// https://bitbucket.org/Unity-Technologies/unitytesttools/src/a30d562427e9/Assets/UnityTestTools/
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace Fungus
{
[Serializable]
internal class DropDownControl<T>
{
private readonly GUILayoutOption[] m_ButtonLayoutOptions = { GUILayout.ExpandWidth(true) };
public Func<T, string> convertForButtonLabel = s => s.ToString();
public Func<T, string> convertForGUIContent = s => s.ToString();
public Func<T[], bool> ignoreConvertForGUIContent = t => t.Length <= 40;
public Action<T> printContextMenu = null;
public string tooltip = "";
private object m_SelectedValue;
public void Draw(T selected, T[] options, Action<T> onValueSelected)
{
Draw(null,
selected,
options,
onValueSelected);
}
public void Draw(string label, T selected, T[] options, Action<T> onValueSelected)
{
Draw(label, selected, () => options, onValueSelected);
}
public void Draw(string label, T selected, Func<T[]> loadOptions, Action<T> onValueSelected)
{
if (!string.IsNullOrEmpty(label))
EditorGUILayout.BeginHorizontal();
var guiContent = new GUIContent(label);
var labelSize = EditorStyles.label.CalcSize(guiContent);
if (!string.IsNullOrEmpty(label))
GUILayout.Label(label, EditorStyles.label, GUILayout.Width(labelSize.x));
if (GUILayout.Button(new GUIContent(convertForButtonLabel(selected), tooltip),
EditorStyles.popup, m_ButtonLayoutOptions))
{
if (Event.current.button == 0)
{
PrintMenu(loadOptions());
}
else if (printContextMenu != null && Event.current.button == 1)
printContextMenu(selected);
}
if (m_SelectedValue != null)
{
onValueSelected((T)m_SelectedValue);
m_SelectedValue = null;
}
if (!string.IsNullOrEmpty(label))
EditorGUILayout.EndHorizontal();
}
public void PrintMenu(T[] options)
{
var menu = new GenericMenu();
foreach (var s in options)
{
var localS = s;
menu.AddItem(new GUIContent((ignoreConvertForGUIContent(options) ? localS.ToString() : convertForGUIContent(localS))),
false,
() => { m_SelectedValue = localS; }
);
}
menu.ShowAsContext();
}
}
}