ImprovedSelectionList

From Unify Community Wiki
Revision as of 18:20, 10 April 2011 by Danielbrauer (Talk | contribs)

Jump to: navigation, search

By Daniel Brauer, inspired by AngryAnt

Description

Visualises an array of strings or GUIContents and returns the index selected by the user. A delegate can be provided to capture double-clicking list items. Important: this script depends on your current GUISkin having a custom style called "List Item" with an appropriate OnNormal look. If you don't have this in your skin, you will have to use the custom style versions of the function.

Component code

<csharp>using UnityEngine;

public class GUILayoutx {

public delegate void DoubleClickCallback(int index);

public static int SelectionList(int selected, GUIContent[] list) { return SelectionList(selected, list, "List Item", null); }

public static int SelectionList(int selected, GUIContent[] list, GUIStyle elementStyle) { return SelectionList(selected, list, elementStyle, null); }

public static int SelectionList(int selected, GUIContent[] list, DoubleClickCallback callback) { return SelectionList(selected, list, "List Item", callback); }

public static int SelectionList(int selected, GUIContent[] list, GUIStyle elementStyle, DoubleClickCallback callback) { for (int i = 0; i < list.Length; ++i) { Rect elementRect = GUILayoutUtility.GetRect(list[i], elementStyle); bool hover = elementRect.Contains(Event.current.mousePosition); if (hover && Event.current.type == EventType.MouseDown) { selected = i; Event.current.Use(); } else if (hover && callback != null && Event.current.type == EventType.MouseUp && Event.current.clickCount == 2) { callback(i); Event.current.Use(); } else if (Event.current.type == EventType.repaint) { elementStyle.Draw(elementRect, list[i], hover, false, i == selected, false); } } return selected; }

public static int SelectionList(int selected, string[] list) { return SelectionList(selected, list, "List Item", null); }

public static int SelectionList(int selected, string[] list, GUIStyle elementStyle) { return SelectionList(selected, list, elementStyle, null); }

public static int SelectionList(int selected, string[] list, DoubleClickCallback callback) { return SelectionList(selected, list, "List Item", callback); }

public static int SelectionList(int selected, string[] list, GUIStyle elementStyle, DoubleClickCallback callback) { for (int i = 0; i < list.Length; ++i) { Rect elementRect = GUILayoutUtility.GetRect(new GUIContent(list[i]), elementStyle); bool hover = elementRect.Contains(Event.current.mousePosition); if (hover && Event.current.type == EventType.MouseDown) { selected = i; Event.current.Use(); } else if (hover && callback != null && Event.current.type == EventType.MouseUp && Event.current.clickCount == 2) { callback(i); Event.current.Use(); } else if (Event.current.type == EventType.repaint) { elementStyle.Draw(elementRect, list[i], hover, false, i == selected, false); } } return selected; }

}</csharp>

Usage

Providing a double-click delegate:

<csharp>using UnityEngine; using System.Collections;

public class SelectionListTest : MonoBehaviour {

int currentSelection; public GUISkin skinWithListStyle; string[] myList = new string[] {"First", "Second", "Third"};

protected void OnGUI() { GUI.skin = skinWithListStyle; currentSelection = GUILayoutx.SelectionList(currentSelection, myList, DoubleClickItem); }

protected void DoubleClickItem(int index) { Debug.Log("Clicked " + myList[index]); } } </csharp>

Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox