internal static FlattenerNode GetNodeByVisibleIndex(FlattenerNode root, int index) { root.TotalCount(); var flattenerNode = root; while (true) { for (; flattenerNode._left == null || index >= flattenerNode._left._totalCount; flattenerNode = flattenerNode._right) { if (flattenerNode._left != null) { index -= flattenerNode._left._totalCount; } if (flattenerNode.IsVisible) { if (index == 0) { return(flattenerNode); } --index; } } flattenerNode = flattenerNode._left; } }
private int TotalCount() { if (_totalCount > 0) { return(_totalCount); } var num = IsVisible ? 1 : 0; if (_left != null) { num += _left.TotalCount(); } if (_right != null) { num += _right.TotalCount(); } _totalCount = num; return(_totalCount); }