diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs index f7bf1eb778..4cd91a85e2 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmap.cs @@ -84,12 +84,17 @@ namespace osu.Game.Screens.Select.Carousel match &= !criteria.DifficultyName.HasFilter || criteria.DifficultyName.Matches(BeatmapInfo.DifficultyName); match &= !criteria.Source.HasFilter || criteria.Source.Matches(BeatmapInfo.Metadata.Source); - if (criteria.UserTag.HasFilter) + if (criteria.UserTags.Any()) { - bool anyTagMatched = false; - foreach (string tag in BeatmapInfo.Metadata.UserTags) - anyTagMatched |= criteria.UserTag.Matches(tag); - match &= anyTagMatched; + foreach (var tagFilter in criteria.UserTags) + { + bool anyTagMatched = false; + + foreach (string tag in BeatmapInfo.Metadata.UserTags) + anyTagMatched |= tagFilter.Matches(tag); + + match &= anyTagMatched; + } } match &= !criteria.UserStarDifficulty.HasFilter || criteria.UserStarDifficulty.IsInRange(BeatmapInfo.StarRating); diff --git a/osu.Game/Screens/Select/FilterCriteria.cs b/osu.Game/Screens/Select/FilterCriteria.cs index ce7d624e2a..b241b1764e 100644 --- a/osu.Game/Screens/Select/FilterCriteria.cs +++ b/osu.Game/Screens/Select/FilterCriteria.cs @@ -39,7 +39,7 @@ namespace osu.Game.Screens.Select public OptionalTextFilter Title; public OptionalTextFilter DifficultyName; public OptionalTextFilter Source; - public OptionalTextFilter UserTag; + public List UserTags = []; public OptionalRange UserStarDifficulty = new OptionalRange { diff --git a/osu.Game/Screens/Select/FilterQueryParser.cs b/osu.Game/Screens/Select/FilterQueryParser.cs index 094e4dfe61..9bcbfc5cef 100644 --- a/osu.Game/Screens/Select/FilterQueryParser.cs +++ b/osu.Game/Screens/Select/FilterQueryParser.cs @@ -117,7 +117,10 @@ namespace osu.Game.Screens.Select return TryUpdateCriteriaText(ref criteria.Source, op, value); case "tag": - return TryUpdateCriteriaText(ref criteria.UserTag, op, value); + var tagFilter = new FilterCriteria.OptionalTextFilter(); + TryUpdateCriteriaText(ref tagFilter, op, value); + criteria.UserTags.Add(tagFilter); + return true; default: return criteria.RulesetCriteria?.TryParseCustomKeywordCriteria(key, op, value) ?? false; diff --git a/osu.Game/Screens/SelectV2/BeatmapCarouselFilterMatching.cs b/osu.Game/Screens/SelectV2/BeatmapCarouselFilterMatching.cs index 1f5304c953..3eada92f9b 100644 --- a/osu.Game/Screens/SelectV2/BeatmapCarouselFilterMatching.cs +++ b/osu.Game/Screens/SelectV2/BeatmapCarouselFilterMatching.cs @@ -103,12 +103,17 @@ namespace osu.Game.Screens.SelectV2 match &= !criteria.DifficultyName.HasFilter || criteria.DifficultyName.Matches(beatmap.DifficultyName); match &= !criteria.Source.HasFilter || criteria.Source.Matches(beatmap.Metadata.Source); - if (criteria.UserTag.HasFilter) + if (criteria.UserTags.Any()) { - bool anyTagMatched = false; - foreach (string tag in beatmap.Metadata.UserTags) - anyTagMatched |= criteria.UserTag.Matches(tag); - match &= anyTagMatched; + foreach (var tagFilter in criteria.UserTags) + { + bool anyTagMatched = false; + + foreach (string tag in beatmap.Metadata.UserTags) + anyTagMatched |= tagFilter.Matches(tag); + + match &= anyTagMatched; + } } match &= !criteria.UserStarDifficulty.HasFilter || criteria.UserStarDifficulty.IsInRange(beatmap.StarRating);