1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-18 05:39:53 +08:00
Files
osu-lazer/osu.Game/Users/Drawables/UpdateableAvatar.cs
T
Dan Balasescu fc817627e5 Rework ranked play chat to reduce overall area (#37097)
In discussions, we've come to the conclusion to attempt to use a
chat-bubble system to minimise the effective area of the chat. In
particular, the results screen doesn't give us enough space to display
the full chat box without overlapping the main screen content.

This PR both adds the chat to the results screen, and reworks it to use
such a bubble system (not sure what to call it, IM style?).


https://github.com/user-attachments/assets/a8a88c51-8a9d-4a03-92b6-621112a15a41

- New messages are previewed for 3 seconds.
- When focusing and unfocusing the textbox, the history moves into
expanded state (show the most recent 10 messages) or collapsed state
(fade messages out ASAP).

This is a bit of an initial implementation to get a feel of how it
behaves, and there's more that can be done such as adding colours,
improving the transforms, perhaps adding it to the intro screen
(post-animation) but the structure's a bit weird atm.

---------

Co-authored-by: Dean Herbert <pe@ppy.sh>
2026-03-31 03:45:47 +09:00

93 lines
2.9 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 osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Effects;
using osu.Game.Online.API.Requests.Responses;
namespace osu.Game.Users.Drawables
{
/// <summary>
/// An avatar which can update to a new user when needed.
/// </summary>
public partial class UpdateableAvatar : ModelBackedDrawable<APIUser?>
{
public APIUser? User
{
get => Model;
set => Model = value;
}
public new bool Masking
{
get => base.Masking;
set => base.Masking = value;
}
public new float CornerRadius
{
get => base.CornerRadius;
set => base.CornerRadius = value;
}
public new float CornerExponent
{
get => base.CornerExponent;
set => base.CornerExponent = value;
}
public new EdgeEffectParameters EdgeEffect
{
get => base.EdgeEffect;
set => base.EdgeEffect = value;
}
public bool DelayedLoad = true;
protected override double LoadDelay => DelayedLoad ? 200 : 0;
private readonly bool isInteractive;
private readonly bool showGuestOnNull;
private readonly bool showUserPanelOnHover;
/// <summary>
/// Construct a new UpdateableAvatar.
/// </summary>
/// <param name="user">The initial user to display.</param>
/// <param name="isInteractive">If set to true, hover/click sounds will play and clicking the avatar will open the user's profile.</param>
/// <param name="showUserPanelOnHover">
/// If set to true, the user status panel will be displayed in the tooltip.
/// Only has an effect if <see cref="isInteractive"/> is true.
/// </param>
/// <param name="showGuestOnNull">Whether to show a default guest representation on null user (as opposed to nothing).</param>
public UpdateableAvatar(APIUser? user = null, bool isInteractive = true, bool showUserPanelOnHover = false, bool showGuestOnNull = true)
{
this.isInteractive = isInteractive;
this.showGuestOnNull = showGuestOnNull;
this.showUserPanelOnHover = showUserPanelOnHover;
User = user;
}
protected override Drawable? CreateDrawable(APIUser? user)
{
if (user == null && !showGuestOnNull)
return null;
if (isInteractive)
{
return new ClickableAvatar(user, showUserPanelOnHover)
{
RelativeSizeAxes = Axes.Both,
};
}
return new DrawableAvatar(user)
{
RelativeSizeAxes = Axes.Both,
};
}
}
}