diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs
index df0a823648..deac1a5128 100644
--- a/osu.Game/Configuration/OsuConfigManager.cs
+++ b/osu.Game/Configuration/OsuConfigManager.cs
@@ -57,6 +57,7 @@ namespace osu.Game.Configuration
SetDefault(OsuSetting.ChatDisplayHeight, ChatOverlay.DEFAULT_HEIGHT, 0.2f, 1f, 0.01f);
SetDefault(OsuSetting.BeatmapListingCardSize, BeatmapCardSize.Normal);
+ SetDefault(OsuSetting.BeatmapListingFeaturedArtistFilter, true);
SetDefault(OsuSetting.ProfileCoverExpanded, true);
@@ -450,5 +451,6 @@ namespace osu.Game.Configuration
EditorAdjustExistingObjectsOnTimingChanges,
AlwaysRequireHoldingForPause,
MultiplayerShowInProgressFilter,
+ BeatmapListingFeaturedArtistFilter,
}
}
diff --git a/osu.Game/Localisation/BeatmapOverlayStrings.cs b/osu.Game/Localisation/BeatmapOverlayStrings.cs
index fc818f7596..f8122c1ef9 100644
--- a/osu.Game/Localisation/BeatmapOverlayStrings.cs
+++ b/osu.Game/Localisation/BeatmapOverlayStrings.cs
@@ -28,6 +28,11 @@ This includes content that may not be correctly licensed for osu! usage. Browse
///
public static LocalisableString UserContentConfirmButtonText => new TranslatableString(getKey(@"understood"), @"I understand");
+ ///
+ /// "Featured Artists are music artists who have collaborated with osu! to make a selection of their tracks available for use in beatmaps. For some osu! releases, we showcase only featured artist beatmaps to better support the surrounding ecosystem."
+ ///
+ public static LocalisableString FeaturedArtistsTooltip => new TranslatableString(getKey(@"featured_artists_disabled_tooltip"), @"Featured Artists are music artists who have collaborated with osu! to make a selection of their tracks available for use in beatmaps. For some osu! releases, we showcase only featured artist beatmaps to better support the surrounding ecosystem.");
+
private static string getKey(string key) => $@"{prefix}:{key}";
}
}
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index d25addb534..300054a1f5 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -221,6 +221,11 @@ namespace osu.Game
private readonly List visibleBlockingOverlays = new List();
+ ///
+ /// Whether the game should be limited to only display officially licensed content.
+ ///
+ public virtual bool HideUnlicensedContent => false;
+
public OsuGame(string[] args = null)
{
this.args = args;
diff --git a/osu.Game/Overlays/BeatmapListing/BeatmapSearchGeneralFilterRow.cs b/osu.Game/Overlays/BeatmapListing/BeatmapSearchGeneralFilterRow.cs
index 34b7d45a77..b62836dfde 100644
--- a/osu.Game/Overlays/BeatmapListing/BeatmapSearchGeneralFilterRow.cs
+++ b/osu.Game/Overlays/BeatmapListing/BeatmapSearchGeneralFilterRow.cs
@@ -5,6 +5,7 @@ using System;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Extensions;
+using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Input.Events;
using osu.Framework.Localisation;
@@ -113,7 +114,7 @@ namespace osu.Game.Overlays.BeatmapListing
}
}
- private partial class FeaturedArtistsTabItem : MultipleSelectionFilterTabItem
+ private partial class FeaturedArtistsTabItem : MultipleSelectionFilterTabItem, IHasTooltip
{
private Bindable disclaimerShown = null!;
@@ -125,17 +126,36 @@ namespace osu.Game.Overlays.BeatmapListing
[Resolved]
private OsuColour colours { get; set; } = null!;
+ [Resolved]
+ private OsuConfigManager config { get; set; } = null!;
+
[Resolved]
private SessionStatics sessionStatics { get; set; } = null!;
[Resolved]
private IDialogOverlay? dialogOverlay { get; set; }
+ [Resolved]
+ private OsuGame? game { get; set; }
+
+ public LocalisableString TooltipText => BeatmapOverlayStrings.FeaturedArtistsTooltip;
+
protected override void LoadComplete()
{
base.LoadComplete();
+ config.BindWith(OsuSetting.BeatmapListingFeaturedArtistFilter, Active);
disclaimerShown = sessionStatics.GetBindable(Static.FeaturedArtistDisclaimerShownOnce);
+
+ // no need to show the disclaimer if the user already had it toggled off in config.
+ if (!Active.Value)
+ disclaimerShown.Value = true;
+
+ if (game?.HideUnlicensedContent == true)
+ {
+ Enabled.Value = false;
+ Active.Disabled = true;
+ }
}
protected override Color4 ColourNormal => colours.Orange1;
@@ -143,6 +163,9 @@ namespace osu.Game.Overlays.BeatmapListing
protected override bool OnClick(ClickEvent e)
{
+ if (!Enabled.Value)
+ return true;
+
if (!disclaimerShown.Value && dialogOverlay != null)
{
dialogOverlay.Push(new FeaturedArtistConfirmDialog(() =>
diff --git a/osu.Game/Overlays/BeatmapListing/BeatmapSearchMultipleSelectionFilterRow.cs b/osu.Game/Overlays/BeatmapListing/BeatmapSearchMultipleSelectionFilterRow.cs
index 958297b559..73af62c322 100644
--- a/osu.Game/Overlays/BeatmapListing/BeatmapSearchMultipleSelectionFilterRow.cs
+++ b/osu.Game/Overlays/BeatmapListing/BeatmapSearchMultipleSelectionFilterRow.cs
@@ -73,7 +73,10 @@ namespace osu.Game.Overlays.BeatmapListing
private void currentChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
foreach (var c in Children)
- c.Active.Value = Current.Contains(c.Value);
+ {
+ if (!c.Active.Disabled)
+ c.Active.Value = Current.Contains(c.Value);
+ }
}
///
@@ -100,7 +103,7 @@ namespace osu.Game.Overlays.BeatmapListing
protected partial class MultipleSelectionFilterTabItem : FilterTabItem
{
- private Drawable activeContent = null!;
+ private Container activeContent = null!;
private Circle background = null!;
public MultipleSelectionFilterTabItem(T value)
@@ -160,7 +163,9 @@ namespace osu.Game.Overlays.BeatmapListing
{
Color4 colour = Active.Value ? ColourActive : ColourNormal;
- if (IsHovered)
+ if (!Enabled.Value)
+ colour = colour.Darken(1f);
+ else if (IsHovered)
colour = Active.Value ? colour.Darken(0.2f) : colour.Lighten(0.2f);
if (Active.Value)
diff --git a/osu.Game/Overlays/BeatmapListing/FilterTabItem.cs b/osu.Game/Overlays/BeatmapListing/FilterTabItem.cs
index 8f4ecaa0f5..e357718103 100644
--- a/osu.Game/Overlays/BeatmapListing/FilterTabItem.cs
+++ b/osu.Game/Overlays/BeatmapListing/FilterTabItem.cs
@@ -57,7 +57,9 @@ namespace osu.Game.Overlays.BeatmapListing
{
base.LoadComplete();
+ Enabled.BindValueChanged(_ => UpdateState());
UpdateState();
+
FinishTransforms(true);
}
diff --git a/osu.iOS/OsuGameIOS.cs b/osu.iOS/OsuGameIOS.cs
index c0bd77366e..a9ca1778a0 100644
--- a/osu.iOS/OsuGameIOS.cs
+++ b/osu.iOS/OsuGameIOS.cs
@@ -17,6 +17,8 @@ namespace osu.iOS
{
public override Version AssemblyVersion => new Version(NSBundle.MainBundle.InfoDictionary["CFBundleVersion"].ToString());
+ public override bool HideUnlicensedContent => true;
+
protected override UpdateManager CreateUpdateManager() => new MobileUpdateNotifier();
protected override BatteryInfo CreateBatteryInfo() => new IOSBatteryInfo();