void CellGUI(Rect cellRect, TreeViewItem item, int column, ref RowGUIArgs args) { var type = currentSystem.Types[column]; if (!nativeArrays.ContainsKey(type)) { return; } var array = nativeArrays[type]; Type arrayType; if (type.GetInterfaces().Contains(typeof(IComponentData))) { arrayType = typeof(ComponentDataArray <>).MakeGenericType(type); } else if (type == typeof(Entity)) { arrayType = typeof(EntityArray); } else { return; } var arrayIndexer = arrayType.GetProperty("Item", BindingFlags.Public | BindingFlags.Instance).GetGetMethod(); var arrayElement = arrayIndexer.Invoke(array, new object[] { item.id }); cellRect.height -= pointsBetweenRows; StructGUI.CellGUI(cellRect, arrayElement, linesPerRow); }
public void PrepareData() { var emptyArgs = new object[0]; var emptyTypes = new Type[0]; var emptyModifiers = new ParameterModifier[0]; if (currentSystem != null) { nativeArrays = new Dictionary <Type, object>(); linesPerRow = 1; foreach (var type in currentSystem.Types) { var attr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly; if (type.GetInterfaces().Contains(typeof(IComponentData))) { linesPerRow = Mathf.Max(linesPerRow, StructGUI.RowsForType(type)); rowHeight = StructGUI.pointsPerLine * linesPerRow + pointsBetweenRows; var method = typeof(ComponentGroup).GetMethod("GetComponentDataArray", attr, null, emptyTypes, emptyModifiers); method = method.MakeGenericMethod(type); var array = method.Invoke(currentSystem, emptyArgs); nativeArrays.Add(type, array); } else if (typeof(Component).IsAssignableFrom(type)) { var method = typeof(ComponentGroupExtensionsForComponentArray).GetMethod("GetComponentArray", attr); method = method.MakeGenericMethod(type); var array = method.Invoke(null, new [] { currentSystem }); nativeArrays.Add(type, array); } else if (type == typeof(Entity)) { linesPerRow = Mathf.Max(linesPerRow, StructGUI.RowsForType(type)); rowHeight = StructGUI.pointsPerLine * linesPerRow + pointsBetweenRows; var method = typeof(ComponentGroup).GetMethod("GetEntityArray", attr); var args = new object[] {}; var array = method.Invoke(currentSystem, args); nativeArrays.Add(type, array); } else { nativeArrays.Add(type, null); } } } }
static MultiColumnHeaderState BuildHeaderState(ComponentGroup system, float listWidth) { var types = system.Types; var columns = new List <MultiColumnHeaderState.Column>(types.Length + 1); var cells = new int[types.Length]; var totalCells = 0; for (var i = 0; i < types.Length; ++i) { cells[i] = StructGUI.ColumnsForType(types[i]); totalCells += cells[i]; } var cellWidth = listWidth; if (totalCells > 0f) { cellWidth /= totalCells; } for (var i = 0; i < types.Length; ++i) { columns.Add(new MultiColumnHeaderState.Column { headerContent = new GUIContent(types[i].Name), contextMenuText = "Asset", headerTextAlignment = TextAlignment.Center, sortedAscending = true, sortingArrowAlignment = TextAlignment.Right, width = cells[i] * cellWidth, minWidth = 60, maxWidth = 500, autoResize = false, allowToggleVisibility = true }); } var headerState = new MultiColumnHeaderState(columns.ToArray()); return(headerState); }