-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Add user card with global/country ranks to login overlay #26340
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
5eaf5fc
c4be6fa
3df7430
7262fef
b86c883
e3989c8
fe06402
66c7a29
353df2f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,212 @@ | ||
// 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.Allocation; | ||
using osu.Framework.Extensions.LocalisationExtensions; | ||
using osu.Framework.Graphics; | ||
using osu.Framework.Graphics.Containers; | ||
using osu.Framework.Input.Events; | ||
using osu.Framework.Localisation; | ||
using osu.Game.Online.API.Requests.Responses; | ||
using osu.Game.Overlays.Profile.Header.Components; | ||
using osu.Game.Resources.Localisation.Web; | ||
using osuTK; | ||
|
||
namespace osu.Game.Users | ||
{ | ||
/// <summary> | ||
/// User card that shows user's global and country ranks in the bottom. | ||
/// Meant to be used in the toolbar login overlay. | ||
/// </summary> | ||
public partial class UserRankPanel : UserPanel | ||
{ | ||
private const int padding = 10; | ||
private const int main_content_height = 80; | ||
|
||
public UserRankPanel(APIUser user) | ||
: base(user) | ||
{ | ||
AutoSizeAxes = Axes.Y; | ||
CornerRadius = 10; | ||
} | ||
|
||
[BackgroundDependencyLoader] | ||
private void load() | ||
{ | ||
BorderColour = ColourProvider?.Light1 ?? Colours.GreyVioletLighter; | ||
} | ||
|
||
protected override Drawable CreateLayout() | ||
{ | ||
FillFlowContainer details; | ||
|
||
var layout = new Container | ||
{ | ||
RelativeSizeAxes = Axes.X, | ||
AutoSizeAxes = Axes.Y, | ||
Children = new Drawable[] | ||
{ | ||
new Container | ||
{ | ||
Name = "Main content", | ||
RelativeSizeAxes = Axes.X, | ||
Height = main_content_height, | ||
CornerRadius = 10, | ||
Masking = true, | ||
Children = new Drawable[] | ||
{ | ||
new UserCoverBackground | ||
{ | ||
RelativeSizeAxes = Axes.Both, | ||
Anchor = Anchor.Centre, | ||
Origin = Anchor.Centre, | ||
User = User, | ||
Alpha = 0.3f | ||
}, | ||
new GridContainer | ||
{ | ||
AutoSizeAxes = Axes.Y, | ||
RelativeSizeAxes = Axes.X, | ||
ColumnDimensions = new[] | ||
{ | ||
new Dimension(GridSizeMode.Absolute, padding), | ||
new Dimension(GridSizeMode.AutoSize), | ||
new Dimension(), | ||
new Dimension(GridSizeMode.Absolute, padding), | ||
}, | ||
RowDimensions = new[] | ||
{ | ||
new Dimension(GridSizeMode.Absolute, padding), | ||
new Dimension(GridSizeMode.AutoSize), | ||
}, | ||
Content = new[] | ||
{ | ||
new[] | ||
{ | ||
Empty(), | ||
Empty(), | ||
Empty(), | ||
Empty() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. what on earth. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Padding, similar to how There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add an inline comment explaining this. |
||
}, | ||
new[] | ||
{ | ||
Empty(), | ||
CreateAvatar().With(avatar => | ||
{ | ||
avatar.Size = new Vector2(60); | ||
avatar.Masking = true; | ||
avatar.CornerRadius = 6; | ||
}), | ||
new Container | ||
{ | ||
RelativeSizeAxes = Axes.Both, | ||
Padding = new MarginPadding { Left = padding }, | ||
Child = new GridContainer | ||
{ | ||
RelativeSizeAxes = Axes.Both, | ||
ColumnDimensions = new[] | ||
{ | ||
new Dimension() | ||
}, | ||
RowDimensions = new[] | ||
{ | ||
new Dimension(GridSizeMode.AutoSize), | ||
new Dimension() | ||
}, | ||
Content = new[] | ||
{ | ||
new Drawable[] | ||
{ | ||
details = new FillFlowContainer | ||
{ | ||
AutoSizeAxes = Axes.Both, | ||
Direction = FillDirection.Horizontal, | ||
Spacing = new Vector2(6), | ||
Children = new Drawable[] | ||
{ | ||
CreateFlag(), | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i'm hoping this was just bad copy and paste and you haven't used an AI to write this. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. All of the top layer of the card was pretty much one to one copied from the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you add inline comments for places where code doesn't explain itself? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, should I do the same in the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, please do. |
||
}, | ||
new Drawable[] | ||
{ | ||
CreateUsername().With(username => | ||
{ | ||
username.Anchor = Anchor.CentreLeft; | ||
username.Origin = Anchor.CentreLeft; | ||
}) | ||
} | ||
} | ||
} | ||
}, | ||
Empty() | ||
} | ||
} | ||
} | ||
} | ||
}, | ||
new Container | ||
{ | ||
Name = "Bottom content", | ||
Margin = new MarginPadding { Top = main_content_height }, | ||
RelativeSizeAxes = Axes.X, | ||
AutoSizeAxes = Axes.Y, | ||
Padding = new MarginPadding { Left = 80, Vertical = padding }, | ||
Child = new GridContainer | ||
{ | ||
RelativeSizeAxes = Axes.X, | ||
AutoSizeAxes = Axes.Y, | ||
ColumnDimensions = new[] | ||
{ | ||
new Dimension(), | ||
new Dimension() | ||
}, | ||
RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, | ||
Content = new[] | ||
{ | ||
new Drawable[] | ||
{ | ||
new ProfileValueDisplay(true) | ||
{ | ||
Title = UsersStrings.ShowRankGlobalSimple, | ||
Content = User.Statistics?.GlobalRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-" | ||
}, | ||
new ProfileValueDisplay(true) | ||
{ | ||
Title = UsersStrings.ShowRankCountrySimple, | ||
Content = User.Statistics?.CountryRank?.ToLocalisableString("\\##,##0") ?? (LocalisableString)"-" | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I dunno. These are never going to update. I'd say they need to update as a minimum requirement to have this added, else it's misleading to the user. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, I'll look into it There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There probably needs to be a global event which is triggered by the results screen when a change to statistics happens, which can schedule a future update of this card (next time the panel is opened). Probably out of scope for this PR, but I'd hope to have that as a prereq or follow-up PR so they can be merged together. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could updating There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're Maybe separating |
||
} | ||
} | ||
} | ||
} | ||
} | ||
}; | ||
|
||
if (User.IsSupporter) | ||
{ | ||
details.Add(new SupporterIcon | ||
{ | ||
Height = 26, | ||
SupportLevel = User.SupportLevel | ||
}); | ||
} | ||
|
||
return layout; | ||
} | ||
|
||
protected override bool OnHover(HoverEvent e) | ||
{ | ||
BorderThickness = 2; | ||
return base.OnHover(e); | ||
} | ||
|
||
protected override void OnHoverLost(HoverLostEvent e) | ||
{ | ||
BorderThickness = 0; | ||
base.OnHoverLost(e); | ||
} | ||
|
||
protected override Drawable? CreateBackground() => null; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is so weird. So there's one method called
CreateX
and it's virtual and requires override to do something, then there's three otherCreate
methods which are required to be called by the implementation to actually do something.At very least this needs xmldoc. Optimally, they shouldn't use the same naming structure.