using System.Collections.Generic;
using UnityEngine;
public class TreeViewControl
{
///
/// Public properties
///
public int X = 0;
public int Y = 0;
public int Width = 400;
public int Height = 400;
public bool IsExpanded = true;
public bool IsHoverEnabled = true;
public bool IsHoverAnimationEnabled = false;
public bool DisplayOnGame = false;
public bool DisplayOnScene = true;
public bool DisplayInInspector = false;
///
/// The root item
///
public TreeViewItem m_roomItem = null;
public TreeViewItem RootItem
{
get
{
if (null == m_roomItem)
{
m_roomItem = new TreeViewItem(this, null) { Header = "Root item" };
}
return m_roomItem;
}
}
///
/// Accesses the root item header
///
public string Header
{
get
{
return RootItem.Header;
}
set
{
RootItem.Header = value;
}
}
///
/// Accesses the root data context
///
public object DataContext
{
get
{
return RootItem.DataContext;
}
set
{
RootItem.DataContext = value;
}
}
///
/// Accessor to the root items
///
public List Items
{
get
{
return RootItem.Items;
}
set
{
RootItem.Items = value;
}
}
///
/// Skin used by the tree view
///
public GUISkin m_skinHover = null;
public GUISkin m_skinUnselected = null;
public GUISkin m_skinSelected = null;
///
/// Texture skin references
///
public Texture2D m_textureBlank = null;
public Texture2D m_textureGuide = null;
public Texture2D m_textureLastSiblingCollapsed = null;
public Texture2D m_textureLastSiblingExpanded = null;
public Texture2D m_textureLastSiblingNoChild = null;
public Texture2D m_textureMiddleSiblingCollapsed = null;
public Texture2D m_textureMiddleSiblingExpanded = null;
public Texture2D m_textureMiddleSiblingNoChild = null;
public Texture2D m_textureNormalChecked = null;
public Texture2D m_textureNormalUnchecked = null;
public Texture2D m_textureSelectedBackground = null;
///
/// Force to use the button text
///
public bool m_forceButtonText = false;
///
/// Use the default skin
///
public bool m_forceDefaultSkin = false;
///
/// The selected item
///
public TreeViewItem HoverItem = null;
public TreeViewItem SelectedItem = null;
///
/// Show the button texture
///
///
/// A
///
///
/// A
///
bool ShowButtonTexture(Texture2D texture)
{
return GUILayout.Button(texture, GUILayout.MaxWidth(texture.width), GUILayout.MaxHeight(texture.height));
}
///
/// Find the button texture/text by enum
///
///
///
///
///
///
///
public bool Button(TreeViewItem.TextureIcons item)
{
switch (item)
{
case TreeViewItem.TextureIcons.BLANK:
if (null == m_textureGuide ||
m_forceButtonText)
{
GUILayout.Label("", GUILayout.MaxWidth(4));
}
else
{
GUILayout.Label(m_textureBlank, GUILayout.MaxWidth(4), GUILayout.MaxHeight(16));
}
return false;
case TreeViewItem.TextureIcons.GUIDE:
if (null == m_textureGuide ||
m_forceButtonText)
{
GUILayout.Label("|", GUILayout.MaxWidth(16));
}
else
{
GUILayout.Label(m_textureGuide, GUILayout.MaxWidth(16), GUILayout.MaxHeight(16));
}
return false;
case TreeViewItem.TextureIcons.LAST_SIBLING_COLLAPSED:
if (null == m_textureLastSiblingCollapsed ||
m_forceButtonText)
{
return GUILayout.Button("<", GUILayout.MaxWidth(16));
}
else
{
return ShowButtonTexture(m_textureLastSiblingCollapsed);
}
case TreeViewItem.TextureIcons.LAST_SIBLING_EXPANDED:
if (null == m_textureLastSiblingExpanded ||
m_forceButtonText)
{
return GUILayout.Button(">", GUILayout.MaxWidth(16));
}
else
{
return ShowButtonTexture(m_textureLastSiblingExpanded);
}
case TreeViewItem.TextureIcons.LAST_SIBLING_NO_CHILD:
if (null == m_textureLastSiblingNoChild ||
m_forceButtonText)
{
return GUILayout.Button("-", GUILayout.MaxWidth(16));
}
else
{
return GUILayout.Button(m_textureLastSiblingNoChild, GUILayout.MaxWidth(16));
}
case TreeViewItem.TextureIcons.MIDDLE_SIBLING_COLLAPSED:
if (null == m_textureMiddleSiblingCollapsed ||
m_forceButtonText)
{
return GUILayout.Button("<", GUILayout.MaxWidth(16));
}
else
{
return ShowButtonTexture(m_textureMiddleSiblingCollapsed);
}
case TreeViewItem.TextureIcons.MIDDLE_SIBLING_EXPANDED:
if (null == m_textureMiddleSiblingExpanded ||
m_forceButtonText)
{
return GUILayout.Button(">", GUILayout.MaxWidth(16));
}
else
{
return GUILayout.Button(m_textureMiddleSiblingExpanded, GUILayout.MaxWidth(16));
}
case TreeViewItem.TextureIcons.MIDDLE_SIBLING_NO_CHILD:
if (null == m_textureMiddleSiblingNoChild ||
m_forceButtonText)
{
return GUILayout.Button("-", GUILayout.MaxWidth(16));
}
else
{
return ShowButtonTexture(m_textureMiddleSiblingNoChild);
}
case TreeViewItem.TextureIcons.NORMAL_CHECKED:
if (null == m_textureNormalChecked ||
m_forceButtonText)
{
return GUILayout.Button("x", GUILayout.MaxWidth(16));
}
else
{
return GUILayout.Button(m_textureNormalChecked, GUILayout.MaxWidth(16));
}
case TreeViewItem.TextureIcons.NORMAL_UNCHECKED:
if (null == m_textureNormalUnchecked ||
m_forceButtonText)
{
return GUILayout.Button("o", GUILayout.MaxWidth(16));
}
else
{
return ShowButtonTexture(m_textureNormalUnchecked);
}
default:
return false;
}
}
///
/// Handle the unity scrolling vector
///
Vector2 m_scrollView = Vector2.zero;
public enum DisplayTypes
{
NONE, //used by the inspector
USE_SCROLL_VIEW, //used by panels
USE_SCROLL_AREA, //used by gameview, sceneview
}
///
/// Called from OnGUI or EditorWindow.OnGUI
///
public void DisplayTreeView(TreeViewControl.DisplayTypes displayType)
{
if (!m_forceDefaultSkin)
{
GUI.skin = m_skinUnselected;
}
switch (displayType)
{
case TreeViewControl.DisplayTypes.USE_SCROLL_VIEW:
m_scrollView = GUILayout.BeginScrollView(m_scrollView, GUILayout.MaxWidth(Width), GUILayout.MaxHeight(Height));
break;
case TreeViewControl.DisplayTypes.USE_SCROLL_AREA:
GUILayout.BeginArea(new Rect(X, Y, Width, Height));
m_scrollView = GUILayout.BeginScrollView(m_scrollView, GUILayout.MaxWidth(Width), GUILayout.MaxHeight(Height));
break;
}
RootItem.DisplayItem(0, TreeViewItem.SiblingOrder.FIRST_CHILD);
switch (displayType)
{
case TreeViewControl.DisplayTypes.USE_SCROLL_VIEW:
GUILayout.EndScrollView();
break;
case TreeViewControl.DisplayTypes.USE_SCROLL_AREA:
GUILayout.EndScrollView();
GUILayout.EndArea();
break;
}
GUI.skin = null;
}
public bool HasFocus(Vector2 mousePos)
{
Rect rect = new Rect(m_scrollView.x, m_scrollView.y, Width, Height);
return rect.Contains(mousePos);
}
void Start()
{
SelectedItem = null;
}
void OnGUI()
{
if (!DisplayOnGame)
{
return;
}
DisplayTreeView(TreeViewControl.DisplayTypes.USE_SCROLL_AREA);
}
}