public IEnumerable <ISearchItem <string> > GetItems(string query)
        {
            GameFilter.Mode mode = GameFilter.Mode.None;
            string          sep;

            if (query.Trim().StartsWith(","))
            {
                mode = GameFilter.Mode.Or;
                sep  = ",";
            }
            else if (query.Trim().StartsWith("&"))
            {
                mode = GameFilter.Mode.And;
                sep  = "&";
            }
            else
            {
                return(null);
            }
            var items = GameSearchSource.GetFilterItems(filter, mode, sep, Prefix);

            return(items);
        }
        public static IEnumerable <ISearchItem <string> > GetFilterItems(GameFilter previousFilter, GameFilter.Mode mode = GameFilter.Mode.Or, string seperator = null, string previousName = null)
        {
            string prefix = string.Empty;

            if (!string.IsNullOrEmpty(previousName))
            {
                prefix = $"{previousName}{seperator}";
            }
            var games = SearchPlugin.Instance.PlayniteApi.Database.Games;
            IEnumerable <ISearchItem <string> > items = SearchPlugin.Instance.PlayniteApi.Database.Sources
                                                        .Where(s => previousFilter.IsEmpty || SearchPlugin.Instance.PlayniteApi.Database.Games.Any(previousFilter.CopyAndAdd(g => g.Source == s, mode).Eval))
                                                        .Select(s =>
            {
                var source        = s;
                GameFilter filter = new GameFilter(g => g.Source == source, previousFilter, mode);
                var item          = new FilterItem(s.Name, prefix, ResourceProvider.GetString("LOC_QS_Library"), filter, seperator);
                return(item);
            });

            items = items.Concat(SearchPlugin.Instance.PlayniteApi.Database.Platforms
                                 .Where(p => previousFilter.IsEmpty || SearchPlugin.Instance.PlayniteApi.Database.Games.Any(previousFilter.CopyAndAdd(g => g.Platforms?.FirstOrDefault() == p, mode).Eval))
                                 .Select(p =>
            {
                var platform      = p;
                GameFilter filter = new GameFilter(g => g.Platforms?.FirstOrDefault() == platform, previousFilter, mode);
                var item          = new FilterItem(p.Name, prefix, ResourceProvider.GetString("LOC_QS_Platform"), filter, seperator);
                return(item);
            }));
            items = items.Concat(SearchPlugin.Instance.PlayniteApi.Database.Genres
                                 .Where(gr => previousFilter.IsEmpty || SearchPlugin.Instance.PlayniteApi.Database.Games.Any(previousFilter.CopyAndAdd(g => g.Genres?.Contains(gr) ?? false, mode).Eval))
                                 .Select(gr =>
            {
                GameFilter filter = new GameFilter(g => g.Genres?.Contains(gr) ?? false, previousFilter, mode);
                var item          = new FilterItem(gr.Name, prefix, ResourceProvider.GetString("LOC_QS_Genre"), filter, seperator);
                return(item);
            }));
            items = items.Concat(SearchPlugin.Instance.PlayniteApi.Database.Categories
                                 .Where(c => previousFilter.IsEmpty || SearchPlugin.Instance.PlayniteApi.Database.Games.Any(previousFilter.CopyAndAdd(g => g.Categories?.Contains(c) ?? false, mode).Eval))
                                 .Select(c =>
            {
                GameFilter filter = new GameFilter(g => g.Categories?.Contains(c) ?? false, previousFilter, mode);
                var item          = new FilterItem(c.Name, prefix, ResourceProvider.GetString("LOC_QS_Category"), filter, seperator);
                return(item);
            }));
            items = items.Concat(SearchPlugin.Instance.PlayniteApi.Database.Companies
                                 .Where(c => previousFilter.IsEmpty || SearchPlugin.Instance.PlayniteApi.Database.Games.Any(previousFilter.CopyAndAdd(g => (g.PublisherIds?.Contains(c.Id) ?? false) || (g.DeveloperIds?.Contains(c.Id) ?? false), mode).Eval))
                                 .Select(c =>
            {
                GameFilter filter = new GameFilter(g => (g.PublisherIds?.Contains(c.Id) ?? false) || (g.DeveloperIds?.Contains(c.Id) ?? false), previousFilter, mode);
                var item          = new FilterItem(c.Name, prefix, ResourceProvider.GetString("LOC_QS_Company"), filter, seperator);
                return(item);
            }));
            items = items.Concat((new[] { true, false })
                                 .Where(c => previousFilter.IsEmpty || SearchPlugin.Instance.PlayniteApi.Database.Games.Any(previousFilter.CopyAndAdd(g => g.IsInstalled == c, mode).Eval))
                                 .Select(c =>
            {
                var name          = c ? ResourceProvider.GetString("LOC_QS_Installed") : ResourceProvider.GetString("LOC_QS_Uninstalled");
                GameFilter filter = new GameFilter(g => g.IsInstalled == c, previousFilter, mode);
                var item          = new FilterItem(name, prefix, ResourceProvider.GetString("LOC_QS_InstallationStatus"), filter, seperator);
                return(item);
            }));
            return(items);
        }