public virtual void BuildTable() { if (this.target.IsNull()) { return; } StateTable stateTable = this.target; stateTable.UpdateTableList(); StateRow[] activeTable = stateTable.tables[this.tableIndex]; this.tableGUI = new Table(); TableRow tableRow = this.tableGUI.AddRow(); tableRow.AppendField(new TitleField(stateTable)); if (activeTable.Length > 0) { tableRow = this.tableGUI.AddRow(); tableRow.AppendField(new HeaderField("")); foreach (var stateRequirement in activeTable[0].requirements[0].data) { var field = new HeaderField(stateRequirement); field.disabled = !stateRequirement.target.IsEnabled(); tableRow.AppendField(field); } foreach (StateRow stateRow in activeTable) { if (!this.rowIndex.ContainsKey(stateRow)) { this.rowIndex[stateRow] = 0; } int rowIndex = this.rowIndex[stateRow]; tableRow = this.tableGUI.AddRow(stateRow); tableRow.disabled = !stateRow.target.IsEnabled(); tableRow.AppendField(new LabelField(stateRow)); foreach (StateRequirement requirement in stateRow.requirements[rowIndex].data) { var tableField = new StateField(requirement); tableField.disabled = tableRow.disabled || !requirement.target.IsEnabled(); tableRow.AppendField(tableField); } } this.setupSections.Clear(); var tableRows = this.tableGUI.rows.Skip(2).ToList(); foreach (TableRow row in tableRows) { if (row.disabled) { continue; } var stateRow = row.target.As <StateRow>(); string section = stateRow.section; if (!section.IsEmpty() && !this.setupSections.Contains(section)) { bool open = EditorPref.Get <bool>("StateWindow-GroupRow-" + section, false); var groupRow = new TableRow(stateRow, this.tableGUI); var groupLabel = new GroupLabelField(section); var groupRows = tableRows.Where(x => x.target.As <StateRow>().section == section).ToArray(); groupLabel.groupRows = groupRows; groupRow.disabled = groupLabel.groupRows.Count(x => !x.disabled) == 0; groupRow.AppendField(groupLabel); foreach (TableField field in row.fields) { var groupField = new GroupField(field.target); var columnFields = groupRows.SelectMany(x => x.fields).Where(x => x is StateField && x.order == field.order).Cast <StateField>().ToArray(); groupField.disabled = groupRow.disabled || field.disabled; groupField.columnFields = columnFields; groupRow.AppendField(groupField); } foreach (var item in groupRows) { item.disabled = !open; } int insertIndex = tableRows.FindIndex(x => x.target == stateRow); this.tableGUI.rows.Insert(insertIndex + 2, groupRow); this.setupSections.Add(section); } } var ordered = this.tableGUI.rows.Skip(2).Where(x => x.target is StateRow).OrderBy(x => { var row = x.target.As <StateRow>(); if (!row.section.IsEmpty()) { return(row.section); } return(row.name); }); this.tableGUI.rows = this.tableGUI.rows.Take(2).Concat(ordered).ToList(); this.tableGUI.Reorder(); } this.Repaint(); }