protected SVirtualScrollInfo DrawVirtualScrollView(SVirtualScrollInfo svi, float elementHeight, int elementCount, Action <Rect, float, int> elementDrawCallback) { var begin = EditorGUILayout.GetControlRect(GUILayout.Height(0)); var elementWidth = begin.width; if (Event.current.type == EventType.Repaint) { svi.svb = begin; } svi.sv = EditorGUILayout.BeginScrollView(svi.sv, false, false); var virtualSpace = EditorGUILayout.GetControlRect(GUILayout.Height(elementHeight * elementCount), GUILayout.Width(elementWidth - 12f)); var elementIndexBegin = Mathf.FloorToInt(svi.sv_begin / elementHeight); var elementIndexEnd = Mathf.CeilToInt(svi.sv_end / elementHeight); for (var i = elementIndexBegin; i < elementIndexEnd; i++) { if (i < 0 || i >= elementCount) { continue; } var rect = new Rect(0, i * elementHeight + 1f, elementWidth - 6f, elementHeight - 1f); elementDrawCallback(rect, elementHeight, i); // EditorGUI.LabelField(rect, $"Virtual Element {i + 1}/{elementCount} ({elementIndexEnd - elementIndexBegin})"); } EditorGUILayout.EndScrollView(); var end = EditorGUILayout.GetControlRect(GUILayout.Height(0)); if (Event.current.type == EventType.Repaint) { svi.sve = end; } svi.sv_begin = svi.sv.y; svi.sv_end = svi.sv.y + svi.sve.yMin - svi.svb.yMax - 8; if (svi.hint >= 0) { var hint = begin.y + 16f + (svi.hint * elementHeight * (svi.sve.yMin - svi.svb.yMax - 32f)) / virtualSpace.height; EditorGUI.DrawRect(new Rect(6f + elementWidth - 12f, hint, 12f, 2f), Color.green); } return(svi); }
protected SVirtualScrollInfo EnsureVirtualScrollView(SVirtualScrollInfo svi, float elementHeight, int elementCount, int i) { var begin = i * elementHeight + 1f; var end = begin + elementHeight - 1f; if (svi.sv_begin > end || svi.sv_end < begin) { svi.sv.y = begin; Repaint(); } var totalEnd = elementHeight * elementCount; var remain = svi.sv_end - totalEnd; if (remain > 0f) { var span = svi.sv_end - svi.sv_begin; svi.sv_end = totalEnd; svi.sv_begin = totalEnd - span; } return(svi); }
private void OnDrawAssets() { Block("Search", () => { var nSearchKeyword = EditorGUILayout.TextField("Keyword", _searchKeyword); if (nSearchKeyword != _searchKeyword) { _searchKeyword = nSearchKeyword; EditorPrefs.SetString(KeyForSearchKey, _searchKeyword); UpdateSearchResults(); } var nSearchSliceKeyword = EditorGUILayout.TextField("Bundle Slice Keyword", _searchSliceKeyword); if (nSearchSliceKeyword != _searchSliceKeyword) { _searchSliceKeyword = nSearchSliceKeyword; EditorPrefs.SetString(KeyForSearchSliceKey, _searchSliceKeyword); UpdateSearchResults(); } var nShowDefinedOnly = EditorGUILayout.Toggle("Show Defined Only", _showDefinedOnly); if (nShowDefinedOnly != _showDefinedOnly) { _showDefinedOnly = nShowDefinedOnly; EditorPrefs.SetInt(KeyForShowDefinedOnly, _showDefinedOnly ? 1 : 0); UpdateSearchResults(); } var nUseRegexMatch = EditorGUILayout.Toggle("Use Regex Match", _useRegexMatch); if (nUseRegexMatch != _useRegexMatch) { _useRegexMatch = nUseRegexMatch; EditorPrefs.SetInt(KeyForUseRegexMatch, _useRegexMatch ? 1 : 0); UpdateSearchResults(); } var nShowSelectionOnly = EditorGUILayout.Toggle("Show Selection Only", _showSelectionOnly); if (nShowSelectionOnly != _showSelectionOnly) { _showSelectionOnly = nShowSelectionOnly; EditorPrefs.SetInt(KeyForShowSelectionOnly, _showSelectionOnly ? 1 : 0); UpdateSearchResults(); } var nShowStreamingAssetsOnly = EditorGUILayout.Toggle("Show StreamingAssets Only", _showStreamingAssetsOnly); if (nShowStreamingAssetsOnly != _showStreamingAssetsOnly) { _showStreamingAssetsOnly = nShowStreamingAssetsOnly; EditorPrefs.SetInt(KeyForShowStreamingAssetsOnly, _showStreamingAssetsOnly ? 1 : 0); UpdateSearchResults(); } }); EditorGUILayout.Space(); Block(string.Format("Results ({0}/{1})", _searchMarks.Count, _searchResults.Count), () => { EditorGUILayout.BeginHorizontal(); var nBatchedSelectMarks = EditorGUILayout.Toggle(_batchedSelectMarks, GUILayout.Width(20f)); EditorGUILayout.LabelField("Asset Packer", GUILayout.Width(110f)); EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); if (nBatchedSelectMarks != _batchedSelectMarks) { _batchedSelectMarks = nBatchedSelectMarks; _searchMarks.Clear(); if (_batchedSelectMarks) { for (var i = 0; i < _searchResults.Count; i++) { _searchMarks.Add(_searchResults[i]); } } } var elementCount = _searchResults.Count; _searchSV.hint = -1; _searchSV = DrawVirtualScrollView(_searchSV, 22f, elementCount, (Rect elementRect, float elementHeight, int i) => { var result = _searchResults[i]; var marked = _searchMarks.Contains(result); var headRect = new Rect(elementRect.x, elementRect.y, 20f, elementRect.height); var nMarked = EditorGUI.Toggle(headRect, marked); if (marked) // 批量修改模式 { GUI.color = Color.green; } var lineRect = new Rect(elementRect.x + 20f, elementRect.y, elementRect.width - 20f, elementRect.height); DrawSearchResultAssetAttributes(lineRect, _data, result, this, marked); GUI.color = _GUIColor; if (nMarked != marked) { if (nMarked) { _searchMarks.Add(result); } else { _searchMarks.Remove(result); } } }); }); EditorGUILayout.Space(); }