using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
namespace TMPro.EditorUtilities
|
|
{
|
|
|
|
[CustomPropertyDrawer(typeof(TextAlignmentOptions))]
|
|
public class TextAlignmentDrawer : PropertyDrawer
|
|
{
|
|
const int k_AlignmentButtonWidth = 24;
|
|
const int k_AlignmentButtonHeight = 20;
|
|
const int k_WideViewWidth = 504;
|
|
const int k_ControlsSpacing = 6;
|
|
const int k_GroupWidth = k_AlignmentButtonWidth * 6;
|
|
static readonly int k_TextAlignmentHash = "DoTextAligmentControl".GetHashCode();
|
|
|
|
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
|
{
|
|
return EditorGUIUtility.currentViewWidth > k_WideViewWidth ? k_AlignmentButtonHeight : k_AlignmentButtonHeight * 2 + 3;
|
|
}
|
|
|
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
|
{
|
|
var id = GUIUtility.GetControlID(k_TextAlignmentHash, FocusType.Keyboard, position);
|
|
|
|
EditorGUI.BeginProperty(position, label, property);
|
|
{
|
|
var controlArea = EditorGUI.PrefixLabel(position, id, label);
|
|
|
|
var horizontalAligment = new Rect(controlArea.x, controlArea.y, k_GroupWidth, k_AlignmentButtonHeight);
|
|
var verticalAligment = new Rect(!(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.x : horizontalAligment.xMax + k_ControlsSpacing, !(EditorGUIUtility.currentViewWidth > k_WideViewWidth) ? controlArea.y + k_AlignmentButtonHeight + 3 : controlArea.y, k_GroupWidth, k_AlignmentButtonHeight);
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
|
var selectedHorizontal = DoHorizontalAligmentControl(horizontalAligment, property);
|
|
var selectedVertical = DoVerticalAligmentControl(verticalAligment, property);
|
|
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
var value = (0x1 << selectedHorizontal) | (0x100 << selectedVertical);
|
|
property.intValue = value;
|
|
}
|
|
}
|
|
EditorGUI.EndProperty();
|
|
}
|
|
|
|
static int DoHorizontalAligmentControl(Rect position, SerializedProperty alignment)
|
|
{
|
|
var selected = TMP_EditorUtility.GetHorizontalAlignmentGridValue(alignment.intValue);
|
|
|
|
var values = new bool[6];
|
|
|
|
values[selected] = true;
|
|
|
|
if (alignment.hasMultipleDifferentValues)
|
|
{
|
|
foreach (var obj in alignment.serializedObject.targetObjects)
|
|
{
|
|
var text = obj as TMP_Text;
|
|
if (text != null)
|
|
{
|
|
values[TMP_EditorUtility.GetHorizontalAlignmentGridValue((int)text.alignment)] = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
position.width = k_AlignmentButtonWidth;
|
|
|
|
for (var i = 0; i < values.Length; i++)
|
|
{
|
|
var oldValue = values[i];
|
|
var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentA[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid));
|
|
if (newValue != oldValue)
|
|
{
|
|
selected = i;
|
|
}
|
|
position.x += position.width;
|
|
}
|
|
|
|
return selected;
|
|
}
|
|
|
|
static int DoVerticalAligmentControl(Rect position, SerializedProperty alignment)
|
|
{
|
|
var selected = TMP_EditorUtility.GetVerticalAlignmentGridValue(alignment.intValue);
|
|
|
|
var values = new bool[6];
|
|
|
|
values[selected] = true;
|
|
|
|
if (alignment.hasMultipleDifferentValues)
|
|
{
|
|
foreach (var obj in alignment.serializedObject.targetObjects)
|
|
{
|
|
var text = obj as TMP_Text;
|
|
if (text != null)
|
|
{
|
|
values[TMP_EditorUtility.GetVerticalAlignmentGridValue((int)text.alignment)] = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
position.width = k_AlignmentButtonWidth;
|
|
|
|
for (var i = 0; i < values.Length; i++)
|
|
{
|
|
var oldValue = values[i];
|
|
var newValue = TMP_EditorUtility.EditorToggle(position, oldValue, TMP_UIStyleManager.alignContentB[i], i == 0 ? TMP_UIStyleManager.alignmentButtonLeft : (i == 5 ? TMP_UIStyleManager.alignmentButtonRight : TMP_UIStyleManager.alignmentButtonMid));
|
|
if (newValue != oldValue)
|
|
{
|
|
selected = i;
|
|
}
|
|
position.x += position.width;
|
|
}
|
|
|
|
return selected;
|
|
}
|
|
}
|
|
}
|