うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】検索窓付きの TreeView サンプル

f:id:hacchi_man:20200728211329p:plain:w350

using System.Collections.Generic;
using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;

public class SearchTreeViewSample : EditorWindow
{
    [MenuItem("Tools/SampleTreeView")]
    private static void ShowWindow()
    {
        GetWindow<SearchTreeViewSample>();
    }

    private SearchField _searchField;
    private SampleTreeView _treeView;
    private TreeViewState _treeViewState;

    /// <summary>
    /// Initialize
    /// </summary>
    private void Init()
    {
        if (_treeViewState == null)
        {
            _treeViewState = new TreeViewState();
        }

        if (_treeView == null)
        {
            _treeView = new SampleTreeView(_treeViewState);
        }

        if (_searchField == null)
        {
            _searchField = new SearchField();
            _searchField.downOrUpArrowKeyPressed += _treeView.SetFocusAndEnsureSelectedItem;
        }
    }

    private void OnGUI()
    {
        Init();

        using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar))
        {
            GUILayout.Space(10);

            _treeView.searchString = _searchField.OnToolbarGUI(_treeView.searchString);
        }

        var rect = GUILayoutUtility.GetRect(0, float.MaxValue, 0, float.MaxValue);
        _treeView.OnGUI(rect);
    }

    private class SampleTreeView : TreeView
    {
        private TreeViewItem _root;

        public SampleTreeView(TreeViewState state) : base(state)
        {
            showAlternatingRowBackgrounds = true;
            showBorder = true;
            _root = new TreeViewItem(0, -1, "root");
            _root.children = new List<TreeViewItem>(100);
            for (int i = 0; i < 100; i++)
            {
                _root.AddChild(new TreeViewItem(i + 1, 0, GUID.Generate().ToString()));
            }

            SetupDepthsFromParentsAndChildren(_root);
            Reload();
        }

        protected override TreeViewItem BuildRoot()
        {
            return _root;
        }
    }
}