1
0
mirror of https://github.com/ppy/osu.git synced 2026-06-03 22:14:57 +08:00

Fix FilterCriteria only being able to support one tag filter at once

Other textual keyword filters also worked like that, wherein if you did
`artist=a artist=b` the second filter would overwrite the second, but in
those cases the query is against a single field, so attempting to put
multiple search criteria in conjunction on a single field is kind of
nonsensical, so it was sort of fine to do that.

Which is not the case for user tags, which are multi-valued.
This commit is contained in:
Bartłomiej Dach
2025-08-13 10:09:47 +02:00
Unverified
parent a8b827782e
commit 3fb1880466
4 changed files with 25 additions and 12 deletions
@@ -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);
+1 -1
View File
@@ -39,7 +39,7 @@ namespace osu.Game.Screens.Select
public OptionalTextFilter Title;
public OptionalTextFilter DifficultyName;
public OptionalTextFilter Source;
public OptionalTextFilter UserTag;
public List<OptionalTextFilter> UserTags = [];
public OptionalRange<double> UserStarDifficulty = new OptionalRange<double>
{
+4 -1
View File
@@ -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;
@@ -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);