using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEditor.IMGUI.Controls; using UnityEngine; using UnityEngine.Profiling; namespace VRWorldToolkit.Editor { public class TextureTreeViewItem : TreeViewItem { public Texture Texture { get; } public TextureImporter Importer { get; } public TextureImporterType TextureType { get; } public TextureImporterShape TextureShape { get; } public TextureImporterFormat Format { get; } public int MaxTextureSize { get; } public bool CrunchedCompression { get; } public int CompressionQuality { get; } public TextureCompressionMode Compression { get; } public string AssetPath { get; } public string FileName { get; } public long StorageSize { get; } public int TextureWidth { get; } public int TextureHeight { get; } private readonly Dictionary _platformSettings = new(); public TextureTreeViewItem(int id, Texture texture, TextureImporter importer) : base(id, 0) { Texture = texture; Importer = importer; AssetPath = importer.assetPath; FileName = Path.GetFileName(AssetPath); StorageSize = EditorTextureUtil.GetStorageMemorySize(texture); Format = importer.GetDefaultPlatformTextureSettings().format; TextureWidth = texture.width; TextureHeight = texture.height; TextureType = importer.textureType; TextureShape = importer.textureShape; MaxTextureSize = importer.maxTextureSize; CrunchedCompression = importer.crunchedCompression; CompressionQuality = importer.compressionQuality; Compression = importer.textureCompression.ToTextureCompressionMode(); displayName = FileName; CachePlatformSettings("Standalone"); CachePlatformSettings("Android"); CachePlatformSettings("iPhone"); void CachePlatformSettings(string platform) { _platformSettings[platform] = Importer.GetPlatformTextureSettings(platform); } } public TextureImporterPlatformSettings GetPlatformSettings(string platform) { return _platformSettings.TryGetValue(platform, out var settings) ? settings : null; } public int GetPlatformMaxSize(string platform) { return GetPlatformSettings(platform).maxTextureSize; } public TextureImporterFormat GetPlatformFormat(string platform) { return GetPlatformSettings(platform).format; } public bool IsPlatformOverridden(string platform) { return GetPlatformSettings(platform).overridden; } } public class TextureTreeView : TreeView { public enum TreeColumns { Icon, StorageSize, Name, TextureSize, TextureType, TextureShape, MaxSize, Format, Compression, Crunched, CrunchQuality, MaxSizeWindows, FormatWindows, MaxSizeAndroid, FormatAndroid, MaxSizeiOS, FormatiOS, } private Dictionary _textures; private ImporterSettingsManager _settingsManager; private List _rows = new(); private TreeColumns _sortedColumn = TreeColumns.Name; private bool _sortAscending = true; private readonly MultiColumnHeader.HeaderCallback _visibleColumnsChangedHandler; public TextureTreeView(TreeViewState state, MultiColumnHeader multiColumnHeader, Dictionary textures, ImporterSettingsManager settingsManager) : base(state, multiColumnHeader) { _textures = textures; _settingsManager = settingsManager; rowHeight = 20; showAlternatingRowBackgrounds = true; showBorder = true; _visibleColumnsChangedHandler = _ => Reload(); multiColumnHeader.sortingChanged += OnSortingChanged; multiColumnHeader.visibleColumnsChanged += _visibleColumnsChangedHandler; Reload(); } public void Cleanup() { multiColumnHeader.sortingChanged -= OnSortingChanged; multiColumnHeader.visibleColumnsChanged -= _visibleColumnsChangedHandler; } public void SetTextures(Dictionary textures) { _textures = textures; Reload(); } public void SetSettingsManager(ImporterSettingsManager settingsManager) { _settingsManager = settingsManager; Reload(); } public void RefreshItems() { Reload(); } protected override TreeViewItem BuildRoot() { var root = new TreeViewItem { id = 0, depth = -1, displayName = "Root" }; int id = 1; foreach (var texture in _textures) { if (texture.Value != null) { var item = new TextureTreeViewItem(id++, texture.Key, texture.Value); root.AddChild(item); } } if (!root.hasChildren) { root.children = new List(); } return root; } protected override IList BuildRows(TreeViewItem root) { _rows.Clear(); if (!root.hasChildren) return _rows; var filteredItems = root.children .Cast() .Where(item => _settingsManager.MatchesFilters(item.Importer)); if (hasSearch) { filteredItems = filteredItems .Where(item => DoesItemMatchSearch(item, searchString)); } _rows.AddRange(filteredItems); _rows.Sort((a, b) => { if (a is not TextureTreeViewItem itemA || b is not TextureTreeViewItem itemB) return 0; int result = _sortedColumn switch { TreeColumns.StorageSize => itemA.StorageSize.CompareTo(itemB.StorageSize), TreeColumns.Name => string.Compare(itemA.FileName, itemB.FileName, StringComparison.OrdinalIgnoreCase), TreeColumns.TextureSize => (itemA.TextureWidth * itemA.TextureHeight).CompareTo(itemB.TextureWidth * itemB.TextureHeight), TreeColumns.TextureType => itemA.TextureType.CompareTo(itemB.TextureType), TreeColumns.TextureShape => itemA.TextureShape.CompareTo(itemB.TextureShape), TreeColumns.MaxSize => itemA.MaxTextureSize.CompareTo(itemB.MaxTextureSize), TreeColumns.Compression => itemA.Compression.CompareTo(itemB.Compression), TreeColumns.Crunched => itemA.CrunchedCompression.CompareTo(itemB.CrunchedCompression), TreeColumns.CrunchQuality => itemA.CompressionQuality.CompareTo(itemB.CompressionQuality), TreeColumns.MaxSizeWindows => itemA.GetPlatformMaxSize("Standalone").CompareTo(itemB.GetPlatformMaxSize("Standalone")), TreeColumns.FormatWindows => itemA.GetPlatformFormat("Standalone").CompareTo(itemB.GetPlatformFormat("Standalone")), TreeColumns.MaxSizeAndroid => itemA.GetPlatformMaxSize("Android").CompareTo(itemB.GetPlatformMaxSize("Android")), TreeColumns.FormatAndroid => itemA.GetPlatformFormat("Android").CompareTo(itemB.GetPlatformFormat("Android")), TreeColumns.MaxSizeiOS => itemA.GetPlatformMaxSize("iPhone").CompareTo(itemB.GetPlatformMaxSize("iPhone")), TreeColumns.FormatiOS => itemA.GetPlatformFormat("iPhone").CompareTo(itemB.GetPlatformFormat("iPhone")), _ => 0 }; return _sortAscending ? result : -result; }); return _rows; } protected override void RowGUI(RowGUIArgs args) { var item = args.item as TextureTreeViewItem; if (item == null) return; for (int i = 0; i < args.GetNumVisibleColumns(); i++) { var rect = args.GetCellRect(i); var columnIndex = args.GetColumn(i); CenterRectUsingSingleLineHeight(ref rect); DrawCell(rect, item, (TreeColumns)columnIndex, args.selected); } } protected override bool DoesItemMatchSearch(TreeViewItem item, string search) { if (item is not TextureTreeViewItem textureItem) return false; return textureItem.FileName.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0 || textureItem.AssetPath.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0; } protected override void SingleClickedItem(int id) { base.SingleClickedItem(id); if (FindItem(id, rootItem) is TextureTreeViewItem item) { EditorGUIUtility.PingObject(item.Texture); } } protected override void DoubleClickedItem(int id) { base.DoubleClickedItem(id); if (FindItem(id, rootItem) is TextureTreeViewItem item) { Selection.activeObject = item.Texture; EditorApplication.ExecuteMenuItem("Window/General/Inspector"); } } protected override void ContextClickedItem(int id) { base.ContextClickedItem(id); if (FindItem(id, rootItem) is not TextureTreeViewItem item) return; var menu = new GenericMenu(); menu.AddItem(new GUIContent("Copy Name"), false, ReplaceClipboard, Path.GetFileName(item.AssetPath)); menu.AddItem(new GUIContent("Copy Path"), false, ReplaceClipboard, item.AssetPath); menu.AddSeparator(""); menu.AddItem(new GUIContent("Reveal in Explorer"), false, () => EditorUtility.RevealInFinder(item.AssetPath)); menu.AddItem(new GUIContent("Select in Assets"), false, SelectAssetsInProjectWindow); menu.ShowAsContext(); void ReplaceClipboard(object input) { EditorGUIUtility.systemCopyBuffer = (string)input; } } /// /// Selects assets in the Project window based on the currently selected BuildReportItems. /// This is useful for quickly selecting a batch of assets to modify their import settings or other properties in bulk. /// Original PR for BuildReportTreeView by @akira0245, see here: https://github.com/oneVR/VRWorldToolkit/pull/26 /// private void SelectAssetsInProjectWindow() { // Retrieve the IDs of currently selected items var selectedItems = GetSelection(); var assetPaths = new List(); // Iterate over each selected item and collect their asset paths foreach (var itemId in selectedItems) { var item = FindItem(itemId, rootItem) as TextureTreeViewItem; if (item != null && !string.IsNullOrEmpty(item.AssetPath)) { assetPaths.Add(item.AssetPath); } } // Load and select the assets in the Project window var assets = assetPaths.Select(AssetDatabase.LoadAssetAtPath).ToArray(); Selection.objects = assets; EditorApplication.ExecuteMenuItem("Window/General/Inspector"); } private void DrawCell(Rect rect, TextureTreeViewItem item, TreeColumns column, bool selected) { var labelStyle = selected ? Styles.TreeViewLabelSelected : Styles.TreeViewLabel; var labelStyleRight = selected ? Styles.TreeViewLabelSelectedRight : Styles.TreeViewLabelRight; switch (column) { case TreeColumns.Icon: var iconRect = new Rect(rect.x + 4, rect.y + 1, 16, 16); var preview = AssetPreview.GetMiniThumbnail(item.Texture); if (preview != null) { GUI.DrawTexture(iconRect, preview, ScaleMode.ScaleToFit); } break; case TreeColumns.Name: GUI.Label(rect, item.FileName, labelStyle); break; case TreeColumns.TextureSize: GUI.Label(rect, $"{item.TextureWidth}x{item.TextureHeight}", labelStyleRight); break; case TreeColumns.TextureType: GUI.Label(rect, item.TextureType.GetDisplayName(), labelStyle); break; case TreeColumns.TextureShape: GUI.Label(rect, item.TextureShape.GetDisplayName(), labelStyle); break; case TreeColumns.MaxSize: DrawMaxSizeCell(rect, item, labelStyleRight); break; case TreeColumns.Format: // Using ToString here returns CompressedAutomatic instead of Automatic so manually overriding it here if (item.Format == TextureImporterFormat.Automatic) { GUI.Label(rect, "Automatic", labelStyle); } else { GUI.Label(rect, item.Format.ToString(), labelStyle); } break; case TreeColumns.Compression: DrawCompression(rect, item, labelStyle); break; case TreeColumns.Crunched: DrawCrunchedCell(rect, item); break; case TreeColumns.CrunchQuality: DrawCrunchQualityCell(rect, item, labelStyleRight); break; case TreeColumns.StorageSize: GUI.Label(rect, EditorUtility.FormatBytes(item.StorageSize), labelStyleRight); break; case TreeColumns.MaxSizeWindows: DrawPlatformMaxSize(rect, item, "Standalone", labelStyleRight); break; case TreeColumns.FormatWindows: DrawPlatformFormat(rect, item, "Standalone", labelStyle); break; case TreeColumns.MaxSizeAndroid: DrawPlatformMaxSize(rect, item, "Android", labelStyleRight); break; case TreeColumns.FormatAndroid: DrawPlatformFormat(rect, item, "Android", labelStyle); break; case TreeColumns.MaxSizeiOS: DrawPlatformMaxSize(rect, item, "iPhone", labelStyleRight); break; case TreeColumns.FormatiOS: DrawPlatformFormat(rect, item, "iPhone", labelStyle); break; } } private void DrawCompression(Rect rect, TextureTreeViewItem item, GUIStyle style) { var currentValue = item.Compression; string currentText = ObjectNames.NicifyVariableName(currentValue.ToString()); if (_settingsManager.DefaultSettings.ChangeCompression) { if (_settingsManager.DefaultSettings.IgnoreUncompressed && currentValue == TextureCompressionMode.None) { GUI.Label(rect, currentText, style); return; } var newValue = _settingsManager.DefaultSettings.Compression; if (currentValue != newValue) { string tooltip = $"Current: {currentText}"; string text = ObjectNames.NicifyVariableName(newValue.ToString()); if (MemorySize(newValue) < MemorySize(currentValue)) { GUI.Label(rect, new GUIContent($"↓ {text}", tooltip), Styles.TreeViewLabelPositive); } else { GUI.Label(rect, new GUIContent($"↑ {text}", tooltip), Styles.TreeViewLabelNegative); } return; int MemorySize(TextureCompressionMode mode) => mode switch { TextureCompressionMode.LowQuality => 1, TextureCompressionMode.NormalQuality => 2, TextureCompressionMode.HighQuality => 3, TextureCompressionMode.None => 4, _ => 2 }; } } GUI.Label(rect, currentText, style); } private void DrawCrunchedCell(Rect rect, TextureTreeViewItem item) { var hasCompression = _settingsManager.DefaultSettings.ChangeCompression ? _settingsManager.DefaultSettings.Compression : item.Compression; if (hasCompression == TextureCompressionMode.None || _settingsManager.DefaultSettings.IgnoreUncompressed && item.Compression == TextureCompressionMode.None) { GUI.Label(rect, "―", Styles.TreeViewLabelCenter); return; } bool currentValue = item.CrunchedCompression; if (_settingsManager.DefaultSettings.ChangeCrunch) { bool skip = _settingsManager.DefaultSettings.SkipCrunchWhen switch { DontOverrideWhen.AlreadyDisabled => !currentValue, DontOverrideWhen.AlreadyEnabled => currentValue, _ => false }; if (!skip) { bool newValue = _settingsManager.DefaultSettings.UseCrunch; if (currentValue != newValue) { string tooltip = $"Current: {(currentValue ? "Yes" : "No")}"; string text = newValue ? "✓" : "―"; var style = newValue ? Styles.TreeViewLabelPositiveCenter : Styles.TreeViewLabelNegativeCenter; GUI.Label(rect, new GUIContent(text, tooltip), style); return; } } } GUI.Label(rect, currentValue ? "✓" : "―", Styles.TreeViewLabelCenter); } private void DrawCrunchQualityCell(Rect rect, TextureTreeViewItem item, GUIStyle style) { var hasCompression = _settingsManager.DefaultSettings.ChangeCompression ? _settingsManager.DefaultSettings.Compression : item.Compression; if (hasCompression == TextureCompressionMode.None || (_settingsManager.DefaultSettings.IgnoreUncompressed && item.Compression == TextureCompressionMode.None)) { GUI.Label(rect, "―", style); return; } bool currentCrunch = item.CrunchedCompression; int currentQuality = item.CompressionQuality; bool effectiveCrunch = currentCrunch; if (_settingsManager.DefaultSettings.ChangeCrunch) { bool skip = _settingsManager.DefaultSettings.SkipCrunchWhen switch { DontOverrideWhen.AlreadyDisabled => !currentCrunch, DontOverrideWhen.AlreadyEnabled => currentCrunch, _ => false }; if (!skip) { effectiveCrunch = _settingsManager.DefaultSettings.UseCrunch; } } if (!effectiveCrunch) { GUI.Label(rect, "―", style); return; } int displayQuality = currentQuality; bool changes = false; if (_settingsManager.DefaultSettings.ChangeCrunch) { bool skip = _settingsManager.DefaultSettings.SkipCrunchWhen switch { DontOverrideWhen.AlreadyDisabled => !currentCrunch, DontOverrideWhen.AlreadyEnabled => currentCrunch, _ => false }; if (!skip && _settingsManager.DefaultSettings.UseCrunch) { int newQuality = _settingsManager.DefaultSettings.CrunchQuality; changes = _settingsManager.DefaultSettings.CrunchQualityCondition switch { OverrideCondition.Always => currentQuality != newQuality, OverrideCondition.Smaller => currentQuality < newQuality, OverrideCondition.Bigger => currentQuality > newQuality, _ => false }; if (changes) { displayQuality = newQuality; } } } if (changes) { string tooltip = $"Current: {currentQuality}"; if (displayQuality > currentQuality) { GUI.Label(rect, new GUIContent($"↑ {displayQuality}", tooltip), Styles.TreeViewLabelNegativeRight); } else { GUI.Label(rect, new GUIContent($"↓ {displayQuality}", tooltip), Styles.TreeViewLabelPositiveRight); } return; } GUI.Label(rect, currentQuality.ToString(), style); } private void DrawMaxSizeCell(Rect rect, TextureTreeViewItem item, GUIStyle style) { int currentSize = item.MaxTextureSize; string text = currentSize.ToString(); if (_settingsManager.DefaultSettings.ChangeMaxSize) { int newSize = _settingsManager.MaxTextureSize; bool changes = _settingsManager.DefaultSettings.MaxSizeCondition switch { OverrideCondition.Always => currentSize != newSize, OverrideCondition.Smaller => currentSize < newSize, OverrideCondition.Bigger => currentSize > newSize, _ => false }; if (changes) { var tooltip = $"Current: {currentSize}"; if (newSize < currentSize) { text = $"↓ {newSize}"; GUI.Label(rect, new GUIContent(text, tooltip), Styles.TreeViewLabelPositiveRight); } else { text = $"↑ {newSize}"; GUI.Label(rect, new GUIContent(text, tooltip), Styles.TreeViewLabelNegativeRight); } return; } } GUI.Label(rect, text, style); } private void DrawPlatformMaxSize(Rect rect, TextureTreeViewItem item, string platform, GUIStyle style) { int currentSize = item.GetPlatformMaxSize(platform); var platformSettings = _settingsManager.GetPlatformSettings(platform); bool isOverridden = item.IsPlatformOverridden(platform) || platformSettings.Override; if (platformSettings.DisableOverrides) { GUI.Label(rect, $"({item.Importer.maxTextureSize})", Styles.TreeViewLabelRightDimmed); return; } if (platformSettings.Override) { int newSize = platformSettings.MaxTextureSize; bool changes = platformSettings.MaxSizeCondition switch { OverrideCondition.Always => currentSize != newSize, OverrideCondition.Smaller => currentSize < newSize, OverrideCondition.Bigger => currentSize > newSize, _ => false }; if (changes) { string tooltip = $"Current: {currentSize}"; if (newSize < currentSize) { GUI.Label(rect, new GUIContent($"↓ {newSize}", tooltip), Styles.TreeViewLabelPositiveRight); } else { GUI.Label(rect, new GUIContent($"↑ {newSize}", tooltip), Styles.TreeViewLabelNegativeRight); } return; } } string displayText = isOverridden ? currentSize.ToString() : $"({item.Importer.maxTextureSize})"; GUI.Label(rect, displayText, isOverridden ? style : Styles.TreeViewLabelRightDimmed); } private void DrawPlatformFormat(Rect rect, TextureTreeViewItem item, string platform, GUIStyle style) { var platformSettings = _settingsManager.GetPlatformSettings(platform); if (!platformSettings.DisableOverrides && platformSettings.Override && (TextureImporterFormat)platformSettings.Format != item.GetPlatformFormat(platform)) { GUI.Label(rect, ((TextureImporterFormat)platformSettings.Format).ToString(), Styles.TreeViewLabelPositive); return; } if (!item.IsPlatformOverridden(platform) && !platformSettings.Override || platformSettings.DisableOverrides) { GUI.Label(rect, "(Automatic)", Styles.TreeViewLabelDimmed); return; } GUI.Label(rect, item.GetPlatformFormat(platform).ToString(), style); } private void OnSortingChanged(MultiColumnHeader header) { if (header.sortedColumnIndex < 0) return; _sortedColumn = (TreeColumns)header.sortedColumnIndex; _sortAscending = header.IsSortedAscending(header.sortedColumnIndex); Reload(); } private const int WidthSize = 60; private const int WidthFormat = 85; private const int MaxWidthFormat = 250; private const int MinWidthFormat = 60; public static MultiColumnHeaderState CreateDefaultMultiColumnHeaderState(float treeViewWidth) { var columns = new[] { new MultiColumnHeaderState.Column { headerContent = EditorGUIUtility.IconContent("Texture Icon"), contextMenuText = "Preview", headerTextAlignment = TextAlignment.Center, sortedAscending = true, sortingArrowAlignment = TextAlignment.Center, width = 25, minWidth = 25, maxWidth = 25, autoResize = false, allowToggleVisibility = false }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Storage Size", "Storage size on disk"), headerTextAlignment = TextAlignment.Right, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = 80, minWidth = 80, maxWidth = 80, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Name"), headerTextAlignment = TextAlignment.Left, sortedAscending = true, sortingArrowAlignment = TextAlignment.Center, width = 150, minWidth = 80, autoResize = true, allowToggleVisibility = false }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Original Size", "Original texture dimensions"), headerTextAlignment = TextAlignment.Right, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = 80, minWidth = 60, maxWidth = 100, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Type"), headerTextAlignment = TextAlignment.Left, sortedAscending = true, sortingArrowAlignment = TextAlignment.Right, width = 80, minWidth = 60, maxWidth = 200, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Shape"), headerTextAlignment = TextAlignment.Left, sortedAscending = true, sortingArrowAlignment = TextAlignment.Right, width = 80, minWidth = 60, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Max Size"), headerTextAlignment = TextAlignment.Right, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = WidthSize, minWidth = WidthSize, maxWidth = WidthSize, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Format", "Format Default"), headerTextAlignment = TextAlignment.Left, sortedAscending = false, sortingArrowAlignment = TextAlignment.Left, width = WidthFormat, minWidth = MinWidthFormat, maxWidth = MaxWidthFormat, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Compression"), headerTextAlignment = TextAlignment.Left, sortedAscending = true, sortingArrowAlignment = TextAlignment.Right, width = 100, minWidth = 80, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Crunched"), headerTextAlignment = TextAlignment.Center, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = 70, minWidth = 60, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Quality"), headerTextAlignment = TextAlignment.Right, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = 60, minWidth = 50, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Windows"), headerTextAlignment = TextAlignment.Right, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = WidthSize, minWidth = WidthSize, maxWidth = WidthSize, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Format", "Format Windows"), headerTextAlignment = TextAlignment.Left, sortedAscending = false, sortingArrowAlignment = TextAlignment.Left, width = WidthFormat, minWidth = MinWidthFormat, maxWidth = MaxWidthFormat, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Android"), headerTextAlignment = TextAlignment.Right, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = WidthSize, minWidth = WidthSize, maxWidth = WidthSize, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Format", "Format Android"), headerTextAlignment = TextAlignment.Left, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = WidthFormat, minWidth = MinWidthFormat, maxWidth = MaxWidthFormat, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("iOS"), headerTextAlignment = TextAlignment.Right, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = WidthSize, minWidth = WidthSize, maxWidth = WidthSize, autoResize = false, allowToggleVisibility = true }, new MultiColumnHeaderState.Column { headerContent = new GUIContent("Format", "Format iOS"), headerTextAlignment = TextAlignment.Left, sortedAscending = false, sortingArrowAlignment = TextAlignment.Right, width = WidthFormat, minWidth = MinWidthFormat, maxWidth = MaxWidthFormat, autoResize = false, allowToggleVisibility = true }, }; var state = new MultiColumnHeaderState(columns); // var state = new MultiColumnHeaderState(columns) // { // visibleColumns = new[] // { // (int)TreeColumns.Icon, // (int)TreeColumns.StorageSize, // (int)TreeColumns.Name, // (int)TreeColumns.TextureSize, // (int)TreeColumns.MaxSize, // (int)TreeColumns.Compression, // (int)TreeColumns.Crunched, // (int)TreeColumns.MaxSizeWindows, // (int)TreeColumns.MaxSizeAndroid, // (int)TreeColumns.MaxSizeiOS, // } // }; return state; } } }