public override void Draw(Rect screenRect, ICollection <int> selection) { GetGridSize(screenRect, out var contentRect, out var itemHeight, out var itemWidth, out var gridHeight, out var gridWidth, out var scrollBarWidth, out var columnCount, out _); var spaceBetweenTiles = Mathf.Floor((gridWidth - (columnCount * itemWidth)) / (columnCount - 1f)); var viewRect = screenRect; viewRect.width = screenRect.width - scrollBarWidth; viewRect.height = gridHeight + contentViewPadding; var gridRect = new Rect(screenRect.x, screenRect.y + m_ScrollPosition.y, gridWidth, screenRect.height); var itemRect = new Rect(contentRect.x, contentRect.y, itemWidth, itemHeight); m_ScrollPosition = GUI.BeginScrollView(screenRect, m_ScrollPosition, viewRect); var evt = Event.current; var index = 0; var selectionIndex = selection.Count == 0 ? -1 : selection.Last(); var eventType = evt.type; var mousePosition = evt.mousePosition; var isHoverGrid = !AutoComplete.IsHovered(evt.mousePosition) & gridRect.Contains(mousePosition); foreach (var item in items) { if (evt.type == EventType.Repaint && index == selectionIndex && focusSelectedItem) { FocusGridItemRect(itemRect, screenRect); focusSelectedItem = false; } if (itemRect.Overlaps(gridRect)) { var buttonWidth = Styles.actionButton.fixedWidth + Styles.actionButton.margin.right; var favoriteButtonRect = new Rect(itemRect.xMax - buttonWidth, itemRect.yMin + 4f, Styles.actionButton.fixedWidth, Styles.actionButton.fixedHeight); if (evt.isMouse && !isHoverGrid) { // Skip } else if (eventType == EventType.MouseDown) { if (itemRect.Contains(mousePosition)) { if (favoriteButtonRect.Contains(evt.mousePosition)) { if (SearchSettings.searchItemFavorites.Contains(item.id)) { SearchSettings.RemoveItemFavorite(item); } else { SearchSettings.AddItemFavorite(item); } } else { HandleMouseDown(index); } } } else if (evt.type == EventType.MouseUp || IsDragClicked(evt)) { if (itemRect.Contains(mousePosition)) { HandleMouseUp(index, items.Count); if (index == selectionIndex) { focusSelectedItem = true; } } } else if (eventType == EventType.MouseDrag && m_PrepareDrag) { if (itemRect.Contains(mousePosition)) { HandleMouseDrag(index, items.Count); } } else if (eventType == EventType.Repaint) { DrawGridItem(index, item, itemRect, isHoverGrid, selection, evt); var markedAsFavorite = SearchSettings.searchItemFavorites.Contains(item.id); if (markedAsFavorite || (isHoverGrid && itemRect.Contains(evt.mousePosition))) { if (markedAsFavorite) { GUI.Button(favoriteButtonRect, Styles.searchFavoriteOnButtonContent, Styles.actionButton); } else { using (new Utils.ColorScope(new Color(0.9f, 0.9f, 0.9f, 0.4f))) GUI.Button(favoriteButtonRect, Styles.searchFavoriteButtonContent, Styles.actionButton); } EditorGUIUtility.AddCursorRect(favoriteButtonRect, MouseCursor.Link); } } } else { item.preview = null; } itemRect = new Rect(itemRect.x + itemWidth + spaceBetweenTiles, itemRect.y, itemWidth, itemHeight); if (itemRect.xMax > contentRect.x + gridWidth) { itemRect = new Rect(contentRect.x, itemRect.y + itemHeight, itemRect.width, itemRect.height); } ++index; } GUI.EndScrollView(); }