Example #1
0
        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();
        }