mirror of
https://github.com/ppy/osu.git
synced 2026-05-24 00:07:32 +08:00
1230da33a5
- Adds sorting and display styles. - Saves sort/display modes to the config. - Improves performance, especially on the 2nd+ time opening the overlay. https://github.com/user-attachments/assets/e32b50d0-58a1-4eef-b18c-988fb497e545 --- Coming off some recent feedback in https://github.com/ppy/osu/discussions/33426#discussioncomment-13431275, I decided to take a bit of a detour and get a little bit more functionality in. Sorting by rank, although it should technically work, doesn't work right now. This is because the osu!web API doesn't return user rank on `/user/` lookups - it's only returned for the friends request. I'm leaving this open as a discussion topic. - We can make osu!web return the rank and osu! will require no further changes to work correctly, or - We can try to implement additional paths through `osu-server-spectator` which would blow this PR out of proportion and is best left for a task of its own. For simplicity, I've re-implemented this display mostly as its own component for now, lifting code from `FriendDisplay` which was recently overhauled. These implementations should eventually be combined somehow but that's dependent on: 1. Figuring out the styling - friends can display offline users for which it makes no sense to display the "spectate" button. 2. Figuring out how to handle the different users/presence pathways. It's mostly a code complexity issue. --------- Co-authored-by: Dean Herbert <pe@ppy.sh> Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
74 lines
2.3 KiB
C#
74 lines
2.3 KiB
C#
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
|
// See the LICENCE file in the repository root for full licence text.
|
|
|
|
using System;
|
|
using osu.Framework.Allocation;
|
|
using osu.Framework.Bindables;
|
|
using osu.Framework.Graphics.Containers;
|
|
using osu.Game.Online.Metadata;
|
|
using osu.Game.Overlays.Dashboard;
|
|
using osu.Game.Overlays.Dashboard.CurrentlyOnline;
|
|
using osu.Game.Overlays.Dashboard.Friends;
|
|
|
|
namespace osu.Game.Overlays
|
|
{
|
|
public partial class DashboardOverlay : TabbableOnlineOverlay<DashboardOverlayHeader, DashboardOverlayTabs>
|
|
{
|
|
[Resolved]
|
|
private MetadataClient metadataClient { get; set; } = null!;
|
|
|
|
private IBindable<bool> metadataConnected = null!;
|
|
private IDisposable? userPresenceWatchToken;
|
|
|
|
public DashboardOverlay()
|
|
: base(OverlayColourScheme.Purple)
|
|
{
|
|
}
|
|
|
|
protected override DashboardOverlayHeader CreateHeader() => new DashboardOverlayHeader();
|
|
|
|
public override bool AcceptsFocus => false;
|
|
|
|
protected override void CreateDisplayToLoad(DashboardOverlayTabs tab)
|
|
{
|
|
switch (tab)
|
|
{
|
|
case DashboardOverlayTabs.Friends:
|
|
LoadDisplay(new FriendDisplay());
|
|
break;
|
|
|
|
case DashboardOverlayTabs.CurrentlyPlaying:
|
|
LoadDisplay(new CurrentlyOnlineDisplay());
|
|
break;
|
|
|
|
default:
|
|
throw new NotImplementedException($"Display for {tab} tab is not implemented");
|
|
}
|
|
}
|
|
|
|
protected override void LoadComplete()
|
|
{
|
|
base.LoadComplete();
|
|
|
|
metadataConnected = metadataClient.IsConnected.GetBoundCopy();
|
|
metadataConnected.BindValueChanged(_ => updateUserPresenceState());
|
|
State.BindValueChanged(_ => updateUserPresenceState());
|
|
updateUserPresenceState();
|
|
}
|
|
|
|
private void updateUserPresenceState()
|
|
{
|
|
if (!metadataConnected.Value)
|
|
return;
|
|
|
|
if (State.Value == Visibility.Visible)
|
|
userPresenceWatchToken ??= metadataClient.BeginWatchingUserPresence();
|
|
else
|
|
{
|
|
userPresenceWatchToken?.Dispose();
|
|
userPresenceWatchToken = null;
|
|
}
|
|
}
|
|
}
|
|
}
|