1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-22 05:49:55 +08:00

Refactor panel structure

This commit is contained in:
Dan Balasescu
2025-10-27 18:30:42 +09:00
Unverified
parent be9b99f975
commit 08621c4cc9
@@ -48,6 +48,12 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Match
public readonly MultiplayerRoomUser RoomUser;
/// <summary>
/// Perform an action in addition to showing the user's profile.
/// This should be used to perform auxiliary tasks and not as a primary action for clicking a user panel (to maintain a consistent UX).
/// </summary>
public new Action? Action;
[Resolved]
private MultiplayerClient client { get; set; } = null!;
@@ -81,6 +87,9 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Match
[Resolved]
private MetadataClient? metadataClient { get; set; }
public readonly APIUser User;
private readonly Action viewProfile;
private OsuSpriteText rankText = null!;
private OsuSpriteText scoreText = null!;
@@ -91,33 +100,11 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Match
private Container mainContent = null!;
private Box solidBackgroundLayer = null!;
private Drawable background = null!;
private PlayerPanelDisplayMode displayMode = PlayerPanelDisplayMode.Horizontal;
public PlayerPanelDisplayMode DisplayMode
{
get => displayMode;
set
{
displayMode = value;
if (IsLoaded)
updateLayout(false);
}
}
public readonly APIUser User;
/// <summary>
/// Perform an action in addition to showing the user's profile.
/// This should be used to perform auxiliary tasks and not as a primary action for clicking a user panel (to maintain a consistent UX).
/// </summary>
public new Action? Action;
protected Action ViewProfile { get; private set; } = null!;
public Box SolidBackgroundLayer { get; private set; } = null!;
protected Drawable? Background { get; private set; }
public PlayerPanel(MultiplayerRoomUser user)
: base(HoverSampleSet.Button)
{
@@ -125,100 +112,99 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Match
User = user.User;
RoomUser = user;
base.Action = viewProfile = () =>
{
Action?.Invoke();
profileOverlay?.ShowUser(User);
};
}
[BackgroundDependencyLoader]
private void load()
{
Add(SolidBackgroundLayer = new Box
{
RelativeSizeAxes = Axes.Both,
Colour = colourProvider?.Background5 ?? colours.Gray1
});
Background = new UserCoverBackground
{
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Colour = colours.Gray7,
User = User
};
if (Background != null)
Add(Background);
base.Action = ViewProfile = () =>
{
Action?.Invoke();
profileOverlay?.ShowUser(User);
};
Content.Masking = true;
Content.CornerRadius = 10;
Content.CornerExponent = 10;
Content.Anchor = Anchor.Centre;
Content.Origin = Anchor.Centre;
Add(new Container
Children = new[]
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Child = mainContent = new Container
solidBackgroundLayer = new Box
{
RelativeSizeAxes = Axes.Both,
Colour = colourProvider?.Background5 ?? colours.Gray1
},
background = new UserCoverBackground
{
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Colour = colours.Gray7,
User = User
},
new Container
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Children = new[]
Child = mainContent = new Container
{
avatarPositionTarget = new Container
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Children = new[]
{
Origin = Anchor.Centre,
Size = avatar_size,
Child = avatarJumpTarget = new Container
avatarPositionTarget = new Container
{
Origin = Anchor.Centre,
Size = avatar_size,
Child = avatarJumpTarget = new Container
{
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
RelativeSizeAxes = Axes.Both,
Child = avatar = new MatchmakingAvatar(User, isOwnUser: User.Id == api.LocalUser.Value.Id)
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Size = Vector2.One
}
}
},
rankText = new OsuSpriteText
{
Alpha = 0,
Anchor = Anchor.BottomRight,
Origin = Anchor.BottomCentre,
Blending = BlendingParameters.Additive,
Margin = new MarginPadding(4),
Text = "-",
Font = OsuFont.Style.Title.With(size: 55),
},
username = new OsuSpriteText
{
Alpha = 0,
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
RelativeSizeAxes = Axes.Both,
Child = avatar = new MatchmakingAvatar(User, isOwnUser: User.Id == api.LocalUser.Value.Id)
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Size = Vector2.One
}
Text = User.Username,
Font = OsuFont.Style.Heading1,
},
scoreText = new OsuSpriteText
{
Alpha = 0,
Margin = new MarginPadding(10),
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
Font = OsuFont.Style.Heading2,
Text = "0 pts"
}
},
rankText = new OsuSpriteText
{
Alpha = 0,
Anchor = Anchor.BottomRight,
Origin = Anchor.BottomCentre,
Blending = BlendingParameters.Additive,
Margin = new MarginPadding(4),
Text = "-",
Font = OsuFont.Style.Title.With(size: 55),
},
username = new OsuSpriteText
{
Alpha = 0,
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
Text = User.Username,
Font = OsuFont.Style.Heading1,
},
scoreText = new OsuSpriteText
{
Alpha = 0,
Margin = new MarginPadding(10),
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
Font = OsuFont.Style.Heading2,
Text = "0 pts"
}
}
}
});
};
// Allow avatar to exist outside of masking for when it jumps around and stuff.
AddInternal(avatar.CreateProxy());
@@ -240,6 +226,17 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Match
.FadeIn(200);
}
public PlayerPanelDisplayMode DisplayMode
{
get => displayMode;
set
{
displayMode = value;
if (IsLoaded)
updateLayout(false);
}
}
private bool horizontal => displayMode == PlayerPanelDisplayMode.Horizontal;
private Vector2 avatarPosition
@@ -276,16 +273,16 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Match
scoreText.Hide();
username.Hide();
Background.FadeOut(200, Easing.OutQuint);
SolidBackgroundLayer.FadeOut(200, Easing.OutQuint);
background.FadeOut(200, Easing.OutQuint);
solidBackgroundLayer.FadeOut(200, Easing.OutQuint);
this.ResizeTo(avatar_size, duration, Easing.OutPow10);
break;
case PlayerPanelDisplayMode.Horizontal:
case PlayerPanelDisplayMode.Vertical:
Background.FadeIn(200);
SolidBackgroundLayer.FadeIn(200);
background.FadeIn(200);
solidBackgroundLayer.FadeIn(200);
using (BeginDelayedSequence(100))
{
@@ -420,7 +417,7 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Match
{
List<MenuItem> items = new List<MenuItem>
{
new OsuMenuItem(ContextMenuStrings.ViewProfile, MenuItemType.Highlighted, ViewProfile)
new OsuMenuItem(ContextMenuStrings.ViewProfile, MenuItemType.Highlighted, viewProfile)
};
if (User.Equals(api.LocalUser.Value))