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); }