public QueryHelperWidget(bool blockMode, ISearchView view = null) { m_BlockMode = blockMode; drawBorder = true; m_Areas = new QueryBuilder("") { drawBackground = false, }; m_Areas.AddBlock(new QueryAreaBlock(m_Areas, k_All, "")); var builtinSearches = SearchTemplateAttribute.GetAllQueries(); var allProviders = view != null && view.context != null?view.context.GetProviders() : SearchService.GetActiveProviders(); var generalProviders = allProviders.Where(p => !p.isExplicitProvider); var explicitProviders = allProviders.Where(p => p.isExplicitProvider); var providers = generalProviders.Concat(explicitProviders); if (blockMode) { m_ActiveSearchProviders = providers.Where(p => p.id != "expression" && (p.fetchPropositions != null || builtinSearches.Any(sq => sq.searchText.StartsWith(p.filterId) || sq.GetProviderIds().Any(pid => p.id == pid)))).ToArray(); } else { m_ActiveSearchProviders = providers.ToArray(); } foreach (var p in m_ActiveSearchProviders) { m_Areas.AddBlock(new QueryAreaBlock(m_Areas, p)); } m_Areas.@readonly = true; foreach (var b in m_Areas.blocks) { b.tooltip = $"Double click to search in: {b.value}"; } if (string.IsNullOrEmpty(m_CurrentAreaFilterId)) { m_CurrentAreaFilterId = SearchSettings.helperWidgetCurrentArea; } m_Searches = new QueryHelperSearchGroup(m_BlockMode, L10n.Tr("Searches")); ChangeCurrentAreaFilter(m_CurrentAreaFilterId); PopulateSearches(builtinSearches); RefreshSearches(); BindSearchView(view); }
private void DrawSearches(Event e, QueryHelperSearchGroup group) { if (group.filteredQueries.Length == 0) { return; } GUILayout.Label(group.title); group.scrollPos = EditorGUILayout.BeginScrollView(group.scrollPos, GUIStyle.none, GUI.skin.verticalScrollbar); var maxDescriptionWidth = .4f * m_WidgetRect.width; for (var i = 0; i < group.filteredQueries.Length; ++i) { var queryData = group.filteredQueries[i]; var y = i == 0 ? 0 : GUILayoutUtility.GetLastRect().yMax; var rowRect = new Rect(0, y, m_WidgetRect.width, m_BlockMode ? queryData.builder.rect.height : Constants.kBuilderHeight); if (m_BlockMode) { if (queryData.descSize.x == 0) { queryData.descSize = Styles.description.CalcSize(queryData.description); } GUI.Label(rowRect, queryData.tooltip, Styles.builderRow); var iconRect = new Rect(Constants.kLeftPadding, y + 6f, Constants.kBuilderIconSize, Constants.kBuilderIconSize); GUI.Label(iconRect, queryData.icon, Styles.icon); var descWidth = Mathf.Min(maxDescriptionWidth, queryData.descSize.x + Constants.kScrollbarOffset); var descRect = new Rect(m_WidgetRect.width - descWidth - Constants.kLeftPadding, y + 6f, descWidth, Constants.kBuilderHeight); GUI.Label(descRect, queryData.description, Styles.description); var builderWidth = m_WidgetRect.width - descRect.width - iconRect.width; var builderRect = new Rect(iconRect.xMin + Constants.kBuilderIconSize, y, builderWidth, Constants.kBuilderHeight); DrawBuilder(e, queryData.builder, builderRect); } else { var descSize = Styles.description.CalcSize(queryData.description); var textHeight = Styles.textQuery.CalcHeight(Utils.GUIContentTemp(queryData.searchText), rowRect.xMax - descSize.x - 20f); rowRect.height = textHeight + 6f; GUI.Label(rowRect, queryData.searchText != queryData.tooltip.tooltip ? queryData.tooltip : GUIContent.none, Styles.builderRow); GUILayout.BeginHorizontal(); GUILayout.Label(queryData.icon, Styles.icon); GUILayout.Label(queryData.searchText, Styles.textQuery); GUILayout.FlexibleSpace(); GUILayout.Label(queryData.description, Styles.description); GUILayout.EndHorizontal(); } EditorGUIUtility.AddCursorRect(rowRect, MouseCursor.Link); if (e.type == EventType.MouseUp && e.button == 0 && rowRect.Contains(e.mousePosition)) { ExecuteQuery(queryData.query); e.Use(); } } EditorGUILayout.EndScrollView(); }