private void DrawItems(GUICell cells) { int startRowIndex = Mathf.CeilToInt(mScrolledViewRect.yMin / 16.0f); int endRowIndex = Mathf.CeilToInt(mScrolledViewRect.yMax / 16.0f); //int startColumnIndex = Mathf.CeilToInt(mScrolledViewRect.xMin / 16.0f); //int endColumnIndex = Mathf.CeilToInt(mScrolledViewRect.xMax / 16.0f); for (int i = 0; i < cells.Rows.Count; ++i) { if (i >= cells.Rows.Count) { break; } var row = cells.Rows[i]; Rect rect = new Rect(0, i * 16, 0, 16); for (int j = 0; j < row.Columns.Count; ++j) { var column = row.Columns[j]; var size = GUI.skin.label.CalcSize(new GUIContent(column.StringValue)); mColumnWidth[j] = Mathf.Max(size.x + 20, mColumnWidth[j]); rect.width = mColumnWidth[j]; if (mScrolledViewRect.Overlaps(new Rect(rect.position, size))) { ++mDebugDrawCount; GUI.SetNextControlName("cell." + i + "." + j); EditorGUI.SelectableLabel(rect, column.StringValue); } rect.x += rect.width; } } }
public void DrawCells(Rect rect, GUICell cells) { GUI.Box(rect, GUIContent.none); Rect scrollViewContentRect = new Rect(0, 0, rect.width - 20, cells.RowCount * 16); Utility.ListAutoResize(mColumnWidth, cells.ColumnCount, DefatultWidth); Rect clipRect = new Rect(rect.x, rect.y, rect.width, 20); Rect columnRect = clipRect; columnRect.x = -ScrollPosition.x; columnRect.y = 0; columnRect.width = TotalColumnWidth; GUI.Button(new Rect(columnRect.y - 20, 0, 120, 20), mDebugDrawCount.ToString(), EditorStyles.miniButtonMid); mDebugDrawCount = 0; using (new GUI.ClipScope(clipRect)) { Rect hitRect = new Rect(0, 0, rect.width, clipRect.height); // カラム名の描画 for (int i = 0; i < cells.ColumnCount; ++i) { columnRect.width = mColumnWidth[i]; if (hitRect.Overlaps(columnRect)) { ++mDebugDrawCount; GUI.Button(columnRect, cells.ColumnNames[i], EditorStyles.miniButtonMid); } columnRect.x += mColumnWidth[i]; } } scrollViewContentRect.width = TotalColumnWidth - 40; Rect viewRect = new RectOffset(0, 0, (int)columnRect.height, 0).Remove(rect); ViewSize = viewRect.size - new Vector2(20, 20); // セルの描画 using (var scrollView = new GUI.ScrollViewScope(viewRect, ScrollPosition, scrollViewContentRect)) { DrawItems(cells); // スクロール座標の更新 ScrollPosition = scrollView.scrollPosition; } clipRect = new Rect(rect.x, rect.y, rect.width - 20, viewRect.height + 1); columnRect.x = -ScrollPosition.x; columnRect.y = 0; columnRect.width = TotalColumnWidth; using (new GUI.ClipScope(clipRect)) { Rect hitRect = new Rect(0, 0, rect.width, clipRect.height); Handles.BeginGUI(); Handles.color = Color.gray; for (int i = 0; i < cells.ColumnCount; ++i) { columnRect.width = mColumnWidth[i]; if (hitRect.Contains(new Vector2(columnRect.x + 0.5f, 1))) { ++mDebugDrawCount; Handles.DrawLine(new Vector2(columnRect.x + 0.5f, 1), new Vector2(columnRect.x + 0.5f, viewRect.height + 0.5f)); } columnRect.x += mColumnWidth[i]; } Handles.color = Color.white; Handles.EndGUI(); } }