diff --git a/osu.Android.props b/osu.Android.props
index 1a76a24496..a41c1a5864 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -51,7 +51,7 @@
-
-
+
+
diff --git a/osu.Game.Tests/Visual/Menus/TestSceneToolbar.cs b/osu.Game.Tests/Visual/Menus/TestSceneToolbar.cs
index f819ae4682..2a4486812c 100644
--- a/osu.Game.Tests/Visual/Menus/TestSceneToolbar.cs
+++ b/osu.Game.Tests/Visual/Menus/TestSceneToolbar.cs
@@ -91,7 +91,7 @@ namespace osu.Game.Tests.Visual.Menus
public class TestToolbar : Toolbar
{
- public new Bindable OverlayActivationMode => base.OverlayActivationMode;
+ public new Bindable OverlayActivationMode => base.OverlayActivationMode as Bindable;
}
}
}
diff --git a/osu.Game.Tests/Visual/Online/TestSceneFullscreenOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneFullscreenOverlay.cs
index e60adcee34..8f20bcdcc1 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneFullscreenOverlay.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneFullscreenOverlay.cs
@@ -12,7 +12,7 @@ namespace osu.Game.Tests.Visual.Online
[TestFixture]
public class TestSceneFullscreenOverlay : OsuTestScene
{
- private FullscreenOverlay overlay;
+ private FullscreenOverlay overlay;
protected override void LoadComplete()
{
@@ -38,10 +38,10 @@ namespace osu.Game.Tests.Visual.Online
AddAssert("fire count 3", () => fireCount == 3);
}
- private class TestFullscreenOverlay : FullscreenOverlay
+ private class TestFullscreenOverlay : FullscreenOverlay
{
public TestFullscreenOverlay()
- : base(OverlayColourScheme.Pink)
+ : base(OverlayColourScheme.Pink, null)
{
Children = new Drawable[]
{
diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapLeaderboard.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapLeaderboard.cs
index 48b718c04d..67cd720260 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapLeaderboard.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapLeaderboard.cs
@@ -5,9 +5,9 @@ using System;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Game.Beatmaps;
-using osu.Game.Online.API.Requests.Responses;
using osu.Game.Online.Leaderboards;
using osu.Game.Overlays;
+using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Osu.Mods;
using osu.Game.Scoring;
using osu.Game.Screens.Select.Leaderboards;
@@ -53,53 +53,46 @@ namespace osu.Game.Tests.Visual.SongSelect
private void showPersonalBestWithNullPosition()
{
- leaderboard.TopScore = new APILegacyUserTopScoreInfo
+ leaderboard.TopScore = new ScoreInfo
{
- Position = null,
- Score = new APILegacyScoreInfo
+ Rank = ScoreRank.XH,
+ Accuracy = 1,
+ MaxCombo = 244,
+ TotalScore = 1707827,
+ Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock() },
+ User = new User
{
- Rank = ScoreRank.XH,
- Accuracy = 1,
- MaxCombo = 244,
- TotalScore = 1707827,
- Mods = new[] { new OsuModHidden().Acronym, new OsuModHardRock().Acronym, },
- User = new User
+ Id = 6602580,
+ Username = @"waaiiru",
+ Country = new Country
{
- Id = 6602580,
- Username = @"waaiiru",
- Country = new Country
- {
- FullName = @"Spain",
- FlagName = @"ES",
- },
+ FullName = @"Spain",
+ FlagName = @"ES",
},
- }
+ },
};
}
private void showPersonalBest()
{
- leaderboard.TopScore = new APILegacyUserTopScoreInfo
+ leaderboard.TopScore = new ScoreInfo
{
Position = 999,
- Score = new APILegacyScoreInfo
+ Rank = ScoreRank.XH,
+ Accuracy = 1,
+ MaxCombo = 244,
+ TotalScore = 1707827,
+ Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
+ User = new User
{
- Rank = ScoreRank.XH,
- Accuracy = 1,
- MaxCombo = 244,
- TotalScore = 1707827,
- Mods = new[] { new OsuModHidden().Acronym, new OsuModHardRock().Acronym, },
- User = new User
+ Id = 6602580,
+ Username = @"waaiiru",
+ Country = new Country
{
- Id = 6602580,
- Username = @"waaiiru",
- Country = new Country
- {
- FullName = @"Spain",
- FlagName = @"ES",
- },
+ FullName = @"Spain",
+ FlagName = @"ES",
},
- }
+ },
};
}
diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneUserTopScoreContainer.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneUserTopScoreContainer.cs
index 0598324110..b8b8792b9b 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestSceneUserTopScoreContainer.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestSceneUserTopScoreContainer.cs
@@ -6,11 +6,11 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osuTK.Graphics;
-using osu.Game.Online.API.Requests.Responses;
+using osu.Game.Online.Leaderboards;
using osu.Game.Overlays;
+using osu.Game.Rulesets.Mods;
using osu.Game.Scoring;
using osu.Game.Rulesets.Osu.Mods;
-using osu.Game.Screens.Select.Leaderboards;
using osu.Game.Users;
namespace osu.Game.Tests.Visual.SongSelect
@@ -22,7 +22,7 @@ namespace osu.Game.Tests.Visual.SongSelect
public TestSceneUserTopScoreContainer()
{
- UserTopScoreContainer topScoreContainer;
+ UserTopScoreContainer topScoreContainer;
Add(dialogOverlay = new DialogOverlay
{
@@ -42,7 +42,7 @@ namespace osu.Game.Tests.Visual.SongSelect
RelativeSizeAxes = Axes.Both,
Colour = Color4.DarkGreen,
},
- topScoreContainer = new UserTopScoreContainer
+ topScoreContainer = new UserTopScoreContainer(s => new LeaderboardScore(s, s.Position, false))
{
Origin = Anchor.BottomCentre,
Anchor = Anchor.BottomCentre,
@@ -52,69 +52,60 @@ namespace osu.Game.Tests.Visual.SongSelect
var scores = new[]
{
- new APILegacyUserTopScoreInfo
+ new ScoreInfo
{
Position = 999,
- Score = new APILegacyScoreInfo
+ Rank = ScoreRank.XH,
+ Accuracy = 1,
+ MaxCombo = 244,
+ TotalScore = 1707827,
+ Mods = new Mod[] { new OsuModHidden(), new OsuModHardRock(), },
+ User = new User
{
- Rank = ScoreRank.XH,
- Accuracy = 1,
- MaxCombo = 244,
- TotalScore = 1707827,
- Mods = new[] { new OsuModHidden().Acronym, new OsuModHardRock().Acronym, },
- User = new User
+ Id = 6602580,
+ Username = @"waaiiru",
+ Country = new Country
{
- Id = 6602580,
- Username = @"waaiiru",
- Country = new Country
- {
- FullName = @"Spain",
- FlagName = @"ES",
- },
+ FullName = @"Spain",
+ FlagName = @"ES",
},
- }
+ },
},
- new APILegacyUserTopScoreInfo
+ new ScoreInfo
{
Position = 110000,
- Score = new APILegacyScoreInfo
+ Rank = ScoreRank.X,
+ Accuracy = 1,
+ MaxCombo = 244,
+ TotalScore = 1707827,
+ User = new User
{
- Rank = ScoreRank.X,
- Accuracy = 1,
- MaxCombo = 244,
- TotalScore = 1707827,
- User = new User
+ Id = 4608074,
+ Username = @"Skycries",
+ Country = new Country
{
- Id = 4608074,
- Username = @"Skycries",
- Country = new Country
- {
- FullName = @"Brazil",
- FlagName = @"BR",
- },
+ FullName = @"Brazil",
+ FlagName = @"BR",
},
- }
+ },
},
- new APILegacyUserTopScoreInfo
+ new ScoreInfo
{
Position = 22333,
- Score = new APILegacyScoreInfo
+ Rank = ScoreRank.S,
+ Accuracy = 1,
+ MaxCombo = 244,
+ TotalScore = 1707827,
+ User = new User
{
- Rank = ScoreRank.S,
- Accuracy = 1,
- MaxCombo = 244,
- TotalScore = 1707827,
- User = new User
+ Id = 1541390,
+ Username = @"Toukai",
+ Country = new Country
{
- Id = 1541390,
- Username = @"Toukai",
- Country = new Country
- {
- FullName = @"Canada",
- FlagName = @"CA",
- },
+ FullName = @"Canada",
+ FlagName = @"CA",
},
- }
+ },
}
};
diff --git a/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs b/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs
index 93ac69bdbf..751ccc8f15 100644
--- a/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs
+++ b/osu.Game/Graphics/Containers/OsuFocusedOverlayContainer.cs
@@ -35,7 +35,7 @@ namespace osu.Game.Graphics.Containers
[Resolved]
private PreviewTrackManager previewTrackManager { get; set; }
- protected readonly Bindable OverlayActivationMode = new Bindable(OverlayActivation.All);
+ protected readonly IBindable OverlayActivationMode = new Bindable(OverlayActivation.All);
[BackgroundDependencyLoader(true)]
private void load(AudioManager audio)
diff --git a/osu.Game/Graphics/Containers/SectionsContainer.cs b/osu.Game/Graphics/Containers/SectionsContainer.cs
index d739f56828..f32f8e0c67 100644
--- a/osu.Game/Graphics/Containers/SectionsContainer.cs
+++ b/osu.Game/Graphics/Containers/SectionsContainer.cs
@@ -26,8 +26,11 @@ namespace osu.Game.Graphics.Containers
{
if (value == expandableHeader) return;
- expandableHeader?.Expire();
+ if (expandableHeader != null)
+ RemoveInternal(expandableHeader);
+
expandableHeader = value;
+
if (value == null) return;
AddInternal(expandableHeader);
diff --git a/osu.Game/Online/API/Requests/Responses/APILegacyScores.cs b/osu.Game/Online/API/Requests/Responses/APILegacyScores.cs
index 75be9171b0..009639c1dc 100644
--- a/osu.Game/Online/API/Requests/Responses/APILegacyScores.cs
+++ b/osu.Game/Online/API/Requests/Responses/APILegacyScores.cs
@@ -3,6 +3,8 @@
using System.Collections.Generic;
using Newtonsoft.Json;
+using osu.Game.Rulesets;
+using osu.Game.Scoring;
namespace osu.Game.Online.API.Requests.Responses
{
@@ -22,5 +24,12 @@ namespace osu.Game.Online.API.Requests.Responses
[JsonProperty(@"score")]
public APILegacyScoreInfo Score;
+
+ public ScoreInfo CreateScoreInfo(RulesetStore rulesets)
+ {
+ var score = Score.CreateScoreInfo(rulesets);
+ score.Position = Position;
+ return score;
+ }
}
}
diff --git a/osu.Game/Online/API/Requests/Responses/APIUserScoreAggregate.cs b/osu.Game/Online/API/Requests/Responses/APIUserScoreAggregate.cs
index 0bba6a93bd..bcc8721400 100644
--- a/osu.Game/Online/API/Requests/Responses/APIUserScoreAggregate.cs
+++ b/osu.Game/Online/API/Requests/Responses/APIUserScoreAggregate.cs
@@ -33,6 +33,9 @@ namespace osu.Game.Online.API.Requests.Responses
[JsonProperty("user")]
public User User { get; set; }
+ [JsonProperty("position")]
+ public int? Position { get; set; }
+
public ScoreInfo CreateScoreInfo() =>
new ScoreInfo
{
@@ -40,6 +43,7 @@ namespace osu.Game.Online.API.Requests.Responses
PP = PP,
TotalScore = TotalScore,
User = User,
+ Position = Position
};
}
}
diff --git a/osu.Game/Online/Leaderboards/Leaderboard.cs b/osu.Game/Online/Leaderboards/Leaderboard.cs
index 800029ceb9..db0f835c67 100644
--- a/osu.Game/Online/Leaderboards/Leaderboard.cs
+++ b/osu.Game/Online/Leaderboards/Leaderboard.cs
@@ -27,6 +27,7 @@ namespace osu.Game.Online.Leaderboards
private readonly OsuScrollContainer scrollContainer;
private readonly Container placeholderContainer;
+ private readonly UserTopScoreContainer topScoreContainer;
private FillFlowContainer scrollFlow;
@@ -87,6 +88,20 @@ namespace osu.Game.Online.Leaderboards
}
}
+ public TScoreInfo TopScore
+ {
+ get => topScoreContainer.Score.Value;
+ set
+ {
+ topScoreContainer.Score.Value = value;
+
+ if (value == null)
+ topScoreContainer.Hide();
+ else
+ topScoreContainer.Show();
+ }
+ }
+
protected virtual FillFlowContainer CreateScoreFlow()
=> new FillFlowContainer
{
@@ -198,8 +213,9 @@ namespace osu.Game.Online.Leaderboards
{
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
+ Child = topScoreContainer = new UserTopScoreContainer(CreateDrawableTopScore)
},
- }
+ },
},
},
},
@@ -367,5 +383,7 @@ namespace osu.Game.Online.Leaderboards
}
protected abstract LeaderboardScore CreateDrawableScore(TScoreInfo model, int index);
+
+ protected abstract LeaderboardScore CreateDrawableTopScore(TScoreInfo model);
}
}
diff --git a/osu.Game/Screens/Select/Leaderboards/UserTopScoreContainer.cs b/osu.Game/Online/Leaderboards/UserTopScoreContainer.cs
similarity index 77%
rename from osu.Game/Screens/Select/Leaderboards/UserTopScoreContainer.cs
rename to osu.Game/Online/Leaderboards/UserTopScoreContainer.cs
index 8e10734454..ab4210251e 100644
--- a/osu.Game/Screens/Select/Leaderboards/UserTopScoreContainer.cs
+++ b/osu.Game/Online/Leaderboards/UserTopScoreContainer.cs
@@ -9,31 +9,29 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
-using osu.Game.Online.API.Requests.Responses;
-using osu.Game.Online.Leaderboards;
using osu.Game.Rulesets;
-using osu.Game.Scoring;
using osuTK;
-namespace osu.Game.Screens.Select.Leaderboards
+namespace osu.Game.Online.Leaderboards
{
- public class UserTopScoreContainer : VisibilityContainer
+ public class UserTopScoreContainer : VisibilityContainer
{
private const int duration = 500;
+ public Bindable Score = new Bindable();
+
private readonly Container scoreContainer;
-
- public Bindable Score = new Bindable();
-
- public Action ScoreSelected;
+ private readonly Func createScoreDelegate;
protected override bool StartHidden => true;
[Resolved]
private RulesetStore rulesets { get; set; }
- public UserTopScoreContainer()
+ public UserTopScoreContainer(Func createScoreDelegate)
{
+ this.createScoreDelegate = createScoreDelegate;
+
RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y;
@@ -72,7 +70,7 @@ namespace osu.Game.Screens.Select.Leaderboards
private CancellationTokenSource loadScoreCancellation;
- private void onScoreChanged(ValueChangedEvent score)
+ private void onScoreChanged(ValueChangedEvent score)
{
var newScore = score.NewValue;
@@ -82,12 +80,7 @@ namespace osu.Game.Screens.Select.Leaderboards
if (newScore == null)
return;
- var scoreInfo = newScore.Score.CreateScoreInfo(rulesets);
-
- LoadComponentAsync(new LeaderboardScore(scoreInfo, newScore.Position, false)
- {
- Action = () => ScoreSelected?.Invoke(scoreInfo)
- }, drawableScore =>
+ LoadComponentAsync(createScoreDelegate(newScore), drawableScore =>
{
scoreContainer.Child = drawableScore;
drawableScore.FadeInFromZero(duration, Easing.OutQuint);
diff --git a/osu.Game/Online/Multiplayer/APILeaderboard.cs b/osu.Game/Online/Multiplayer/APILeaderboard.cs
new file mode 100644
index 0000000000..65863d6e0e
--- /dev/null
+++ b/osu.Game/Online/Multiplayer/APILeaderboard.cs
@@ -0,0 +1,18 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System.Collections.Generic;
+using Newtonsoft.Json;
+using osu.Game.Online.API.Requests.Responses;
+
+namespace osu.Game.Online.Multiplayer
+{
+ public class APILeaderboard
+ {
+ [JsonProperty("leaderboard")]
+ public List Leaderboard;
+
+ [JsonProperty("user_score")]
+ public APIUserScoreAggregate UserScore;
+ }
+}
diff --git a/osu.Game/Online/Multiplayer/GetRoomScoresRequest.cs b/osu.Game/Online/Multiplayer/GetRoomLeaderboardRequest.cs
similarity index 65%
rename from osu.Game/Online/Multiplayer/GetRoomScoresRequest.cs
rename to osu.Game/Online/Multiplayer/GetRoomLeaderboardRequest.cs
index bc913030dd..37c21457bc 100644
--- a/osu.Game/Online/Multiplayer/GetRoomScoresRequest.cs
+++ b/osu.Game/Online/Multiplayer/GetRoomLeaderboardRequest.cs
@@ -1,17 +1,15 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using System.Collections.Generic;
using osu.Game.Online.API;
-using osu.Game.Online.API.Requests.Responses;
namespace osu.Game.Online.Multiplayer
{
- public class GetRoomScoresRequest : APIRequest>
+ public class GetRoomLeaderboardRequest : APIRequest
{
private readonly int roomId;
- public GetRoomScoresRequest(int roomId)
+ public GetRoomLeaderboardRequest(int roomId)
{
this.roomId = roomId;
}
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index b6b8143c54..164a40c6a5 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -88,7 +88,10 @@ namespace osu.Game
private IdleTracker idleTracker;
- public readonly Bindable OverlayActivationMode = new Bindable();
+ ///
+ /// Whether overlays should be able to be opened game-wide. Value is sourced from the current active screen.
+ ///
+ public readonly IBindable OverlayActivationMode = new Bindable();
protected OsuScreenStack ScreenStack;
@@ -695,9 +698,9 @@ namespace osu.Game
float offset = 0;
if (Settings.State.Value == Visibility.Visible)
- offset += ToolbarButton.WIDTH / 2;
+ offset += Toolbar.HEIGHT / 2;
if (notifications.State.Value == Visibility.Visible)
- offset -= ToolbarButton.WIDTH / 2;
+ offset -= Toolbar.HEIGHT / 2;
screenContainer.MoveToX(offset, SettingsPanel.TRANSITION_LENGTH, Easing.OutQuint);
}
@@ -952,9 +955,12 @@ namespace osu.Game
break;
}
+ if (current is IOsuScreen currentOsuScreen)
+ OverlayActivationMode.UnbindFrom(currentOsuScreen.OverlayActivationMode);
+
if (newScreen is IOsuScreen newOsuScreen)
{
- OverlayActivationMode.Value = newOsuScreen.InitialOverlayActivationMode;
+ OverlayActivationMode.BindTo(newOsuScreen.OverlayActivationMode);
MusicController.AllowRateAdjustments = newOsuScreen.AllowRateAdjustments;
diff --git a/osu.Game/Overlays/BeatmapListing/BeatmapListingHeader.cs b/osu.Game/Overlays/BeatmapListing/BeatmapListingHeader.cs
index 1bab200fec..b7f511271c 100644
--- a/osu.Game/Overlays/BeatmapListing/BeatmapListingHeader.cs
+++ b/osu.Game/Overlays/BeatmapListing/BeatmapListingHeader.cs
@@ -12,7 +12,8 @@ namespace osu.Game.Overlays.BeatmapListing
public BeatmapListingTitle()
{
Title = "beatmap listing";
- IconTexture = "Icons/changelog";
+ Description = "Browse for new beatmaps";
+ IconTexture = "Icons/Hexacons/beatmap";
}
}
}
diff --git a/osu.Game/Overlays/BeatmapListingOverlay.cs b/osu.Game/Overlays/BeatmapListingOverlay.cs
index 225a8a0578..144af91145 100644
--- a/osu.Game/Overlays/BeatmapListingOverlay.cs
+++ b/osu.Game/Overlays/BeatmapListingOverlay.cs
@@ -24,7 +24,7 @@ using osuTK;
namespace osu.Game.Overlays
{
- public class BeatmapListingOverlay : FullscreenOverlay
+ public class BeatmapListingOverlay : FullscreenOverlay
{
[Resolved]
private PreviewTrackManager previewTrackManager { get; set; }
@@ -38,7 +38,7 @@ namespace osu.Game.Overlays
private OverlayScrollContainer resultScrollContainer;
public BeatmapListingOverlay()
- : base(OverlayColourScheme.Blue)
+ : base(OverlayColourScheme.Blue, new BeatmapListingHeader())
{
}
@@ -65,7 +65,7 @@ namespace osu.Game.Overlays
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
- new BeatmapListingHeader(),
+ Header,
filterControl = new BeatmapListingFilterControl
{
SearchStarted = onSearchStarted,
diff --git a/osu.Game/Overlays/BeatmapSet/BeatmapSetHeader.cs b/osu.Game/Overlays/BeatmapSet/BeatmapSetHeader.cs
index 4626589d81..6511b15fc8 100644
--- a/osu.Game/Overlays/BeatmapSet/BeatmapSetHeader.cs
+++ b/osu.Game/Overlays/BeatmapSet/BeatmapSetHeader.cs
@@ -25,7 +25,7 @@ namespace osu.Game.Overlays.BeatmapSet
public BeatmapHeaderTitle()
{
Title = "beatmap info";
- IconTexture = "Icons/changelog";
+ IconTexture = "Icons/Hexacons/beatmap";
}
}
}
diff --git a/osu.Game/Overlays/BeatmapSetOverlay.cs b/osu.Game/Overlays/BeatmapSetOverlay.cs
index 3e23442023..bbec62a85a 100644
--- a/osu.Game/Overlays/BeatmapSetOverlay.cs
+++ b/osu.Game/Overlays/BeatmapSetOverlay.cs
@@ -19,12 +19,14 @@ using osuTK;
namespace osu.Game.Overlays
{
- public class BeatmapSetOverlay : FullscreenOverlay
+ public class BeatmapSetOverlay : FullscreenOverlay // we don't provide a standard header for now.
{
public const float X_PADDING = 40;
public const float Y_PADDING = 25;
public const float RIGHT_WIDTH = 275;
- protected readonly Header Header;
+
+ //todo: should be an OverlayHeader? or maybe not?
+ protected new readonly Header Header;
[Resolved]
private RulesetStore rulesets { get; set; }
@@ -37,7 +39,7 @@ namespace osu.Game.Overlays
private readonly Box background;
public BeatmapSetOverlay()
- : base(OverlayColourScheme.Blue)
+ : base(OverlayColourScheme.Blue, null)
{
OverlayScrollContainer scroll;
Info info;
diff --git a/osu.Game/Overlays/Changelog/ChangelogHeader.cs b/osu.Game/Overlays/Changelog/ChangelogHeader.cs
index 050bdea03a..bdc59297bb 100644
--- a/osu.Game/Overlays/Changelog/ChangelogHeader.cs
+++ b/osu.Game/Overlays/Changelog/ChangelogHeader.cs
@@ -115,7 +115,8 @@ namespace osu.Game.Overlays.Changelog
public ChangelogHeaderTitle()
{
Title = "changelog";
- IconTexture = "Icons/changelog";
+ Description = "Track recent dev updates in the osu! ecosystem";
+ IconTexture = "Icons/Hexacons/devtools";
}
}
}
diff --git a/osu.Game/Overlays/ChangelogOverlay.cs b/osu.Game/Overlays/ChangelogOverlay.cs
index 726be9e194..c7e9a86fa4 100644
--- a/osu.Game/Overlays/ChangelogOverlay.cs
+++ b/osu.Game/Overlays/ChangelogOverlay.cs
@@ -21,12 +21,10 @@ using osu.Game.Overlays.Changelog;
namespace osu.Game.Overlays
{
- public class ChangelogOverlay : FullscreenOverlay
+ public class ChangelogOverlay : FullscreenOverlay
{
public readonly Bindable Current = new Bindable();
- protected ChangelogHeader Header;
-
private Container content;
private SampleChannel sampleBack;
@@ -36,7 +34,7 @@ namespace osu.Game.Overlays
protected List Streams;
public ChangelogOverlay()
- : base(OverlayColourScheme.Purple)
+ : base(OverlayColourScheme.Purple, new ChangelogHeader())
{
}
@@ -61,10 +59,11 @@ namespace osu.Game.Overlays
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
- Header = new ChangelogHeader
+ Header.With(h =>
{
- ListingSelected = ShowListing,
- },
+ h.ListingSelected = ShowListing;
+ h.Build.BindTarget = Current;
+ }),
content = new Container
{
RelativeSizeAxes = Axes.X,
@@ -77,8 +76,6 @@ namespace osu.Game.Overlays
sampleBack = audio.Samples.Get(@"UI/generic-select-soft");
- Header.Build.BindTo(Current);
-
Current.BindValueChanged(e =>
{
if (e.NewValue != null)
diff --git a/osu.Game/Overlays/Chat/Selection/ChannelSelectionOverlay.cs b/osu.Game/Overlays/Chat/Selection/ChannelSelectionOverlay.cs
index b46ca6b040..be9ecc6746 100644
--- a/osu.Game/Overlays/Chat/Selection/ChannelSelectionOverlay.cs
+++ b/osu.Game/Overlays/Chat/Selection/ChannelSelectionOverlay.cs
@@ -22,7 +22,7 @@ namespace osu.Game.Overlays.Chat.Selection
{
public class ChannelSelectionOverlay : WaveOverlayContainer
{
- public const float WIDTH_PADDING = 170;
+ public new const float WIDTH_PADDING = 170;
private const float transition_duration = 500;
diff --git a/osu.Game/Overlays/ChatOverlay.cs b/osu.Game/Overlays/ChatOverlay.cs
index 5ba55f6d45..bcc2227be8 100644
--- a/osu.Game/Overlays/ChatOverlay.cs
+++ b/osu.Game/Overlays/ChatOverlay.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System.Collections.Generic;
+using System.Collections.Specialized;
using System.Linq;
using osuTK;
using osuTK.Graphics;
@@ -25,8 +26,12 @@ using osu.Framework.Graphics.Sprites;
namespace osu.Game.Overlays
{
- public class ChatOverlay : OsuFocusedOverlayContainer
+ public class ChatOverlay : OsuFocusedOverlayContainer, INamedOverlayComponent
{
+ public string IconTexture => "Icons/Hexacons/messaging";
+ public string Title => "chat";
+ public string Description => "Join the real-time discussion";
+
private const float textbox_height = 60;
private const float channel_selection_min_height = 0.3f;
@@ -218,14 +223,13 @@ namespace osu.Game.Overlays
Schedule(() =>
{
// TODO: consider scheduling bindable callbacks to not perform when overlay is not present.
- channelManager.JoinedChannels.ItemsAdded += onChannelAddedToJoinedChannels;
- channelManager.JoinedChannels.ItemsRemoved += onChannelRemovedFromJoinedChannels;
+ channelManager.JoinedChannels.CollectionChanged += joinedChannelsChanged;
+
foreach (Channel channel in channelManager.JoinedChannels)
ChannelTabControl.AddChannel(channel);
- channelManager.AvailableChannels.ItemsAdded += availableChannelsChanged;
- channelManager.AvailableChannels.ItemsRemoved += availableChannelsChanged;
- ChannelSelectionOverlay.UpdateAvailableChannels(channelManager.AvailableChannels);
+ channelManager.AvailableChannels.CollectionChanged += availableChannelsChanged;
+ availableChannelsChanged(null, null);
currentChannel = channelManager.CurrentChannel.GetBoundCopy();
currentChannel.BindValueChanged(currentChannelChanged, true);
@@ -384,34 +388,41 @@ namespace osu.Game.Overlays
base.PopOut();
}
- private void onChannelAddedToJoinedChannels(IEnumerable channels)
+ private void joinedChannelsChanged(object sender, NotifyCollectionChangedEventArgs args)
{
- foreach (Channel channel in channels)
- ChannelTabControl.AddChannel(channel);
- }
-
- private void onChannelRemovedFromJoinedChannels(IEnumerable channels)
- {
- foreach (Channel channel in channels)
+ switch (args.Action)
{
- ChannelTabControl.RemoveChannel(channel);
+ case NotifyCollectionChangedAction.Add:
+ foreach (Channel channel in args.NewItems.Cast())
+ ChannelTabControl.AddChannel(channel);
+ break;
- var loaded = loadedChannels.Find(c => c.Channel == channel);
+ case NotifyCollectionChangedAction.Remove:
+ foreach (Channel channel in args.OldItems.Cast())
+ {
+ ChannelTabControl.RemoveChannel(channel);
- if (loaded != null)
- {
- loadedChannels.Remove(loaded);
+ var loaded = loadedChannels.Find(c => c.Channel == channel);
- // Because the container is only cleared in the async load callback of a new channel, it is forcefully cleared
- // to ensure that the previous channel doesn't get updated after it's disposed
- currentChannelContainer.Remove(loaded);
- loaded.Dispose();
- }
+ if (loaded != null)
+ {
+ loadedChannels.Remove(loaded);
+
+ // Because the container is only cleared in the async load callback of a new channel, it is forcefully cleared
+ // to ensure that the previous channel doesn't get updated after it's disposed
+ currentChannelContainer.Remove(loaded);
+ loaded.Dispose();
+ }
+ }
+
+ break;
}
}
- private void availableChannelsChanged(IEnumerable channels)
- => ChannelSelectionOverlay.UpdateAvailableChannels(channelManager.AvailableChannels);
+ private void availableChannelsChanged(object sender, NotifyCollectionChangedEventArgs args)
+ {
+ ChannelSelectionOverlay.UpdateAvailableChannels(channelManager.AvailableChannels);
+ }
protected override void Dispose(bool isDisposing)
{
@@ -420,10 +431,8 @@ namespace osu.Game.Overlays
if (channelManager != null)
{
channelManager.CurrentChannel.ValueChanged -= currentChannelChanged;
- channelManager.JoinedChannels.ItemsAdded -= onChannelAddedToJoinedChannels;
- channelManager.JoinedChannels.ItemsRemoved -= onChannelRemovedFromJoinedChannels;
- channelManager.AvailableChannels.ItemsAdded -= availableChannelsChanged;
- channelManager.AvailableChannels.ItemsRemoved -= availableChannelsChanged;
+ channelManager.JoinedChannels.CollectionChanged -= joinedChannelsChanged;
+ channelManager.AvailableChannels.CollectionChanged -= availableChannelsChanged;
}
}
diff --git a/osu.Game/Overlays/Dashboard/DashboardOverlayHeader.cs b/osu.Game/Overlays/Dashboard/DashboardOverlayHeader.cs
index 9ee679a866..a964d84c4f 100644
--- a/osu.Game/Overlays/Dashboard/DashboardOverlayHeader.cs
+++ b/osu.Game/Overlays/Dashboard/DashboardOverlayHeader.cs
@@ -12,7 +12,8 @@ namespace osu.Game.Overlays.Dashboard
public DashboardTitle()
{
Title = "dashboard";
- IconTexture = "Icons/changelog";
+ Description = "View your friends and other information";
+ IconTexture = "Icons/Hexacons/social";
}
}
}
diff --git a/osu.Game/Overlays/DashboardOverlay.cs b/osu.Game/Overlays/DashboardOverlay.cs
index e3a4b0e152..8135b83a03 100644
--- a/osu.Game/Overlays/DashboardOverlay.cs
+++ b/osu.Game/Overlays/DashboardOverlay.cs
@@ -15,17 +15,21 @@ using osu.Game.Overlays.Dashboard.Friends;
namespace osu.Game.Overlays
{
- public class DashboardOverlay : FullscreenOverlay
+ public class DashboardOverlay : FullscreenOverlay
{
private CancellationTokenSource cancellationToken;
private Container content;
- private DashboardOverlayHeader header;
private LoadingLayer loading;
private OverlayScrollContainer scrollFlow;
public DashboardOverlay()
- : base(OverlayColourScheme.Purple)
+ : base(OverlayColourScheme.Purple, new DashboardOverlayHeader
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ Depth = -float.MaxValue
+ })
{
}
@@ -50,12 +54,7 @@ namespace osu.Game.Overlays
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
- header = new DashboardOverlayHeader
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Depth = -float.MaxValue
- },
+ Header,
content = new Container
{
RelativeSizeAxes = Axes.X,
@@ -72,7 +71,7 @@ namespace osu.Game.Overlays
{
base.LoadComplete();
- header.Current.BindValueChanged(onTabChanged);
+ Header.Current.BindValueChanged(onTabChanged);
}
private bool displayUpdateRequired = true;
@@ -84,7 +83,7 @@ namespace osu.Game.Overlays
// We don't want to create a new display on every call, only when exiting from fully closed state.
if (displayUpdateRequired)
{
- header.Current.TriggerChange();
+ Header.Current.TriggerChange();
displayUpdateRequired = false;
}
}
@@ -136,7 +135,7 @@ namespace osu.Game.Overlays
if (State.Value == Visibility.Hidden)
return;
- header.Current.TriggerChange();
+ Header.Current.TriggerChange();
}
protected override void Dispose(bool isDisposing)
diff --git a/osu.Game/Overlays/FullscreenOverlay.cs b/osu.Game/Overlays/FullscreenOverlay.cs
index 3464ce6086..bd6b07c65f 100644
--- a/osu.Game/Overlays/FullscreenOverlay.cs
+++ b/osu.Game/Overlays/FullscreenOverlay.cs
@@ -12,16 +12,25 @@ using osuTK.Graphics;
namespace osu.Game.Overlays
{
- public abstract class FullscreenOverlay : WaveOverlayContainer, IOnlineComponent
+ public abstract class FullscreenOverlay : WaveOverlayContainer, IOnlineComponent, INamedOverlayComponent
+ where T : OverlayHeader
{
+ public virtual string IconTexture => Header?.Title.IconTexture ?? string.Empty;
+ public virtual string Title => Header?.Title.Title ?? string.Empty;
+ public virtual string Description => Header?.Title.Description ?? string.Empty;
+
+ public T Header { get; }
+
[Resolved]
protected IAPIProvider API { get; private set; }
[Cached]
protected readonly OverlayColourProvider ColourProvider;
- protected FullscreenOverlay(OverlayColourScheme colourScheme)
+ protected FullscreenOverlay(OverlayColourScheme colourScheme, T header)
{
+ Header = header;
+
ColourProvider = new OverlayColourProvider(colourScheme);
RelativeSizeAxes = Axes.Both;
diff --git a/osu.Game/Overlays/INamedOverlayComponent.cs b/osu.Game/Overlays/INamedOverlayComponent.cs
new file mode 100644
index 0000000000..38fb8679a0
--- /dev/null
+++ b/osu.Game/Overlays/INamedOverlayComponent.cs
@@ -0,0 +1,14 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+namespace osu.Game.Overlays
+{
+ public interface INamedOverlayComponent
+ {
+ string IconTexture { get; }
+
+ string Title { get; }
+
+ string Description { get; }
+ }
+}
diff --git a/osu.Game/Overlays/News/NewsHeader.cs b/osu.Game/Overlays/News/NewsHeader.cs
index ddada2bdaf..38ac519387 100644
--- a/osu.Game/Overlays/News/NewsHeader.cs
+++ b/osu.Game/Overlays/News/NewsHeader.cs
@@ -57,7 +57,8 @@ namespace osu.Game.Overlays.News
public NewsHeaderTitle()
{
Title = "news";
- IconTexture = "Icons/news";
+ Description = "Get up-to-date on community happenings";
+ IconTexture = "Icons/Hexacons/news";
}
}
}
diff --git a/osu.Game/Overlays/NewsOverlay.cs b/osu.Game/Overlays/NewsOverlay.cs
index 09fb445b1f..c8c1db012f 100644
--- a/osu.Game/Overlays/NewsOverlay.cs
+++ b/osu.Game/Overlays/NewsOverlay.cs
@@ -13,17 +13,16 @@ using osu.Game.Overlays.News.Displays;
namespace osu.Game.Overlays
{
- public class NewsOverlay : FullscreenOverlay
+ public class NewsOverlay : FullscreenOverlay
{
private readonly Bindable article = new Bindable(null);
private Container content;
private LoadingLayer loading;
- private NewsHeader header;
private OverlayScrollContainer scrollFlow;
public NewsOverlay()
- : base(OverlayColourScheme.Purple)
+ : base(OverlayColourScheme.Purple, new NewsHeader())
{
}
@@ -48,10 +47,10 @@ namespace osu.Game.Overlays
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
- header = new NewsHeader
+ Header.With(h =>
{
- ShowFrontPage = ShowFrontPage
- },
+ h.ShowFrontPage = ShowFrontPage;
+ }),
content = new Container
{
RelativeSizeAxes = Axes.X,
@@ -112,12 +111,12 @@ namespace osu.Game.Overlays
if (e.NewValue == null)
{
- header.SetFrontPage();
+ Header.SetFrontPage();
LoadDisplay(new FrontPageDisplay());
return;
}
- header.SetArticle(e.NewValue);
+ Header.SetArticle(e.NewValue);
LoadDisplay(Empty());
}
diff --git a/osu.Game/Overlays/NotificationOverlay.cs b/osu.Game/Overlays/NotificationOverlay.cs
index 41160d10ec..b7d916c48f 100644
--- a/osu.Game/Overlays/NotificationOverlay.cs
+++ b/osu.Game/Overlays/NotificationOverlay.cs
@@ -16,8 +16,12 @@ using osu.Framework.Threading;
namespace osu.Game.Overlays
{
- public class NotificationOverlay : OsuFocusedOverlayContainer
+ public class NotificationOverlay : OsuFocusedOverlayContainer, INamedOverlayComponent
{
+ public string IconTexture => "Icons/Hexacons/notification";
+ public string Title => "Notifications";
+ public string Description => "Waiting for 'ya";
+
private const float width = 320;
public const float TRANSITION_LENGTH = 600;
diff --git a/osu.Game/Overlays/NowPlayingOverlay.cs b/osu.Game/Overlays/NowPlayingOverlay.cs
index af692486b7..d1df1fa936 100644
--- a/osu.Game/Overlays/NowPlayingOverlay.cs
+++ b/osu.Game/Overlays/NowPlayingOverlay.cs
@@ -25,8 +25,12 @@ using osuTK.Graphics;
namespace osu.Game.Overlays
{
- public class NowPlayingOverlay : OsuFocusedOverlayContainer
+ public class NowPlayingOverlay : OsuFocusedOverlayContainer, INamedOverlayComponent
{
+ public string IconTexture => "Icons/Hexacons/music";
+ public string Title => "now playing";
+ public string Description => "Manage the currently playing track";
+
private const float player_height = 130;
private const float transition_length = 800;
private const float progress_height = 10;
diff --git a/osu.Game/Overlays/OverlayHeader.cs b/osu.Game/Overlays/OverlayHeader.cs
index cc7f798c4a..fed1e57686 100644
--- a/osu.Game/Overlays/OverlayHeader.cs
+++ b/osu.Game/Overlays/OverlayHeader.cs
@@ -12,6 +12,8 @@ namespace osu.Game.Overlays
{
public abstract class OverlayHeader : Container
{
+ public OverlayTitle Title { get; }
+
private float contentSidePadding;
///
@@ -73,7 +75,7 @@ namespace osu.Game.Overlays
AutoSizeAxes = Axes.Y,
Children = new[]
{
- CreateTitle().With(title =>
+ Title = CreateTitle().With(title =>
{
title.Anchor = Anchor.CentreLeft;
title.Origin = Anchor.CentreLeft;
diff --git a/osu.Game/Overlays/OverlayScrollContainer.cs b/osu.Game/Overlays/OverlayScrollContainer.cs
index e7415e6f74..b67d5db1a4 100644
--- a/osu.Game/Overlays/OverlayScrollContainer.cs
+++ b/osu.Game/Overlays/OverlayScrollContainer.cs
@@ -17,7 +17,7 @@ using osuTK.Graphics;
namespace osu.Game.Overlays
{
///
- /// which provides . Mostly used in .
+ /// which provides . Mostly used in .
///
public class OverlayScrollContainer : OsuScrollContainer
{
diff --git a/osu.Game/Overlays/OverlayTitle.cs b/osu.Game/Overlays/OverlayTitle.cs
index 1c9567428c..17eeece1f8 100644
--- a/osu.Game/Overlays/OverlayTitle.cs
+++ b/osu.Game/Overlays/OverlayTitle.cs
@@ -12,19 +12,27 @@ using osuTK;
namespace osu.Game.Overlays
{
- public abstract class OverlayTitle : CompositeDrawable
+ public abstract class OverlayTitle : CompositeDrawable, INamedOverlayComponent
{
- private readonly OsuSpriteText title;
+ private readonly OsuSpriteText titleText;
private readonly Container icon;
- protected string Title
+ private string title;
+
+ public string Title
{
- set => title.Text = value;
+ get => title;
+ protected set => titleText.Text = title = value;
}
- protected string IconTexture
+ public string Description { get; protected set; }
+
+ private string iconTexture;
+
+ public string IconTexture
{
- set => icon.Child = new OverlayTitleIcon(value);
+ get => iconTexture;
+ protected set => icon.Child = new OverlayTitleIcon(iconTexture = value);
}
protected OverlayTitle()
@@ -45,7 +53,7 @@ namespace osu.Game.Overlays
Margin = new MarginPadding { Horizontal = 5 }, // compensates for osu-web sprites having around 5px of whitespace on each side
Size = new Vector2(30)
},
- title = new OsuSpriteText
+ titleText = new OsuSpriteText
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
diff --git a/osu.Game/Overlays/OverlayView.cs b/osu.Game/Overlays/OverlayView.cs
index 3e2c54c726..312271316a 100644
--- a/osu.Game/Overlays/OverlayView.cs
+++ b/osu.Game/Overlays/OverlayView.cs
@@ -9,7 +9,7 @@ using osu.Game.Online.API;
namespace osu.Game.Overlays
{
///
- /// A subview containing online content, to be displayed inside a .
+ /// A subview containing online content, to be displayed inside a .
///
///
/// Automatically performs a data fetch on load.
diff --git a/osu.Game/Overlays/Profile/ProfileHeader.cs b/osu.Game/Overlays/Profile/ProfileHeader.cs
index 55474c9d3e..c947ef0781 100644
--- a/osu.Game/Overlays/Profile/ProfileHeader.cs
+++ b/osu.Game/Overlays/Profile/ProfileHeader.cs
@@ -97,7 +97,7 @@ namespace osu.Game.Overlays.Profile
public ProfileHeaderTitle()
{
Title = "player info";
- IconTexture = "Icons/profile";
+ IconTexture = "Icons/Hexacons/profile";
}
}
diff --git a/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs b/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs
index e30c6f07a8..7039ab8214 100644
--- a/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs
+++ b/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs
@@ -30,7 +30,8 @@ namespace osu.Game.Overlays.Rankings
public RankingsTitle()
{
Title = "ranking";
- IconTexture = "Icons/rankings";
+ Description = "Find out who's the best right now";
+ IconTexture = "Icons/Hexacons/rankings";
}
}
}
diff --git a/osu.Game/Overlays/RankingsOverlay.cs b/osu.Game/Overlays/RankingsOverlay.cs
index 7b200d4226..ae6d49960a 100644
--- a/osu.Game/Overlays/RankingsOverlay.cs
+++ b/osu.Game/Overlays/RankingsOverlay.cs
@@ -17,17 +17,16 @@ using osu.Game.Overlays.Rankings.Tables;
namespace osu.Game.Overlays
{
- public class RankingsOverlay : FullscreenOverlay
+ public class RankingsOverlay : FullscreenOverlay
{
- protected Bindable Country => header.Country;
+ protected Bindable Country => Header.Country;
- protected Bindable Scope => header.Current;
+ protected Bindable Scope => Header.Current;
private readonly OverlayScrollContainer scrollFlow;
private readonly Container contentContainer;
private readonly LoadingLayer loading;
private readonly Box background;
- private readonly RankingsOverlayHeader header;
private APIRequest lastRequest;
private CancellationTokenSource cancellationToken;
@@ -36,7 +35,12 @@ namespace osu.Game.Overlays
private IAPIProvider api { get; set; }
public RankingsOverlay()
- : base(OverlayColourScheme.Green)
+ : base(OverlayColourScheme.Green, new RankingsOverlayHeader
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ Depth = -float.MaxValue
+ })
{
Children = new Drawable[]
{
@@ -55,12 +59,7 @@ namespace osu.Game.Overlays
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
- header = new RankingsOverlayHeader
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Depth = -float.MaxValue
- },
+ Header,
new Container
{
RelativeSizeAxes = Axes.X,
@@ -97,7 +96,7 @@ namespace osu.Game.Overlays
{
base.LoadComplete();
- header.Ruleset.BindTo(ruleset);
+ Header.Ruleset.BindTo(ruleset);
Country.BindValueChanged(_ =>
{
diff --git a/osu.Game/Overlays/SearchableList/SearchableListFilterControl.cs b/osu.Game/Overlays/SearchableList/SearchableListFilterControl.cs
index e0163b5b0c..1990674aa9 100644
--- a/osu.Game/Overlays/SearchableList/SearchableListFilterControl.cs
+++ b/osu.Game/Overlays/SearchableList/SearchableListFilterControl.cs
@@ -36,7 +36,7 @@ namespace osu.Game.Overlays.SearchableList
///
/// The amount of padding added to content (does not affect background or tab control strip).
///
- protected virtual float ContentHorizontalPadding => SearchableListOverlay.WIDTH_PADDING;
+ protected virtual float ContentHorizontalPadding => WaveOverlayContainer.WIDTH_PADDING;
protected SearchableListFilterControl()
{
diff --git a/osu.Game/Overlays/SearchableList/SearchableListHeader.cs b/osu.Game/Overlays/SearchableList/SearchableListHeader.cs
deleted file mode 100644
index 66fedf0a56..0000000000
--- a/osu.Game/Overlays/SearchableList/SearchableListHeader.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using System;
-using osuTK;
-using osuTK.Graphics;
-using osu.Framework.Allocation;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Game.Graphics;
-using osu.Framework.Graphics.Shapes;
-using osu.Framework.Graphics.Sprites;
-
-namespace osu.Game.Overlays.SearchableList
-{
- public abstract class SearchableListHeader : Container
- where T : struct, Enum
- {
- public readonly HeaderTabControl Tabs;
-
- protected abstract Color4 BackgroundColour { get; }
- protected abstract T DefaultTab { get; }
- protected abstract Drawable CreateHeaderText();
- protected abstract IconUsage Icon { get; }
-
- protected SearchableListHeader()
- {
- RelativeSizeAxes = Axes.X;
- Height = 90;
-
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = BackgroundColour,
- },
- new Container
- {
- RelativeSizeAxes = Axes.Both,
- Padding = new MarginPadding { Left = SearchableListOverlay.WIDTH_PADDING, Right = SearchableListOverlay.WIDTH_PADDING },
- Children = new Drawable[]
- {
- new FillFlowContainer
- {
- Anchor = Anchor.CentreLeft,
- Origin = Anchor.BottomLeft,
- Position = new Vector2(-35f, 5f),
- AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Horizontal,
- Spacing = new Vector2(10f, 0f),
- Children = new[]
- {
- new SpriteIcon
- {
- Size = new Vector2(25),
- Icon = Icon,
- },
- CreateHeaderText(),
- },
- },
- Tabs = new HeaderTabControl
- {
- Anchor = Anchor.BottomLeft,
- Origin = Anchor.BottomLeft,
- RelativeSizeAxes = Axes.X,
- },
- },
- },
- };
-
- Tabs.Current.Value = DefaultTab;
- Tabs.Current.TriggerChange();
- }
-
- [BackgroundDependencyLoader]
- private void load(OsuColour colours)
- {
- Tabs.StripColour = colours.Green;
- }
- }
-}
diff --git a/osu.Game/Overlays/SearchableList/SearchableListOverlay.cs b/osu.Game/Overlays/SearchableList/SearchableListOverlay.cs
deleted file mode 100644
index 4ab2de06b6..0000000000
--- a/osu.Game/Overlays/SearchableList/SearchableListOverlay.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using System;
-using osuTK.Graphics;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.Events;
-using osu.Game.Graphics.Backgrounds;
-using osu.Game.Graphics.Cursor;
-
-namespace osu.Game.Overlays.SearchableList
-{
- public abstract class SearchableListOverlay : FullscreenOverlay
- {
- public const float WIDTH_PADDING = 80;
-
- protected SearchableListOverlay(OverlayColourScheme colourScheme)
- : base(colourScheme)
- {
- }
- }
-
- public abstract class SearchableListOverlay : SearchableListOverlay
- where THeader : struct, Enum
- where TTab : struct, Enum
- where TCategory : struct, Enum
- {
- private readonly Container scrollContainer;
-
- protected readonly SearchableListHeader Header;
- protected readonly SearchableListFilterControl Filter;
- protected readonly FillFlowContainer ScrollFlow;
-
- protected abstract Color4 BackgroundColour { get; }
- protected abstract Color4 TrianglesColourLight { get; }
- protected abstract Color4 TrianglesColourDark { get; }
- protected abstract SearchableListHeader CreateHeader();
- protected abstract SearchableListFilterControl CreateFilterControl();
-
- protected SearchableListOverlay(OverlayColourScheme colourScheme)
- : base(colourScheme)
- {
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = BackgroundColour,
- },
- new Container
- {
- RelativeSizeAxes = Axes.Both,
- Masking = true,
- Children = new[]
- {
- new Triangles
- {
- RelativeSizeAxes = Axes.Both,
- TriangleScale = 5,
- ColourLight = TrianglesColourLight,
- ColourDark = TrianglesColourDark,
- },
- },
- },
- scrollContainer = new Container
- {
- RelativeSizeAxes = Axes.Both,
- Child = new OsuContextMenuContainer
- {
- RelativeSizeAxes = Axes.Both,
- Masking = true,
- Child = new OverlayScrollContainer
- {
- RelativeSizeAxes = Axes.Both,
- ScrollbarVisible = false,
- Child = ScrollFlow = new FillFlowContainer
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Padding = new MarginPadding { Horizontal = 10, Bottom = 50 },
- Direction = FillDirection.Vertical,
- },
- },
- },
- },
- new FillFlowContainer
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Direction = FillDirection.Vertical,
- Children = new Drawable[]
- {
- Header = CreateHeader(),
- Filter = CreateFilterControl(),
- },
- },
- };
- }
-
- protected override void Update()
- {
- base.Update();
-
- scrollContainer.Padding = new MarginPadding { Top = Header.Height + Filter.Height };
- }
-
- protected override void OnFocus(FocusEvent e)
- {
- Filter.Search.TakeFocus();
- }
-
- protected override void PopIn()
- {
- base.PopIn();
-
- Filter.Search.HoldFocus = true;
- }
-
- protected override void PopOut()
- {
- base.PopOut();
-
- Filter.Search.HoldFocus = false;
- }
- }
-}
diff --git a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
index 00b7643332..4312b319c0 100644
--- a/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Graphics/LayoutSettings.cs
@@ -163,8 +163,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
scalingSettings.ForEach(s => s.TransferValueOnCommit = mode.NewValue == ScalingMode.Everything);
}, true);
- windowModes.ItemsAdded += _ => windowModesChanged();
- windowModes.ItemsRemoved += _ => windowModesChanged();
+ windowModes.CollectionChanged += (sender, args) => windowModesChanged();
windowModesChanged();
}
diff --git a/osu.Game/Overlays/Settings/Sidebar.cs b/osu.Game/Overlays/Settings/Sidebar.cs
index 358f94b659..031ecaae46 100644
--- a/osu.Game/Overlays/Settings/Sidebar.cs
+++ b/osu.Game/Overlays/Settings/Sidebar.cs
@@ -4,22 +4,21 @@
using System;
using System.Linq;
using osu.Framework;
-using osuTK;
-using osuTK.Graphics;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Events;
using osu.Framework.Threading;
using osu.Game.Graphics.Containers;
-using osu.Game.Overlays.Toolbar;
+using osuTK;
+using osuTK.Graphics;
namespace osu.Game.Overlays.Settings
{
public class Sidebar : Container, IStateful
{
private readonly FillFlowContainer content;
- public const float DEFAULT_WIDTH = ToolbarButton.WIDTH;
+ public const float DEFAULT_WIDTH = Toolbar.Toolbar.HEIGHT * 1.4f;
public const int EXPANDED_WIDTH = 200;
public event Action StateChanged;
diff --git a/osu.Game/Overlays/SettingsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs
index bb84de5d3a..0532a031f3 100644
--- a/osu.Game/Overlays/SettingsOverlay.cs
+++ b/osu.Game/Overlays/SettingsOverlay.cs
@@ -13,8 +13,12 @@ using osu.Framework.Bindables;
namespace osu.Game.Overlays
{
- public class SettingsOverlay : SettingsPanel
+ public class SettingsOverlay : SettingsPanel, INamedOverlayComponent
{
+ public string IconTexture => "Icons/Hexacons/settings";
+ public string Title => "settings";
+ public string Description => "Change the way osu! behaves";
+
protected override IEnumerable CreateSections() => new SettingsSection[]
{
new GeneralSection(),
@@ -30,7 +34,7 @@ namespace osu.Game.Overlays
private readonly List subPanels = new List();
- protected override Drawable CreateHeader() => new SettingsHeader("settings", "Change the way osu! behaves");
+ protected override Drawable CreateHeader() => new SettingsHeader(Title, Description);
protected override Drawable CreateFooter() => new SettingsFooter();
public SettingsOverlay()
diff --git a/osu.Game/Overlays/Toolbar/Toolbar.cs b/osu.Game/Overlays/Toolbar/Toolbar.cs
index 3bf9e85428..393e349bd0 100644
--- a/osu.Game/Overlays/Toolbar/Toolbar.cs
+++ b/osu.Game/Overlays/Toolbar/Toolbar.cs
@@ -28,7 +28,7 @@ namespace osu.Game.Overlays.Toolbar
private const double transition_time = 500;
- protected readonly Bindable OverlayActivationMode = new Bindable(OverlayActivation.All);
+ protected readonly IBindable OverlayActivationMode = new Bindable(OverlayActivation.All);
// Toolbar components like RulesetSelector should receive keyboard input events even when the toolbar is hidden.
public override bool PropagateNonPositionalInputSubTree => true;
diff --git a/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs b/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs
index cde305fffd..0363873326 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Game.Graphics;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
@@ -11,10 +10,6 @@ namespace osu.Game.Overlays.Toolbar
{
public ToolbarBeatmapListingButton()
{
- SetIcon(OsuIcon.ChevronDownCircle);
- TooltipMain = "Beatmap listing";
- TooltipSub = "Browse for new beatmaps";
-
Hotkey = GlobalAction.ToggleDirect;
}
diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
index 0afc6642b2..49b9c62d85 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
@@ -9,6 +9,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
+using osu.Framework.Graphics.Textures;
using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
using osu.Game.Graphics;
@@ -25,8 +26,6 @@ namespace osu.Game.Overlays.Toolbar
{
public abstract class ToolbarButton : OsuClickableContainer, IKeyBindingHandler
{
- public const float WIDTH = Toolbar.HEIGHT * 1.4f;
-
protected GlobalAction? Hotkey { get; set; }
public void SetIcon(Drawable icon)
@@ -35,16 +34,14 @@ namespace osu.Game.Overlays.Toolbar
IconContainer.Show();
}
- public void SetIcon(IconUsage icon) => SetIcon(new SpriteIcon
- {
- Size = new Vector2(20),
- Icon = icon
- });
+ [Resolved]
+ private TextureStore textures { get; set; }
- public IconUsage Icon
- {
- set => SetIcon(value);
- }
+ public void SetIcon(string texture) =>
+ SetIcon(new Sprite
+ {
+ Texture = textures.Get(texture),
+ });
public string Text
{
@@ -82,7 +79,7 @@ namespace osu.Game.Overlays.Toolbar
protected ToolbarButton()
: base(HoverSampleSet.Loud)
{
- Width = WIDTH;
+ Width = Toolbar.HEIGHT;
RelativeSizeAxes = Axes.Y;
Children = new Drawable[]
@@ -116,7 +113,7 @@ namespace osu.Game.Overlays.Toolbar
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
- Size = new Vector2(20),
+ Size = new Vector2(26),
Alpha = 0,
},
DrawableText = new OsuSpriteText
diff --git a/osu.Game/Overlays/Toolbar/ToolbarChangelogButton.cs b/osu.Game/Overlays/Toolbar/ToolbarChangelogButton.cs
index c88b418853..23f8b141b2 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarChangelogButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarChangelogButton.cs
@@ -2,19 +2,11 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Framework.Graphics.Sprites;
namespace osu.Game.Overlays.Toolbar
{
public class ToolbarChangelogButton : ToolbarOverlayToggleButton
{
- public ToolbarChangelogButton()
- {
- SetIcon(FontAwesome.Solid.Bullhorn);
- TooltipMain = "Changelog";
- TooltipSub = "Track recent dev updates in the osu! ecosystem";
- }
-
[BackgroundDependencyLoader(true)]
private void load(ChangelogOverlay changelog)
{
diff --git a/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs b/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs
index dee4be0c1f..f9a66ae7bb 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Framework.Graphics.Sprites;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
@@ -11,10 +10,6 @@ namespace osu.Game.Overlays.Toolbar
{
public ToolbarChatButton()
{
- SetIcon(FontAwesome.Solid.Comments);
- TooltipMain = "Chat";
- TooltipSub = "Join the real-time discussion";
-
Hotkey = GlobalAction.ToggleChat;
}
diff --git a/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs b/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs
index 4845c9a99f..6b2c24c0f3 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs
@@ -1,7 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using osu.Framework.Graphics.Sprites;
+using osu.Framework.Allocation;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
@@ -10,11 +10,16 @@ namespace osu.Game.Overlays.Toolbar
{
public ToolbarHomeButton()
{
- Icon = FontAwesome.Solid.Home;
+ Width *= 1.4f;
+ Hotkey = GlobalAction.Home;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load()
+ {
TooltipMain = "Home";
TooltipSub = "Return to the main menu";
-
- Hotkey = GlobalAction.Home;
+ SetIcon("Icons/Hexacons/home");
}
}
}
diff --git a/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs b/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs
index f9aa2de497..0f5e8e5456 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs
@@ -3,7 +3,6 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
-using osu.Framework.Graphics.Sprites;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
@@ -14,10 +13,6 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarMusicButton()
{
- Icon = FontAwesome.Solid.Music;
- TooltipMain = "Now playing";
- TooltipSub = "Manage the currently playing track";
-
Hotkey = GlobalAction.ToggleNowPlaying;
}
diff --git a/osu.Game/Overlays/Toolbar/ToolbarNewsButton.cs b/osu.Game/Overlays/Toolbar/ToolbarNewsButton.cs
index 106c67a041..0ba2935c80 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarNewsButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarNewsButton.cs
@@ -2,19 +2,11 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Framework.Graphics.Sprites;
namespace osu.Game.Overlays.Toolbar
{
public class ToolbarNewsButton : ToolbarOverlayToggleButton
{
- public ToolbarNewsButton()
- {
- Icon = FontAwesome.Solid.Newspaper;
- TooltipMain = "News";
- TooltipSub = "Get up-to-date on community happenings";
- }
-
[BackgroundDependencyLoader(true)]
private void load(NewsOverlay news)
{
diff --git a/osu.Game/Overlays/Toolbar/ToolbarNotificationButton.cs b/osu.Game/Overlays/Toolbar/ToolbarNotificationButton.cs
index a699fd907f..79d0fc74c1 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarNotificationButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarNotificationButton.cs
@@ -6,7 +6,6 @@ using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Input.Bindings;
@@ -25,10 +24,6 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarNotificationButton()
{
- Icon = FontAwesome.Solid.Bars;
- TooltipMain = "Notifications";
- TooltipSub = "Waiting for 'ya";
-
Hotkey = GlobalAction.ToggleNotifications;
Add(countDisplay = new CountCircle
diff --git a/osu.Game/Overlays/Toolbar/ToolbarOverlayToggleButton.cs b/osu.Game/Overlays/Toolbar/ToolbarOverlayToggleButton.cs
index 36387bb00d..0dea71cc08 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarOverlayToggleButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarOverlayToggleButton.cs
@@ -32,6 +32,13 @@ namespace osu.Game.Overlays.Toolbar
Action = stateContainer.ToggleVisibility;
overlayState.BindTo(stateContainer.State);
}
+
+ if (stateContainer is INamedOverlayComponent named)
+ {
+ TooltipMain = named.Title;
+ TooltipSub = named.Description;
+ SetIcon(named.IconTexture);
+ }
}
}
diff --git a/osu.Game/Overlays/Toolbar/ToolbarRankingsButton.cs b/osu.Game/Overlays/Toolbar/ToolbarRankingsButton.cs
index c026ce99fe..22a01bcdb5 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarRankingsButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarRankingsButton.cs
@@ -2,19 +2,11 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Framework.Graphics.Sprites;
namespace osu.Game.Overlays.Toolbar
{
public class ToolbarRankingsButton : ToolbarOverlayToggleButton
{
- public ToolbarRankingsButton()
- {
- SetIcon(FontAwesome.Regular.ChartBar);
- TooltipMain = "Ranking";
- TooltipSub = "Find out who's the best right now";
- }
-
[BackgroundDependencyLoader(true)]
private void load(RankingsOverlay rankings)
{
diff --git a/osu.Game/Overlays/Toolbar/ToolbarRulesetSelector.cs b/osu.Game/Overlays/Toolbar/ToolbarRulesetSelector.cs
index 422bf00c6d..905d5b44c6 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarRulesetSelector.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarRulesetSelector.cs
@@ -37,7 +37,7 @@ namespace osu.Game.Overlays.Toolbar
},
ModeButtonLine = new Container
{
- Size = new Vector2(ToolbarButton.WIDTH, 3),
+ Size = new Vector2(Toolbar.HEIGHT, 3),
Anchor = Anchor.BottomLeft,
Origin = Anchor.TopLeft,
Masking = true,
diff --git a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs
index a5194ea752..754b679599 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarRulesetTabButton.cs
@@ -65,12 +65,6 @@ namespace osu.Game.Overlays.Toolbar
Parent.Click();
return base.OnClick(e);
}
-
- protected override void LoadComplete()
- {
- base.LoadComplete();
- IconContainer.Scale *= 1.4f;
- }
}
}
}
diff --git a/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs b/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs
index ed2a23ec2a..c53f4a55d9 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Framework.Graphics.Sprites;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
@@ -11,10 +10,7 @@ namespace osu.Game.Overlays.Toolbar
{
public ToolbarSettingsButton()
{
- Icon = FontAwesome.Solid.Cog;
- TooltipMain = "Settings";
- TooltipSub = "Change your settings";
-
+ Width *= 1.4f;
Hotkey = GlobalAction.ToggleSettings;
}
diff --git a/osu.Game/Overlays/Toolbar/ToolbarSocialButton.cs b/osu.Game/Overlays/Toolbar/ToolbarSocialButton.cs
index 6faa58c559..e62c7bc807 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarSocialButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarSocialButton.cs
@@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
-using osu.Framework.Graphics.Sprites;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
@@ -11,10 +10,6 @@ namespace osu.Game.Overlays.Toolbar
{
public ToolbarSocialButton()
{
- Icon = FontAwesome.Solid.Users;
- TooltipMain = "Friends";
- TooltipSub = "Interact with those close to you";
-
Hotkey = GlobalAction.ToggleSocial;
}
diff --git a/osu.Game/Overlays/UserProfileOverlay.cs b/osu.Game/Overlays/UserProfileOverlay.cs
index b4c8a2d3ca..2b316c0e34 100644
--- a/osu.Game/Overlays/UserProfileOverlay.cs
+++ b/osu.Game/Overlays/UserProfileOverlay.cs
@@ -17,19 +17,18 @@ using osuTK;
namespace osu.Game.Overlays
{
- public class UserProfileOverlay : FullscreenOverlay
+ public class UserProfileOverlay : FullscreenOverlay
{
private ProfileSection lastSection;
private ProfileSection[] sections;
private GetUserRequest userReq;
- protected ProfileHeader Header;
private ProfileSectionsContainer sectionsContainer;
private ProfileSectionTabControl tabs;
public const float CONTENT_X_MARGIN = 70;
public UserProfileOverlay()
- : base(OverlayColourScheme.Pink)
+ : base(OverlayColourScheme.Pink, new ProfileHeader())
{
}
@@ -45,6 +44,9 @@ namespace osu.Game.Overlays
if (user.Id == Header?.User.Value?.Id)
return;
+ if (sectionsContainer != null)
+ sectionsContainer.ExpandableHeader = null;
+
userReq?.Cancel();
Clear();
lastSection = null;
@@ -77,7 +79,7 @@ namespace osu.Game.Overlays
Add(sectionsContainer = new ProfileSectionsContainer
{
- ExpandableHeader = Header = new ProfileHeader(),
+ ExpandableHeader = Header,
FixedHeader = tabs,
HeaderBackground = new Box
{
diff --git a/osu.Game/Overlays/WaveOverlayContainer.cs b/osu.Game/Overlays/WaveOverlayContainer.cs
index 5c87096dd4..d0fa9987d5 100644
--- a/osu.Game/Overlays/WaveOverlayContainer.cs
+++ b/osu.Game/Overlays/WaveOverlayContainer.cs
@@ -14,6 +14,8 @@ namespace osu.Game.Overlays
protected override bool BlockNonPositionalInput => true;
protected override Container Content => Waves;
+ public const float WIDTH_PADDING = 80;
+
protected override bool StartHidden => true;
protected WaveOverlayContainer()
diff --git a/osu.Game/Screens/Edit/Timing/ControlPointTable.cs b/osu.Game/Screens/Edit/Timing/ControlPointTable.cs
index 5c59cfbfe8..c0c0bcead2 100644
--- a/osu.Game/Screens/Edit/Timing/ControlPointTable.cs
+++ b/osu.Game/Screens/Edit/Timing/ControlPointTable.cs
@@ -112,8 +112,7 @@ namespace osu.Game.Screens.Edit.Timing
};
controlPoints = group.ControlPoints.GetBoundCopy();
- controlPoints.ItemsAdded += _ => createChildren();
- controlPoints.ItemsRemoved += _ => createChildren();
+ controlPoints.CollectionChanged += (_, __) => createChildren();
createChildren();
}
diff --git a/osu.Game/Screens/Edit/Timing/TimingScreen.cs b/osu.Game/Screens/Edit/Timing/TimingScreen.cs
index a08a660e7e..8c40c8e721 100644
--- a/osu.Game/Screens/Edit/Timing/TimingScreen.cs
+++ b/osu.Game/Screens/Edit/Timing/TimingScreen.cs
@@ -124,8 +124,7 @@ namespace osu.Game.Screens.Edit.Timing
selectedGroup.BindValueChanged(selected => { deleteButton.Enabled.Value = selected.NewValue != null; }, true);
controlGroups = Beatmap.Value.Beatmap.ControlPointInfo.Groups.GetBoundCopy();
- controlGroups.ItemsAdded += _ => createContent();
- controlGroups.ItemsRemoved += _ => createContent();
+ controlGroups.CollectionChanged += (sender, args) => createContent();
createContent();
}
diff --git a/osu.Game/Screens/IOsuScreen.cs b/osu.Game/Screens/IOsuScreen.cs
index 761f842c22..e19037c2c4 100644
--- a/osu.Game/Screens/IOsuScreen.cs
+++ b/osu.Game/Screens/IOsuScreen.cs
@@ -39,9 +39,9 @@ namespace osu.Game.Screens
bool HideOverlaysOnEnter { get; }
///
- /// Whether overlays should be able to be opened once this screen is entered or resumed.
+ /// Whether overlays should be able to be opened when this screen is current.
///
- OverlayActivation InitialOverlayActivationMode { get; }
+ IBindable OverlayActivationMode { get; }
///
/// The amount of parallax to be applied while this screen is displayed.
diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index 5ba7a8ddc3..4becdd58cd 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -270,9 +270,6 @@ namespace osu.Game.Screens.Menu
ButtonSystemState lastState = state;
state = value;
- if (game != null)
- game.OverlayActivationMode.Value = state == ButtonSystemState.Exit ? OverlayActivation.Disabled : OverlayActivation.All;
-
updateLogoState(lastState);
Logger.Log($"{nameof(ButtonSystem)}'s state changed from {lastState} to {state}");
diff --git a/osu.Game/Screens/Menu/IntroScreen.cs b/osu.Game/Screens/Menu/IntroScreen.cs
index 473e6b0364..1df5c503d6 100644
--- a/osu.Game/Screens/Menu/IntroScreen.cs
+++ b/osu.Game/Screens/Menu/IntroScreen.cs
@@ -46,8 +46,6 @@ namespace osu.Game.Screens.Menu
protected ITrack Track { get; private set; }
- private readonly BindableDouble exitingVolumeFade = new BindableDouble(1);
-
private const int exit_delay = 3000;
private SampleChannel seeya;
@@ -127,17 +125,35 @@ namespace osu.Game.Screens.Menu
this.FadeIn(300);
double fadeOutTime = exit_delay;
+
+ var track = musicController.CurrentTrack;
+
+ // ensure the track doesn't change or loop as we are exiting.
+ track.Looping = false;
+ Beatmap.Disabled = true;
+
// we also handle the exit transition.
if (MenuVoice.Value)
+ {
seeya.Play();
+
+ // if playing the outro voice, we have more time to have fun with the background track.
+ // initially fade to almost silent then ramp out over the remaining time.
+ const double initial_fade = 200;
+ track
+ .VolumeTo(0.03f, initial_fade).Then()
+ .VolumeTo(0, fadeOutTime - initial_fade, Easing.In);
+ }
else
+ {
fadeOutTime = 500;
- audio.AddAdjustment(AdjustableProperty.Volume, exitingVolumeFade);
- this.TransformBindableTo(exitingVolumeFade, 0, fadeOutTime).OnComplete(_ => this.Exit());
+ // if outro voice is turned off, just do a simple fade out.
+ track.VolumeTo(0, fadeOutTime, Easing.Out);
+ }
//don't want to fade out completely else we will stop running updates.
- Game.FadeTo(0.01f, fadeOutTime);
+ Game.FadeTo(0.01f, fadeOutTime).OnComplete(_ => this.Exit());
base.OnResuming(last);
}
diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs
index e0ac19cbaf..c3ecd75963 100644
--- a/osu.Game/Screens/Menu/MainMenu.cs
+++ b/osu.Game/Screens/Menu/MainMenu.cs
@@ -280,6 +280,7 @@ namespace osu.Game.Screens.Menu
}
buttons.State = ButtonSystemState.Exit;
+ OverlayActivationMode.Value = OverlayActivation.Disabled;
songTicker.Hide();
diff --git a/osu.Game/Screens/Multi/Header.cs b/osu.Game/Screens/Multi/Header.cs
index 653cb3791a..cd8695286b 100644
--- a/osu.Game/Screens/Multi/Header.cs
+++ b/osu.Game/Screens/Multi/Header.cs
@@ -11,8 +11,8 @@ using osu.Framework.Graphics.UserInterface;
using osu.Framework.Screens;
using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
-using osu.Game.Overlays.SearchableList;
using osu.Game.Graphics.Sprites;
+using osu.Game.Overlays;
using osuTK;
using osuTK.Graphics;
@@ -42,7 +42,7 @@ namespace osu.Game.Screens.Multi
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
RelativeSizeAxes = Axes.Both,
- Padding = new MarginPadding { Left = SearchableListOverlay.WIDTH_PADDING + OsuScreen.HORIZONTAL_OVERFLOW_PADDING },
+ Padding = new MarginPadding { Left = WaveOverlayContainer.WIDTH_PADDING + OsuScreen.HORIZONTAL_OVERFLOW_PADDING },
Children = new Drawable[]
{
title = new MultiHeaderTitle
diff --git a/osu.Game/Screens/Multi/Lounge/Components/RoomsContainer.cs b/osu.Game/Screens/Multi/Lounge/Components/RoomsContainer.cs
index 447c99039a..321d7b0a19 100644
--- a/osu.Game/Screens/Multi/Lounge/Components/RoomsContainer.cs
+++ b/osu.Game/Screens/Multi/Lounge/Components/RoomsContainer.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using System.Collections.Specialized;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
@@ -53,8 +54,7 @@ namespace osu.Game.Screens.Multi.Lounge.Components
protected override void LoadComplete()
{
- rooms.ItemsAdded += addRooms;
- rooms.ItemsRemoved += removeRooms;
+ rooms.CollectionChanged += roomsChanged;
roomManager.RoomsUpdated += updateSorting;
rooms.BindTo(roomManager.Rooms);
@@ -82,6 +82,20 @@ namespace osu.Game.Screens.Multi.Lounge.Components
});
}
+ private void roomsChanged(object sender, NotifyCollectionChangedEventArgs args)
+ {
+ switch (args.Action)
+ {
+ case NotifyCollectionChangedAction.Add:
+ addRooms(args.NewItems.Cast());
+ break;
+
+ case NotifyCollectionChangedAction.Remove:
+ removeRooms(args.OldItems.Cast());
+ break;
+ }
+ }
+
private void addRooms(IEnumerable rooms)
{
foreach (var room in rooms)
diff --git a/osu.Game/Screens/Multi/Lounge/LoungeSubScreen.cs b/osu.Game/Screens/Multi/Lounge/LoungeSubScreen.cs
index f9c5fd13a4..a1e99c83b2 100644
--- a/osu.Game/Screens/Multi/Lounge/LoungeSubScreen.cs
+++ b/osu.Game/Screens/Multi/Lounge/LoungeSubScreen.cs
@@ -12,7 +12,6 @@ using osu.Game.Graphics.Containers;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.Multiplayer;
using osu.Game.Overlays;
-using osu.Game.Overlays.SearchableList;
using osu.Game.Screens.Multi.Lounge.Components;
using osu.Game.Screens.Multi.Match;
@@ -102,8 +101,8 @@ namespace osu.Game.Screens.Multi.Lounge
content.Padding = new MarginPadding
{
Top = Filter.DrawHeight,
- Left = SearchableListOverlay.WIDTH_PADDING - DrawableRoom.SELECTION_BORDER_WIDTH + HORIZONTAL_OVERFLOW_PADDING,
- Right = SearchableListOverlay.WIDTH_PADDING + HORIZONTAL_OVERFLOW_PADDING,
+ Left = WaveOverlayContainer.WIDTH_PADDING - DrawableRoom.SELECTION_BORDER_WIDTH + HORIZONTAL_OVERFLOW_PADDING,
+ Right = WaveOverlayContainer.WIDTH_PADDING + HORIZONTAL_OVERFLOW_PADDING,
};
}
diff --git a/osu.Game/Screens/Multi/Match/Components/MatchLeaderboard.cs b/osu.Game/Screens/Multi/Match/Components/MatchLeaderboard.cs
index 1afbf5c32a..f2409d64e7 100644
--- a/osu.Game/Screens/Multi/Match/Components/MatchLeaderboard.cs
+++ b/osu.Game/Screens/Multi/Match/Components/MatchLeaderboard.cs
@@ -14,8 +14,6 @@ namespace osu.Game.Screens.Multi.Match.Components
{
public class MatchLeaderboard : Leaderboard
{
- public Action> ScoresLoaded;
-
[Resolved(typeof(Room), nameof(Room.RoomID))]
private Bindable roomId { get; set; }
@@ -39,18 +37,20 @@ namespace osu.Game.Screens.Multi.Match.Components
if (roomId.Value == null)
return null;
- var req = new GetRoomScoresRequest(roomId.Value ?? 0);
+ var req = new GetRoomLeaderboardRequest(roomId.Value ?? 0);
req.Success += r =>
{
- scoresCallback?.Invoke(r);
- ScoresLoaded?.Invoke(r);
+ scoresCallback?.Invoke(r.Leaderboard);
+ TopScore = r.UserScore;
};
return req;
}
protected override LeaderboardScore CreateDrawableScore(APIUserScoreAggregate model, int index) => new MatchLeaderboardScore(model, index);
+
+ protected override LeaderboardScore CreateDrawableTopScore(APIUserScoreAggregate model) => new MatchLeaderboardScore(model, model.Position, false);
}
public enum MatchLeaderboardScope
diff --git a/osu.Game/Screens/Multi/Match/Components/MatchLeaderboardScore.cs b/osu.Game/Screens/Multi/Match/Components/MatchLeaderboardScore.cs
index 73a40d9579..1fabdbb86a 100644
--- a/osu.Game/Screens/Multi/Match/Components/MatchLeaderboardScore.cs
+++ b/osu.Game/Screens/Multi/Match/Components/MatchLeaderboardScore.cs
@@ -14,8 +14,8 @@ namespace osu.Game.Screens.Multi.Match.Components
{
private readonly APIUserScoreAggregate score;
- public MatchLeaderboardScore(APIUserScoreAggregate score, int rank)
- : base(score.CreateScoreInfo(), rank)
+ public MatchLeaderboardScore(APIUserScoreAggregate score, int? rank, bool allowHighlight = true)
+ : base(score.CreateScoreInfo(), rank, allowHighlight)
{
this.score = score;
}
diff --git a/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs b/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs
index 49a0fc434b..caefc194b1 100644
--- a/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs
+++ b/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs
@@ -14,7 +14,7 @@ using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.Multiplayer;
-using osu.Game.Overlays.SearchableList;
+using osu.Game.Overlays;
using osuTK;
using osuTK.Graphics;
@@ -117,7 +117,7 @@ namespace osu.Game.Screens.Multi.Match.Components
{
new Container
{
- Padding = new MarginPadding { Horizontal = SearchableListOverlay.WIDTH_PADDING },
+ Padding = new MarginPadding { Horizontal = WaveOverlayContainer.WIDTH_PADDING },
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Children = new Drawable[]
diff --git a/osu.Game/Screens/Multi/Match/MatchSubScreen.cs b/osu.Game/Screens/Multi/Match/MatchSubScreen.cs
index 7c2d5cf85d..0d2adeb27c 100644
--- a/osu.Game/Screens/Multi/Match/MatchSubScreen.cs
+++ b/osu.Game/Screens/Multi/Match/MatchSubScreen.cs
@@ -172,7 +172,7 @@ namespace osu.Game.Screens.Multi.Match
new Dimension(GridSizeMode.AutoSize),
new Dimension(),
new Dimension(GridSizeMode.AutoSize),
- new Dimension(GridSizeMode.Relative, size: 0.4f, minSize: 240),
+ new Dimension(GridSizeMode.Relative, size: 0.4f, minSize: 120),
}
},
null
diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs
index 872a1cd39a..a44d14fb5c 100644
--- a/osu.Game/Screens/OsuScreen.cs
+++ b/osu.Game/Screens/OsuScreen.cs
@@ -44,9 +44,13 @@ namespace osu.Game.Screens
public virtual bool HideOverlaysOnEnter => false;
///
- /// Whether overlays should be able to be opened once this screen is entered or resumed.
+ /// The initial overlay activation mode to use when this screen is entered for the first time.
///
- public virtual OverlayActivation InitialOverlayActivationMode => OverlayActivation.All;
+ protected virtual OverlayActivation InitialOverlayActivationMode => OverlayActivation.All;
+
+ protected readonly Bindable OverlayActivationMode;
+
+ IBindable IOsuScreen.OverlayActivationMode => OverlayActivationMode;
public virtual bool CursorVisible => true;
@@ -138,6 +142,8 @@ namespace osu.Game.Screens
{
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
+
+ OverlayActivationMode = new Bindable(InitialOverlayActivationMode);
}
[BackgroundDependencyLoader(true)]
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 82c446f5e4..e78b2a694f 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -50,7 +50,7 @@ namespace osu.Game.Screens.Play
public override bool HideOverlaysOnEnter => true;
- public override OverlayActivation InitialOverlayActivationMode => OverlayActivation.UserTriggered;
+ protected override OverlayActivation InitialOverlayActivationMode => OverlayActivation.UserTriggered;
// We are managing our own adjustments (see OnEntering/OnExiting).
public override bool AllowRateAdjustments => false;
diff --git a/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs b/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs
index 8e85eb4eb2..8ddae67dba 100644
--- a/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs
+++ b/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs
@@ -9,7 +9,6 @@ using osu.Framework.Bindables;
using osu.Game.Beatmaps;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
-using osu.Game.Online.API.Requests.Responses;
using osu.Game.Online.Leaderboards;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
@@ -41,25 +40,8 @@ namespace osu.Game.Screens.Select.Leaderboards
}
}
- public APILegacyUserTopScoreInfo TopScore
- {
- get => topScoreContainer.Score.Value;
- set
- {
- if (value == null)
- topScoreContainer.Hide();
- else
- {
- topScoreContainer.Show();
- topScoreContainer.Score.Value = value;
- }
- }
- }
-
private bool filterMods;
- private UserTopScoreContainer topScoreContainer;
-
private IBindable> itemRemoved;
///
@@ -101,11 +83,6 @@ namespace osu.Game.Screens.Select.Leaderboards
UpdateScores();
};
- Content.Add(topScoreContainer = new UserTopScoreContainer
- {
- ScoreSelected = s => ScoreSelected?.Invoke(s)
- });
-
itemRemoved = scoreManager.ItemRemoved.GetBoundCopy();
itemRemoved.BindValueChanged(onScoreRemoved);
}
@@ -183,7 +160,7 @@ namespace osu.Game.Screens.Select.Leaderboards
req.Success += r =>
{
scoresCallback?.Invoke(r.Scores.Select(s => s.CreateScoreInfo(rulesets)));
- TopScore = r.UserScore;
+ TopScore = r.UserScore?.CreateScoreInfo(rulesets);
};
return req;
@@ -193,5 +170,10 @@ namespace osu.Game.Screens.Select.Leaderboards
{
Action = () => ScoreSelected?.Invoke(model)
};
+
+ protected override LeaderboardScore CreateDrawableTopScore(ScoreInfo model) => new LeaderboardScore(model, model.Position, false)
+ {
+ Action = () => ScoreSelected?.Invoke(model)
+ };
}
}
diff --git a/osu.Game/Screens/StartupScreen.cs b/osu.Game/Screens/StartupScreen.cs
index c3e36c8e9d..e5e134fd39 100644
--- a/osu.Game/Screens/StartupScreen.cs
+++ b/osu.Game/Screens/StartupScreen.cs
@@ -18,6 +18,6 @@ namespace osu.Game.Screens
public override bool AllowRateAdjustments => false;
- public override OverlayActivation InitialOverlayActivationMode => OverlayActivation.Disabled;
+ protected override OverlayActivation InitialOverlayActivationMode => OverlayActivation.Disabled;
}
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index c021770d7b..d79806883e 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -24,8 +24,8 @@
-
-
+
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 9b25eaab41..16a8a1acb7 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,8 +70,8 @@
-
-
+
+
@@ -80,7 +80,7 @@
-
+