コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】TreeView で検索した時に要素の表示順が変わってしまう場合

概要

protected override bool DoesItemMatchSearch
(
    TreeViewItem treeViewItem,
    string search
)
{
    // ...
}

TreeView の DoesItemMatchSearch をオーバーライドして検索処理を実装した際に、
MultiColumnHeader の sortedColumnIndex が無視されてしまう現象に遭遇した

https://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/GUI/TreeView/ToggleTreeView.cs#L73

TreeView のソースコードを見てみたら

rows.Sort((x, y) => EditorUtility.NaturalCompare(x.displayName, y.displayName));

TreeView で検索された時は MultiColumnHeader の sortedColumnIndex を無視して
TreeViewItem の displayName で勝手に並べ替えを行う実装になっていた

internal sealed class MyTreeViewItem : TreeViewItem
{
    private readonly MultiColumnHeader m_header;

    public override string displayName
    {
        get
        {
            var sortedColumnIndex = m_header.sortedColumnIndex;
            // ...
        }
    }

TreeViewItem を継承したクラスで displayName をオーバーライドして
MultiColumnHeader の sortedColumnIndex に応じて
displayName で返す文字列を変えるようにしたら
TreeView で検索した時に要素の表示順が変わらないようになった

ただし、この方法だと昇順降順には対応していない