123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- using System;
- using UnityEngine;
-
- namespace UnityEditor.TestTools.TestRunner.GUI.Controls
- {
- /// <summary>
- /// A DropDown editor control accepting <see cref="ISelectionDropDownContentProvider" />-based content providers.
- /// </summary>
- internal class SelectionDropDown : PopupWindowContent
- {
- private static readonly int k_ControlId = typeof(SelectionDropDown).GetHashCode();
- private readonly ISelectionDropDownContentProvider m_ContentProvider;
- private readonly Vector2 m_ContentSize;
- private Vector2 m_ScrollPosition = Vector2.zero;
-
- /// <summary>
- /// Creates a new instance of the <see cref="SelectionDropDown" /> editor control.
- /// </summary>
- /// <param name="contentProvider">The content provider to use.</param>
- public SelectionDropDown(ISelectionDropDownContentProvider contentProvider)
- {
- m_ContentProvider = contentProvider;
- var width = CalculateContentWidth();
- var height = CalculateContentHeight();
- m_ContentSize = new Vector2(width, height);
- }
-
- public override void OnOpen()
- {
- base.OnOpen();
- editorWindow.wantsMouseMove = true;
- editorWindow.wantsMouseEnterLeaveWindow = true;
- }
-
- public override void OnClose()
- {
- GUIUtility.hotControl = 0;
- base.OnClose();
- }
-
- public override Vector2 GetWindowSize()
- {
- return m_ContentSize;
- }
-
- public override void OnGUI(Rect rect)
- {
- var evt = Event.current;
- var contentRect = new Rect(Styles.TopMargin, 0, 1, m_ContentSize.y);
- m_ScrollPosition = UnityEngine.GUI.BeginScrollView(rect, m_ScrollPosition, contentRect);
- {
- var yPos = Styles.TopMargin;
- for (var i = 0; i < m_ContentProvider.Count; ++i)
- {
- var itemRect = new Rect(0, yPos, rect.width, Styles.LineHeight);
- var separatorOffset = 0f;
-
- switch (evt.type)
- {
- case EventType.Repaint:
- var content = new GUIContent(m_ContentProvider.GetName(i));
- var hover = itemRect.Contains(evt.mousePosition);
- var on = m_ContentProvider.IsSelected(i);
- Styles.MenuItem.Draw(itemRect, content, hover, false, on, false);
- separatorOffset = DrawSeparator(i, itemRect);
- break;
-
- case EventType.MouseDown:
- if (evt.button == 0 && itemRect.Contains(evt.mousePosition))
- {
- m_ContentProvider.SelectItem(i);
- if (!m_ContentProvider.IsMultiSelection)
- {
- editorWindow.Close();
- }
-
- evt.Use();
- }
-
- break;
-
- case EventType.MouseEnterWindow:
- GUIUtility.hotControl = k_ControlId;
- evt.Use();
- break;
-
- case EventType.MouseLeaveWindow:
- GUIUtility.hotControl = 0;
- evt.Use();
- break;
-
- case EventType.MouseUp:
- case EventType.MouseMove:
- evt.Use();
- break;
- }
-
- yPos += Styles.LineHeight + separatorOffset;
- }
- }
- UnityEngine.GUI.EndScrollView();
- }
-
- private float CalculateContentWidth()
- {
- var maxItemWidth = 0f;
- for (var i = 0; i < m_ContentProvider.Count; ++i)
- {
- var itemContent = new GUIContent(m_ContentProvider.GetName(i));
- var itemWidth = Styles.MenuItem.CalcSize(itemContent).x;
- maxItemWidth = Mathf.Max(itemWidth, maxItemWidth);
- }
-
- return maxItemWidth;
- }
-
- private float CalculateContentHeight()
- {
- return m_ContentProvider.Count * Styles.LineHeight
- + m_ContentProvider.SeparatorIndices.Length * Styles.SeparatorHeight
- + Styles.TopMargin + Styles.BottomMargin;
- }
-
- private float DrawSeparator(int i, Rect itemRect)
- {
- if (Array.IndexOf(m_ContentProvider.SeparatorIndices, i) < 0)
- {
- return 0f;
- }
-
- var separatorRect = GetSeparatorRect(itemRect);
- DrawRect(separatorRect, Styles.SeparatorColor);
- return Styles.SeparatorHeight;
- }
-
- private static Rect GetSeparatorRect(Rect itemRect)
- {
- var x = itemRect.x + Styles.SeparatorMargin;
- var y = itemRect.y + itemRect.height + Styles.SeparatorHeight * 0.15f;
- var width = itemRect.width - 2 * Styles.SeparatorMargin;
- const float height = 1f;
-
- return new Rect(x, y, width, height);
- }
-
- private static void DrawRect(Rect rect, Color color)
- {
- var originalColor = UnityEngine.GUI.color;
- UnityEngine.GUI.color *= color;
- UnityEngine.GUI.DrawTexture(rect, EditorGUIUtility.whiteTexture);
- UnityEngine.GUI.color = originalColor;
- }
-
- private static class Styles
- {
- public const float LineHeight = EditorGUI.kSingleLineHeight;
- public const float TopMargin = 3f;
- public const float BottomMargin = 1f;
- public const float SeparatorHeight = 4f;
- public const float SeparatorMargin = 3f;
- public static readonly GUIStyle MenuItem = "MenuItem";
- public static readonly Color SeparatorColor = EditorGUIUtility.isProSkin
- ? new Color(0.32f, 0.32f, 0.32f, 1.333f)
- : new Color(0.6f, 0.6f, 0.6f, 1.333f);
- }
- }
- }
|