mirror of
https://github.com/ppy/osu.git
synced 2025-01-14 17:52:56 +08:00
Merge remote-tracking branch 'refs/remotes/ppy/master' into beatmap_scores
This commit is contained in:
commit
d157e6baf1
@ -1 +1 @@
|
|||||||
Subproject commit 36fad894f0657d0fdc998ffd3f2f3fa87e45d67d
|
Subproject commit c95b9350edb6305cfefdf08f902f6f73d336736b
|
@ -57,11 +57,6 @@ namespace osu.Game.Graphics
|
|||||||
private void load(FontStore store)
|
private void load(FontStore store)
|
||||||
{
|
{
|
||||||
this.store = store;
|
this.store = store;
|
||||||
}
|
|
||||||
|
|
||||||
protected override void LoadComplete()
|
|
||||||
{
|
|
||||||
base.LoadComplete();
|
|
||||||
|
|
||||||
updateTexture();
|
updateTexture();
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,9 @@ namespace osu.Game.Input.Bindings
|
|||||||
protected override void Dispose(bool isDisposing)
|
protected override void Dispose(bool isDisposing)
|
||||||
{
|
{
|
||||||
base.Dispose(isDisposing);
|
base.Dispose(isDisposing);
|
||||||
store.KeyBindingChanged -= ReloadMappings;
|
|
||||||
|
if (store != null)
|
||||||
|
store.KeyBindingChanged -= ReloadMappings;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ReloadMappings() => KeyBindings = store.Query(ruleset?.ID, variant).ToList();
|
protected override void ReloadMappings() => KeyBindings = store.Query(ruleset?.ID, variant).ToList();
|
||||||
|
31
osu.Game/Online/API/Requests/GetUserBeatmapsRequest.cs
Normal file
31
osu.Game/Online/API/Requests/GetUserBeatmapsRequest.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using Humanizer;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests
|
||||||
|
{
|
||||||
|
public class GetUserBeatmapsRequest : APIRequest<List<GetBeatmapSetsResponse>>
|
||||||
|
{
|
||||||
|
private readonly long userId;
|
||||||
|
private readonly int offset;
|
||||||
|
private readonly BeatmapSetType type;
|
||||||
|
|
||||||
|
public GetUserBeatmapsRequest(long userId, BeatmapSetType type, int offset = 0)
|
||||||
|
{
|
||||||
|
this.userId = userId;
|
||||||
|
this.offset = offset;
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string Target => $@"users/{userId}/beatmapsets/{type.ToString().Underscore()}?offset={offset}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BeatmapSetType
|
||||||
|
{
|
||||||
|
MostPlayed,
|
||||||
|
Favourite,
|
||||||
|
RankedAndApproved
|
||||||
|
}
|
||||||
|
}
|
@ -29,7 +29,10 @@ namespace osu.Game.Overlays.BeatmapSet
|
|||||||
if (value == beatmap) return;
|
if (value == beatmap) return;
|
||||||
beatmap = value;
|
beatmap = value;
|
||||||
|
|
||||||
var rate = (float)beatmap.OnlineInfo.PassCount / beatmap.OnlineInfo.PlayCount;
|
int passCount = beatmap.OnlineInfo.PassCount;
|
||||||
|
int playCount = beatmap.OnlineInfo.PlayCount;
|
||||||
|
|
||||||
|
var rate = playCount != 0 ? (float)passCount / playCount : 0;
|
||||||
successPercent.Text = rate.ToString("P0");
|
successPercent.Text = rate.ToString("P0");
|
||||||
successRate.Length = rate;
|
successRate.Length = rate;
|
||||||
percentContainer.ResizeWidthTo(successRate.Length, 250, Easing.InOutCubic);
|
percentContainer.ResizeWidthTo(successRate.Length, 250, Easing.InOutCubic);
|
||||||
|
@ -0,0 +1,79 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using OpenTK;
|
||||||
|
using osu.Framework.Configuration;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
|
using osu.Game.Overlays.Direct;
|
||||||
|
using osu.Game.Users;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace osu.Game.Overlays.Profile.Sections.Beatmaps
|
||||||
|
{
|
||||||
|
public class PaginatedBeatmapContainer : PaginatedContainer
|
||||||
|
{
|
||||||
|
private const float panel_padding = 10f;
|
||||||
|
|
||||||
|
private readonly BeatmapSetType type;
|
||||||
|
|
||||||
|
private DirectPanel playing;
|
||||||
|
|
||||||
|
public PaginatedBeatmapContainer(BeatmapSetType type, Bindable<User> user, string header, string missing)
|
||||||
|
: base(user, header, missing)
|
||||||
|
{
|
||||||
|
this.type = type;
|
||||||
|
|
||||||
|
ItemsPerPage = 6;
|
||||||
|
|
||||||
|
ItemsContainer.Spacing = new Vector2(panel_padding);
|
||||||
|
ItemsContainer.Margin = new MarginPadding { Bottom = panel_padding };
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ShowMore()
|
||||||
|
{
|
||||||
|
base.ShowMore();
|
||||||
|
|
||||||
|
var req = new GetUserBeatmapsRequest(User.Value.Id, type, VisiblePages++ * ItemsPerPage);
|
||||||
|
|
||||||
|
req.Success += sets =>
|
||||||
|
{
|
||||||
|
ShowMoreButton.FadeTo(sets.Count == ItemsPerPage ? 1 : 0);
|
||||||
|
ShowMoreLoading.Hide();
|
||||||
|
|
||||||
|
if (!sets.Any())
|
||||||
|
{
|
||||||
|
MissingText.Show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var s in sets)
|
||||||
|
{
|
||||||
|
if (!s.OnlineBeatmapSetID.HasValue)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var subReq = new GetBeatmapSetRequest(s.OnlineBeatmapSetID.Value);
|
||||||
|
subReq.Success += b =>
|
||||||
|
{
|
||||||
|
var panel = new DirectGridPanel(b.ToBeatmapSet(Rulesets)) { Width = 400 };
|
||||||
|
ItemsContainer.Add(panel);
|
||||||
|
|
||||||
|
panel.PreviewPlaying.ValueChanged += newValue =>
|
||||||
|
{
|
||||||
|
if (newValue)
|
||||||
|
{
|
||||||
|
if (playing != null && playing != panel)
|
||||||
|
playing.PreviewPlaying.Value = false;
|
||||||
|
playing = panel;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
Api.Queue(subReq);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Api.Queue(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,9 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
|
using osu.Game.Overlays.Profile.Sections.Beatmaps;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Profile.Sections
|
namespace osu.Game.Overlays.Profile.Sections
|
||||||
{
|
{
|
||||||
public class BeatmapsSection : ProfileSection
|
public class BeatmapsSection : ProfileSection
|
||||||
@ -8,5 +11,14 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
public override string Title => "Beatmaps";
|
public override string Title => "Beatmaps";
|
||||||
|
|
||||||
public override string Identifier => "beatmaps";
|
public override string Identifier => "beatmaps";
|
||||||
|
|
||||||
|
public BeatmapsSection()
|
||||||
|
{
|
||||||
|
Children = new[]
|
||||||
|
{
|
||||||
|
new PaginatedBeatmapContainer(BeatmapSetType.Favourite, User, "Favourite Beatmaps", "None... yet."),
|
||||||
|
new PaginatedBeatmapContainer(BeatmapSetType.RankedAndApproved, User, "Ranked & Approved Beatmaps", "None... yet."),
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
|
|
||||||
public HistoricalSection()
|
public HistoricalSection()
|
||||||
{
|
{
|
||||||
Child = new PaginatedScoreContainer(ScoreType.Recent, User, "Recent Plays (24h)");
|
Child = new PaginatedScoreContainer(ScoreType.Recent, User, "Recent Plays (24h)", "No performance records. :(");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
109
osu.Game/Overlays/Profile/Sections/PaginatedContainer.cs
Normal file
109
osu.Game/Overlays/Profile/Sections/PaginatedContainer.cs
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using OpenTK;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Configuration;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
using osu.Game.Users;
|
||||||
|
|
||||||
|
namespace osu.Game.Overlays.Profile.Sections
|
||||||
|
{
|
||||||
|
public class PaginatedContainer : FillFlowContainer
|
||||||
|
{
|
||||||
|
protected readonly FillFlowContainer ItemsContainer;
|
||||||
|
protected readonly OsuHoverContainer ShowMoreButton;
|
||||||
|
protected readonly LoadingAnimation ShowMoreLoading;
|
||||||
|
protected readonly OsuSpriteText MissingText;
|
||||||
|
|
||||||
|
protected int VisiblePages;
|
||||||
|
protected int ItemsPerPage;
|
||||||
|
|
||||||
|
protected readonly Bindable<User> User = new Bindable<User>();
|
||||||
|
|
||||||
|
protected APIAccess Api;
|
||||||
|
protected RulesetStore Rulesets;
|
||||||
|
|
||||||
|
public PaginatedContainer(Bindable<User> user, string header, string missing)
|
||||||
|
{
|
||||||
|
User.BindTo(user);
|
||||||
|
|
||||||
|
RelativeSizeAxes = Axes.X;
|
||||||
|
AutoSizeAxes = Axes.Y;
|
||||||
|
Direction = FillDirection.Vertical;
|
||||||
|
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new OsuSpriteText
|
||||||
|
{
|
||||||
|
TextSize = 15,
|
||||||
|
Text = header,
|
||||||
|
Font = "Exo2.0-RegularItalic",
|
||||||
|
Margin = new MarginPadding { Top = 10, Bottom = 10 },
|
||||||
|
},
|
||||||
|
ItemsContainer = new FillFlowContainer
|
||||||
|
{
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
},
|
||||||
|
ShowMoreButton = new OsuHoverContainer
|
||||||
|
{
|
||||||
|
Alpha = 0,
|
||||||
|
Action = ShowMore,
|
||||||
|
AutoSizeAxes = Axes.Both,
|
||||||
|
Anchor = Anchor.TopCentre,
|
||||||
|
Origin = Anchor.TopCentre,
|
||||||
|
Child = new OsuSpriteText
|
||||||
|
{
|
||||||
|
TextSize = 14,
|
||||||
|
Text = "show more",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ShowMoreLoading = new LoadingAnimation
|
||||||
|
{
|
||||||
|
Anchor = Anchor.TopCentre,
|
||||||
|
Origin = Anchor.TopCentre,
|
||||||
|
Size = new Vector2(14),
|
||||||
|
},
|
||||||
|
MissingText = new OsuSpriteText
|
||||||
|
{
|
||||||
|
TextSize = 14,
|
||||||
|
Text = missing,
|
||||||
|
Alpha = 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(APIAccess api, RulesetStore rulesets)
|
||||||
|
{
|
||||||
|
Api = api;
|
||||||
|
Rulesets = rulesets;
|
||||||
|
|
||||||
|
User.ValueChanged += onUserChanged;
|
||||||
|
User.TriggerChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onUserChanged(User newUser)
|
||||||
|
{
|
||||||
|
VisiblePages = 0;
|
||||||
|
ItemsContainer.Clear();
|
||||||
|
ShowMoreButton.Hide();
|
||||||
|
|
||||||
|
if (newUser != null)
|
||||||
|
ShowMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void ShowMore()
|
||||||
|
{
|
||||||
|
ShowMoreLoading.Show();
|
||||||
|
ShowMoreButton.Hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -20,7 +20,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private new void load(OsuColour colour)
|
private void load(OsuColour colour)
|
||||||
{
|
{
|
||||||
double pp = Score.PP ?? 0;
|
double pp = Score.PP ?? 0;
|
||||||
Stats.Add(new OsuSpriteText
|
Stats.Add(new OsuSpriteText
|
||||||
|
@ -6,73 +6,119 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Screens.Select.Leaderboards;
|
using osu.Game.Screens.Select.Leaderboards;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.Graphics.Cursor;
|
||||||
|
using osu.Framework.Input;
|
||||||
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
|
using osu.Game.Graphics.Containers;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Profile.Sections.Ranks
|
namespace osu.Game.Overlays.Profile.Sections.Ranks
|
||||||
{
|
{
|
||||||
public abstract class DrawableScore : Container
|
public abstract class DrawableScore : Container
|
||||||
{
|
{
|
||||||
|
private const int fade_duration = 200;
|
||||||
|
|
||||||
protected readonly FillFlowContainer<OsuSpriteText> Stats;
|
protected readonly FillFlowContainer<OsuSpriteText> Stats;
|
||||||
private readonly FillFlowContainer metadata;
|
private readonly FillFlowContainer metadata;
|
||||||
private readonly ScoreModsContainer modsContainer;
|
private readonly ScoreModsContainer modsContainer;
|
||||||
protected readonly Score Score;
|
protected readonly Score Score;
|
||||||
|
private readonly Box underscoreLine;
|
||||||
|
private readonly Box coloredBackground;
|
||||||
|
private readonly Container background;
|
||||||
|
|
||||||
protected DrawableScore(Score score)
|
protected DrawableScore(Score score)
|
||||||
{
|
{
|
||||||
Score = score;
|
Score = score;
|
||||||
|
|
||||||
|
RelativeSizeAxes = Axes.X;
|
||||||
|
Height = 60;
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new DrawableRank(score.Rank)
|
background = new Container
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Y,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Width = 60,
|
Masking = true,
|
||||||
FillMode = FillMode.Fit,
|
CornerRadius = 3,
|
||||||
},
|
Alpha = 0,
|
||||||
Stats = new FillFlowContainer<OsuSpriteText>
|
EdgeEffect = new EdgeEffectParameters
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Anchor = Anchor.CentreRight,
|
|
||||||
Origin = Anchor.CentreRight,
|
|
||||||
Direction = FillDirection.Vertical,
|
|
||||||
},
|
|
||||||
metadata = new FillFlowContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
Origin = Anchor.CentreLeft,
|
|
||||||
Margin = new MarginPadding { Left = 70 },
|
|
||||||
Direction = FillDirection.Vertical,
|
|
||||||
Child = new OsuSpriteText
|
|
||||||
{
|
{
|
||||||
Text = score.Date.LocalDateTime.ToShortDateString(),
|
Type = EdgeEffectType.Shadow,
|
||||||
TextSize = 11,
|
Offset = new Vector2(0f, 1f),
|
||||||
Colour = OsuColour.Gray(0xAA),
|
Radius = 1f,
|
||||||
Depth = -1,
|
Colour = Color4.Black.Opacity(0.2f),
|
||||||
},
|
},
|
||||||
|
Child = coloredBackground = new Box { RelativeSizeAxes = Axes.Both }
|
||||||
},
|
},
|
||||||
modsContainer = new ScoreModsContainer
|
new Container
|
||||||
{
|
{
|
||||||
AutoSizeAxes = Axes.Y,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Anchor = Anchor.CentreRight,
|
Anchor = Anchor.TopCentre,
|
||||||
Origin = Anchor.CentreRight,
|
Origin = Anchor.TopCentre,
|
||||||
Width = 60,
|
Width = 0.97f,
|
||||||
Margin = new MarginPadding { Right = 150 }
|
Children = new Drawable[]
|
||||||
}
|
{
|
||||||
|
underscoreLine = new Box
|
||||||
|
{
|
||||||
|
Anchor = Anchor.BottomCentre,
|
||||||
|
Origin = Anchor.BottomCentre,
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Height = 1,
|
||||||
|
},
|
||||||
|
new DrawableRank(score.Rank)
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Y,
|
||||||
|
Width = 60,
|
||||||
|
FillMode = FillMode.Fit,
|
||||||
|
},
|
||||||
|
Stats = new FillFlowContainer<OsuSpriteText>
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Anchor = Anchor.CentreRight,
|
||||||
|
Origin = Anchor.CentreRight,
|
||||||
|
Direction = FillDirection.Vertical,
|
||||||
|
},
|
||||||
|
metadata = new FillFlowContainer
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Anchor = Anchor.CentreLeft,
|
||||||
|
Origin = Anchor.CentreLeft,
|
||||||
|
Margin = new MarginPadding { Left = 70 },
|
||||||
|
Direction = FillDirection.Vertical,
|
||||||
|
Child = new OsuSpriteText
|
||||||
|
{
|
||||||
|
Text = score.Date.LocalDateTime.ToShortDateString(),
|
||||||
|
TextSize = 11,
|
||||||
|
Colour = OsuColour.Gray(0xAA),
|
||||||
|
Depth = -1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
modsContainer = new ScoreModsContainer
|
||||||
|
{
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Anchor = Anchor.CentreRight,
|
||||||
|
Origin = Anchor.CentreRight,
|
||||||
|
Width = 60,
|
||||||
|
Margin = new MarginPadding { Right = 160 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader(true)]
|
[BackgroundDependencyLoader(true)]
|
||||||
private void load(OsuColour colour, LocalisationEngine locale, BeatmapSetOverlay beatmapSetOverlay)
|
private void load(OsuColour colour, LocalisationEngine locale, BeatmapSetOverlay beatmapSetOverlay)
|
||||||
{
|
{
|
||||||
|
coloredBackground.Colour = underscoreLine.Colour = colour.Gray4;
|
||||||
|
|
||||||
Stats.Add(new OsuSpriteText
|
Stats.Add(new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = $"accuracy: {Score.Accuracy:P2}",
|
Text = $"accuracy: {Score.Accuracy:P2}",
|
||||||
@ -84,7 +130,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
|
|||||||
Depth = -1,
|
Depth = -1,
|
||||||
});
|
});
|
||||||
|
|
||||||
metadata.Add(new OsuHoverContainer
|
metadata.Add(new MetadataContainer(Score.Beatmap.Metadata.Title, Score.Beatmap.Metadata.Artist)
|
||||||
{
|
{
|
||||||
AutoSizeAxes = Axes.Both,
|
AutoSizeAxes = Axes.Both,
|
||||||
Action = () =>
|
Action = () =>
|
||||||
@ -123,5 +169,31 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
|
|||||||
Scale = new Vector2(0.5f),
|
Scale = new Vector2(0.5f),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override bool OnClick(InputState state) => true;
|
||||||
|
|
||||||
|
protected override bool OnHover(InputState state)
|
||||||
|
{
|
||||||
|
background.FadeIn(fade_duration, Easing.OutQuint);
|
||||||
|
underscoreLine.FadeOut(fade_duration, Easing.OutQuint);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnHoverLost(InputState state)
|
||||||
|
{
|
||||||
|
background.FadeOut(fade_duration, Easing.OutQuint);
|
||||||
|
underscoreLine.FadeIn(fade_duration, Easing.OutQuint);
|
||||||
|
base.OnHoverLost(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class MetadataContainer : OsuHoverContainer, IHasTooltip
|
||||||
|
{
|
||||||
|
public string TooltipText { get; set; }
|
||||||
|
|
||||||
|
public MetadataContainer(string title, string artist)
|
||||||
|
{
|
||||||
|
TooltipText = $"{artist} - {title}";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private new void load()
|
private void load()
|
||||||
{
|
{
|
||||||
Stats.Add(new OsuSpriteText
|
Stats.Add(new OsuSpriteText
|
||||||
{
|
{
|
||||||
|
@ -1,130 +1,53 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using OpenTK;
|
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Game.Graphics.Containers;
|
|
||||||
using osu.Game.Graphics.Sprites;
|
|
||||||
using osu.Game.Graphics.UserInterface;
|
|
||||||
using osu.Game.Online.API;
|
|
||||||
using osu.Game.Online.API.Requests;
|
using osu.Game.Online.API.Requests;
|
||||||
using osu.Game.Rulesets;
|
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Profile.Sections.Ranks
|
namespace osu.Game.Overlays.Profile.Sections.Ranks
|
||||||
{
|
{
|
||||||
public class PaginatedScoreContainer : FillFlowContainer
|
public class PaginatedScoreContainer : PaginatedContainer
|
||||||
{
|
{
|
||||||
private readonly FillFlowContainer<DrawableScore> scoreContainer;
|
|
||||||
private readonly OsuSpriteText missing;
|
|
||||||
private readonly OsuHoverContainer showMoreButton;
|
|
||||||
private readonly LoadingAnimation showMoreLoading;
|
|
||||||
|
|
||||||
private readonly bool includeWeight;
|
private readonly bool includeWeight;
|
||||||
private readonly ScoreType type;
|
private readonly ScoreType type;
|
||||||
private int visiblePages;
|
|
||||||
|
|
||||||
private readonly Bindable<User> user = new Bindable<User>();
|
public PaginatedScoreContainer(ScoreType type, Bindable<User> user, string header, string missing, bool includeWeight = false)
|
||||||
|
: base(user, header, missing)
|
||||||
private RulesetStore rulesets;
|
|
||||||
private APIAccess api;
|
|
||||||
|
|
||||||
public PaginatedScoreContainer(ScoreType type, Bindable<User> user, string header, bool includeWeight = false)
|
|
||||||
{
|
{
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.includeWeight = includeWeight;
|
this.includeWeight = includeWeight;
|
||||||
this.user.BindTo(user);
|
|
||||||
|
|
||||||
RelativeSizeAxes = Axes.X;
|
ItemsPerPage = 5;
|
||||||
AutoSizeAxes = Axes.Y;
|
|
||||||
Direction = FillDirection.Vertical;
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
ItemsContainer.Direction = FillDirection.Vertical;
|
||||||
{
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
TextSize = 15,
|
|
||||||
Text = header,
|
|
||||||
Font = "Exo2.0-RegularItalic",
|
|
||||||
Margin = new MarginPadding { Top = 10, Bottom = 10 },
|
|
||||||
},
|
|
||||||
scoreContainer = new FillFlowContainer<DrawableScore>
|
|
||||||
{
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Direction = FillDirection.Vertical,
|
|
||||||
},
|
|
||||||
showMoreButton = new OsuHoverContainer
|
|
||||||
{
|
|
||||||
Alpha = 0,
|
|
||||||
Action = showMore,
|
|
||||||
AutoSizeAxes = Axes.Both,
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Child = new OsuSpriteText
|
|
||||||
{
|
|
||||||
TextSize = 14,
|
|
||||||
Text = "show more",
|
|
||||||
}
|
|
||||||
},
|
|
||||||
showMoreLoading = new LoadingAnimation
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Size = new Vector2(14),
|
|
||||||
},
|
|
||||||
missing = new OsuSpriteText
|
|
||||||
{
|
|
||||||
TextSize = 14,
|
|
||||||
Text = type == ScoreType.Recent ? "No performance records. :(" : "No awesome performance records yet. :(",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
protected override void ShowMore()
|
||||||
private void load(APIAccess api, RulesetStore rulesets)
|
|
||||||
{
|
{
|
||||||
this.api = api;
|
base.ShowMore();
|
||||||
this.rulesets = rulesets;
|
|
||||||
|
|
||||||
user.ValueChanged += user_ValueChanged;
|
var req = new GetUserScoresRequest(User.Value.Id, type, VisiblePages++ * ItemsPerPage);
|
||||||
user.TriggerChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void user_ValueChanged(User newUser)
|
|
||||||
{
|
|
||||||
visiblePages = 0;
|
|
||||||
scoreContainer.Clear();
|
|
||||||
showMoreButton.Hide();
|
|
||||||
missing.Show();
|
|
||||||
|
|
||||||
if (newUser != null)
|
|
||||||
showMore();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showMore()
|
|
||||||
{
|
|
||||||
var req = new GetUserScoresRequest(user.Value.Id, type, visiblePages++ * 5);
|
|
||||||
|
|
||||||
showMoreLoading.Show();
|
|
||||||
showMoreButton.Hide();
|
|
||||||
|
|
||||||
req.Success += scores =>
|
req.Success += scores =>
|
||||||
{
|
{
|
||||||
foreach (var s in scores)
|
foreach (var s in scores)
|
||||||
s.ApplyRuleset(rulesets.GetRuleset(s.OnlineRulesetID));
|
s.ApplyRuleset(Rulesets.GetRuleset(s.OnlineRulesetID));
|
||||||
|
|
||||||
showMoreButton.FadeTo(scores.Count == 5 ? 1 : 0);
|
ShowMoreButton.FadeTo(scores.Count == ItemsPerPage ? 1 : 0);
|
||||||
showMoreLoading.Hide();
|
ShowMoreLoading.Hide();
|
||||||
|
|
||||||
if (!scores.Any()) return;
|
if (!scores.Any())
|
||||||
|
{
|
||||||
|
MissingText.Show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
missing.Hide();
|
MissingText.Hide();
|
||||||
|
|
||||||
foreach (OnlineScore score in scores)
|
foreach (OnlineScore score in scores)
|
||||||
{
|
{
|
||||||
@ -133,21 +56,18 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
|
|||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
drawableScore = new DrawablePerformanceScore(score, includeWeight ? Math.Pow(0.95, scoreContainer.Count) : (double?)null);
|
drawableScore = new DrawablePerformanceScore(score, includeWeight ? Math.Pow(0.95, ItemsContainer.Count) : (double?)null);
|
||||||
break;
|
break;
|
||||||
case ScoreType.Recent:
|
case ScoreType.Recent:
|
||||||
drawableScore = new DrawableTotalScore(score);
|
drawableScore = new DrawableTotalScore(score);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
drawableScore.RelativeSizeAxes = Axes.X;
|
ItemsContainer.Add(drawableScore);
|
||||||
drawableScore.Height = 60;
|
|
||||||
|
|
||||||
scoreContainer.Add(drawableScore);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
api.Queue(req);
|
Api.Queue(req);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,8 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
{
|
{
|
||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
new PaginatedScoreContainer(ScoreType.Best, User, "Best Performance", true),
|
new PaginatedScoreContainer(ScoreType.Best, User, "Best Performance", "No performance records. :(", true),
|
||||||
new PaginatedScoreContainer(ScoreType.Firsts, User, "First Place Ranks"),
|
new PaginatedScoreContainer(ScoreType.Firsts, User, "First Place Ranks", "No awesome performance records yet. :("),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,12 +91,12 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
sections = new ProfileSection[]
|
sections = new ProfileSection[]
|
||||||
{
|
{
|
||||||
new AboutSection(),
|
//new AboutSection(),
|
||||||
//new RecentSection(),
|
//new RecentSection(),
|
||||||
new RanksSection(),
|
new RanksSection(),
|
||||||
//new MedalsSection(),
|
//new MedalsSection(),
|
||||||
new HistoricalSection(),
|
new HistoricalSection(),
|
||||||
//new BeatmapsSection(),
|
new BeatmapsSection(),
|
||||||
//new KudosuSection()
|
//new KudosuSection()
|
||||||
};
|
};
|
||||||
tabs = new ProfileTabControl
|
tabs = new ProfileTabControl
|
||||||
|
@ -212,6 +212,7 @@ namespace osu.Game.Rulesets.Objects.Drawables
|
|||||||
nestedHitObjects = new List<DrawableHitObject<TObject>>();
|
nestedHitObjects = new List<DrawableHitObject<TObject>>();
|
||||||
|
|
||||||
h.OnJudgement += (d, j) => OnJudgement?.Invoke(d, j);
|
h.OnJudgement += (d, j) => OnJudgement?.Invoke(d, j);
|
||||||
|
h.OnJudgementRemoved += (d, j) => OnJudgementRemoved?.Invoke(d, j);
|
||||||
nestedHitObjects.Add(h);
|
nestedHitObjects.Add(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,7 +242,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
OnJudgement?.Invoke(j);
|
OnJudgement?.Invoke(j);
|
||||||
};
|
};
|
||||||
|
|
||||||
drawableObject.OnJudgementRemoved += (d, j) => { OnJudgementRemoved?.Invoke(j); };
|
drawableObject.OnJudgementRemoved += (d, j) => OnJudgementRemoved?.Invoke(j);
|
||||||
|
|
||||||
Playfield.Add(drawableObject);
|
Playfield.Add(drawableObject);
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,8 @@ namespace osu.Game.Rulesets.UI
|
|||||||
|
|
||||||
#region Clock control
|
#region Clock control
|
||||||
|
|
||||||
|
protected override bool ShouldProcessClock => false; // We handle processing the clock ourselves
|
||||||
|
|
||||||
private ManualClock clock;
|
private ManualClock clock;
|
||||||
private IFrameBasedClock parentClock;
|
private IFrameBasedClock parentClock;
|
||||||
|
|
||||||
@ -151,6 +153,12 @@ namespace osu.Game.Rulesets.UI
|
|||||||
}
|
}
|
||||||
|
|
||||||
requireMoreUpdateLoops = clock.CurrentTime != parentClock.CurrentTime;
|
requireMoreUpdateLoops = clock.CurrentTime != parentClock.CurrentTime;
|
||||||
|
|
||||||
|
// The manual clock time has changed in the above code. The framed clock now needs to be updated
|
||||||
|
// to ensure that the its time is valid for our children before input is processed
|
||||||
|
Clock.ProcessFrame();
|
||||||
|
|
||||||
|
// Process input
|
||||||
base.Update();
|
base.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,6 @@ namespace osu.Game.Screens
|
|||||||
{
|
{
|
||||||
base.LogoArriving(logo, resuming);
|
base.LogoArriving(logo, resuming);
|
||||||
|
|
||||||
logo.RelativePositionAxes = Axes.None;
|
|
||||||
logo.Triangles = false;
|
logo.Triangles = false;
|
||||||
logo.Origin = Anchor.BottomRight;
|
logo.Origin = Anchor.BottomRight;
|
||||||
logo.Anchor = Anchor.BottomRight;
|
logo.Anchor = Anchor.BottomRight;
|
||||||
@ -47,11 +46,7 @@ namespace osu.Game.Screens
|
|||||||
protected override void LogoSuspending(OsuLogo logo)
|
protected override void LogoSuspending(OsuLogo logo)
|
||||||
{
|
{
|
||||||
base.LogoSuspending(logo);
|
base.LogoSuspending(logo);
|
||||||
logo.FadeOut(100).OnComplete(l =>
|
logo.FadeOut(100);
|
||||||
{
|
|
||||||
l.Anchor = Anchor.TopLeft;
|
|
||||||
l.Origin = Anchor.Centre;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
|
@ -127,8 +127,6 @@ namespace osu.Game.Screens.Menu
|
|||||||
|
|
||||||
if (!resuming)
|
if (!resuming)
|
||||||
{
|
{
|
||||||
logo.Triangles = true;
|
|
||||||
|
|
||||||
logo.ScaleTo(1);
|
logo.ScaleTo(1);
|
||||||
logo.FadeIn();
|
logo.FadeIn();
|
||||||
logo.PlayIntro();
|
logo.PlayIntro();
|
||||||
|
@ -112,9 +112,6 @@ namespace osu.Game.Screens.Menu
|
|||||||
|
|
||||||
buttons.SetOsuLogo(logo);
|
buttons.SetOsuLogo(logo);
|
||||||
|
|
||||||
logo.Triangles = true;
|
|
||||||
logo.Ripple = false;
|
|
||||||
|
|
||||||
logo.FadeColour(Color4.White, 100, Easing.OutQuint);
|
logo.FadeColour(Color4.White, 100, Easing.OutQuint);
|
||||||
logo.FadeIn(100, Easing.OutQuint);
|
logo.FadeIn(100, Easing.OutQuint);
|
||||||
|
|
||||||
|
@ -221,6 +221,30 @@ namespace osu.Game.Screens.Menu
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Schedule a new extenral animation. Handled queueing and finishing previous animations in a sane way.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="action">The animation to be performed</param>
|
||||||
|
/// <param name="waitForPrevious">If true, the new animation is delayed until all previous transforms finish. If false, existing transformed are cleared.</param>
|
||||||
|
internal void AppendAnimatingAction(Action action, bool waitForPrevious)
|
||||||
|
{
|
||||||
|
Action runnableAction = () =>
|
||||||
|
{
|
||||||
|
if (waitForPrevious)
|
||||||
|
this.DelayUntilTransformsFinished().Schedule(action);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClearTransforms();
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (IsLoaded)
|
||||||
|
runnableAction();
|
||||||
|
else
|
||||||
|
Schedule(() => runnableAction());
|
||||||
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(TextureStore textures, AudioManager audio)
|
private void load(TextureStore textures, AudioManager audio)
|
||||||
{
|
{
|
||||||
|
@ -76,7 +76,7 @@ namespace osu.Game.Screens
|
|||||||
protected override void OnResuming(Screen last)
|
protected override void OnResuming(Screen last)
|
||||||
{
|
{
|
||||||
base.OnResuming(last);
|
base.OnResuming(last);
|
||||||
logo.DelayUntilTransformsFinished().Schedule(() => LogoArriving(logo, true));
|
logo.AppendAnimatingAction(() => LogoArriving(logo, true), true);
|
||||||
sampleExit?.Play();
|
sampleExit?.Play();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,11 +118,11 @@ namespace osu.Game.Screens
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((logo = lastOsu?.logo) == null)
|
if ((logo = lastOsu?.logo) == null)
|
||||||
AddInternal(logo = new OsuLogo());
|
LoadComponentAsync(logo = new OsuLogo { Alpha = 0 }, AddInternal);
|
||||||
|
|
||||||
|
logo.AppendAnimatingAction(() => LogoArriving(logo, false), true);
|
||||||
|
|
||||||
base.OnEntering(last);
|
base.OnEntering(last);
|
||||||
|
|
||||||
logo.DelayUntilTransformsFinished().Schedule(() => LogoArriving(logo, false));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool OnExiting(Screen next)
|
protected override bool OnExiting(Screen next)
|
||||||
@ -155,12 +155,16 @@ namespace osu.Game.Screens
|
|||||||
{
|
{
|
||||||
logo.Action = null;
|
logo.Action = null;
|
||||||
logo.FadeOut(300, Easing.OutQuint);
|
logo.FadeOut(300, Easing.OutQuint);
|
||||||
|
logo.Anchor = Anchor.TopLeft;
|
||||||
|
logo.Origin = Anchor.Centre;
|
||||||
|
logo.RelativePositionAxes = Axes.None;
|
||||||
|
logo.Triangles = true;
|
||||||
|
logo.Ripple = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onExitingLogo()
|
private void onExitingLogo()
|
||||||
{
|
{
|
||||||
logo.ClearTransforms();
|
logo.AppendAnimatingAction(() => { LogoExiting(logo); }, false);
|
||||||
LogoExiting(logo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -172,8 +176,7 @@ namespace osu.Game.Screens
|
|||||||
|
|
||||||
private void onSuspendingLogo()
|
private void onSuspendingLogo()
|
||||||
{
|
{
|
||||||
logo.ClearTransforms();
|
logo.AppendAnimatingAction(() => { LogoSuspending(logo); }, false);
|
||||||
LogoSuspending(logo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -144,22 +144,6 @@ namespace osu.Game.Screens.Play
|
|||||||
userAudioOffset.ValueChanged += v => offsetClock.Offset = v;
|
userAudioOffset.ValueChanged += v => offsetClock.Offset = v;
|
||||||
userAudioOffset.TriggerChange();
|
userAudioOffset.TriggerChange();
|
||||||
|
|
||||||
Task.Run(() =>
|
|
||||||
{
|
|
||||||
adjustableSourceClock.Reset();
|
|
||||||
|
|
||||||
// this is temporary until we have blocking (async.Wait()) audio component methods.
|
|
||||||
// then we can call ResetAsync().Wait() or the blocking version above.
|
|
||||||
while (adjustableSourceClock.IsRunning)
|
|
||||||
Thread.Sleep(1);
|
|
||||||
|
|
||||||
Schedule(() =>
|
|
||||||
{
|
|
||||||
decoupledClock.ChangeSource(adjustableSourceClock);
|
|
||||||
applyRateFromMods();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
storyboardContainer = new Container
|
storyboardContainer = new Container
|
||||||
@ -329,10 +313,26 @@ namespace osu.Game.Screens.Play
|
|||||||
.Delay(250)
|
.Delay(250)
|
||||||
.FadeIn(250);
|
.FadeIn(250);
|
||||||
|
|
||||||
this.Delay(750).Schedule(() =>
|
Task.Run(() =>
|
||||||
{
|
{
|
||||||
if (!pauseContainer.IsPaused)
|
adjustableSourceClock.Reset();
|
||||||
decoupledClock.Start();
|
|
||||||
|
// this is temporary until we have blocking (async.Wait()) audio component methods.
|
||||||
|
// then we can call ResetAsync().Wait() or the blocking version above.
|
||||||
|
while (adjustableSourceClock.IsRunning)
|
||||||
|
Thread.Sleep(1);
|
||||||
|
|
||||||
|
Schedule(() =>
|
||||||
|
{
|
||||||
|
decoupledClock.ChangeSource(adjustableSourceClock);
|
||||||
|
applyRateFromMods();
|
||||||
|
|
||||||
|
this.Delay(750).Schedule(() =>
|
||||||
|
{
|
||||||
|
if (!pauseContainer.IsPaused)
|
||||||
|
decoupledClock.Start();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
pauseContainer.Alpha = 0;
|
pauseContainer.Alpha = 0;
|
||||||
|
@ -99,7 +99,6 @@ namespace osu.Game.Screens.Play
|
|||||||
{
|
{
|
||||||
base.LogoArriving(logo, resuming);
|
base.LogoArriving(logo, resuming);
|
||||||
|
|
||||||
logo.ClearTransforms(targetMember: nameof(Position));
|
|
||||||
logo.RelativePositionAxes = Axes.Both;
|
logo.RelativePositionAxes = Axes.Both;
|
||||||
|
|
||||||
logo.ScaleTo(new Vector2(0.15f), 300, Easing.In);
|
logo.ScaleTo(new Vector2(0.15f), 300, Easing.In);
|
||||||
|
@ -3,11 +3,16 @@
|
|||||||
|
|
||||||
using osu.Framework.Timing;
|
using osu.Framework.Timing;
|
||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics.Sprites;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Play.ReplaySettings
|
namespace osu.Game.Screens.Play.ReplaySettings
|
||||||
{
|
{
|
||||||
public class PlaybackSettings : ReplayGroup
|
public class PlaybackSettings : ReplayGroup
|
||||||
{
|
{
|
||||||
|
private const int padding = 10;
|
||||||
|
|
||||||
protected override string Title => @"playback";
|
protected override string Title => @"playback";
|
||||||
|
|
||||||
public IAdjustableClock AdjustableClock { set; get; }
|
public IAdjustableClock AdjustableClock { set; get; }
|
||||||
@ -16,17 +21,45 @@ namespace osu.Game.Screens.Play.ReplaySettings
|
|||||||
|
|
||||||
public PlaybackSettings()
|
public PlaybackSettings()
|
||||||
{
|
{
|
||||||
Child = sliderbar = new ReplaySliderBar<double>
|
OsuSpriteText multiplierText;
|
||||||
|
|
||||||
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
LabelText = "Playback speed",
|
new Container
|
||||||
Bindable = new BindableDouble(1)
|
|
||||||
{
|
{
|
||||||
Default = 1,
|
RelativeSizeAxes = Axes.X,
|
||||||
MinValue = 0.5,
|
AutoSizeAxes = Axes.Y,
|
||||||
MaxValue = 2,
|
Padding = new MarginPadding { Horizontal = padding },
|
||||||
Precision = 0.01,
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new OsuSpriteText
|
||||||
|
{
|
||||||
|
Anchor = Anchor.CentreLeft,
|
||||||
|
Origin = Anchor.CentreLeft,
|
||||||
|
Text = "Playback speed",
|
||||||
|
},
|
||||||
|
multiplierText = new OsuSpriteText
|
||||||
|
{
|
||||||
|
Anchor = Anchor.CentreRight,
|
||||||
|
Origin = Anchor.CentreRight,
|
||||||
|
Text = "1x",
|
||||||
|
Font = @"Exo2.0-Bold",
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
sliderbar = new ReplaySliderBar<double>
|
||||||
|
{
|
||||||
|
Bindable = new BindableDouble(1)
|
||||||
|
{
|
||||||
|
Default = 1,
|
||||||
|
MinValue = 0.5,
|
||||||
|
MaxValue = 2,
|
||||||
|
Precision = 0.01,
|
||||||
|
},
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sliderbar.Bindable.ValueChanged += rateMultiplier => multiplierText.Text = $"{rateMultiplier}x";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
|
@ -315,9 +315,7 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
base.LogoArriving(logo, resuming);
|
base.LogoArriving(logo, resuming);
|
||||||
|
|
||||||
logo.ClearTransforms();
|
|
||||||
logo.RelativePositionAxes = Axes.Both;
|
logo.RelativePositionAxes = Axes.Both;
|
||||||
|
|
||||||
Vector2 position = new Vector2(0.95f, 0.96f);
|
Vector2 position = new Vector2(0.95f, 0.96f);
|
||||||
|
|
||||||
if (logo.Alpha > 0.8f)
|
if (logo.Alpha > 0.8f)
|
||||||
|
@ -88,6 +88,9 @@
|
|||||||
<HintPath>$(SolutionDir)\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="Humanizer, Version=2.2.0.0, Culture=neutral, PublicKeyToken=979442b78dfc278e, processorArchitecture=MSIL">
|
||||||
|
<HintPath>$(SolutionDir)\packages\Humanizer.Core.2.2.0\lib\netstandard1.0\Humanizer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Microsoft.Data.Sqlite, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.Data.Sqlite, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.Data.Sqlite.Core.2.0.0\lib\netstandard2.0\Microsoft.Data.Sqlite.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\Microsoft.Data.Sqlite.Core.2.0.0\lib\netstandard2.0\Microsoft.Data.Sqlite.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
@ -283,6 +286,9 @@
|
|||||||
<Compile Include="Overlays\BeatmapSet\Scores\DrawableScore.cs" />
|
<Compile Include="Overlays\BeatmapSet\Scores\DrawableScore.cs" />
|
||||||
<Compile Include="Overlays\BeatmapSet\Scores\DrawableTopScore.cs" />
|
<Compile Include="Overlays\BeatmapSet\Scores\DrawableTopScore.cs" />
|
||||||
<Compile Include="Overlays\BeatmapSet\Scores\ScoresContainer.cs" />
|
<Compile Include="Overlays\BeatmapSet\Scores\ScoresContainer.cs" />
|
||||||
|
<Compile Include="Online\API\Requests\GetUserBeatmapsRequest.cs" />
|
||||||
|
<Compile Include="Overlays\Profile\Sections\Beatmaps\PaginatedBeatmapContainer.cs" />
|
||||||
|
<Compile Include="Overlays\Profile\Sections\PaginatedContainer.cs" />
|
||||||
<Compile Include="Overlays\Profile\Sections\Ranks\DrawablePerformanceScore.cs" />
|
<Compile Include="Overlays\Profile\Sections\Ranks\DrawablePerformanceScore.cs" />
|
||||||
<Compile Include="Overlays\Profile\Sections\Ranks\PaginatedScoreContainer.cs" />
|
<Compile Include="Overlays\Profile\Sections\Ranks\PaginatedScoreContainer.cs" />
|
||||||
<Compile Include="Overlays\Profile\Sections\Ranks\DrawableTotalScore.cs" />
|
<Compile Include="Overlays\Profile\Sections\Ranks\DrawableTotalScore.cs" />
|
||||||
|
@ -5,6 +5,48 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste
|
|||||||
-->
|
-->
|
||||||
<packages>
|
<packages>
|
||||||
<package id="DotNetZip" version="1.10.1" targetFramework="net461" />
|
<package id="DotNetZip" version="1.10.1" targetFramework="net461" />
|
||||||
|
<package id="Humanizer" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.af" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.ar" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.bg" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.bn-BD" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.cs" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.da" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.de" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.el" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.es" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.fa" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.fi-FI" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.fr" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.fr-BE" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.he" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.hr" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.hu" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.id" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.it" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.ja" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.lv" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.nb" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.nb-NO" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.nl" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.pl" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.pt" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.ro" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.ru" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.sk" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.sl" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.sr" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.sr-Latn" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.sv" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.tr" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.uk" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.uz-Cyrl-UZ" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.uz-Latn-UZ" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.vi" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.zh-CN" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.zh-Hans" version="2.2.0" targetFramework="net461" />
|
||||||
|
<package id="Humanizer.Core.zh-Hant" version="2.2.0" targetFramework="net461" />
|
||||||
<package id="Microsoft.CSharp" version="4.4.0" targetFramework="net461" />
|
<package id="Microsoft.CSharp" version="4.4.0" targetFramework="net461" />
|
||||||
<package id="Microsoft.Data.Sqlite.Core" version="2.0.0" targetFramework="net461" />
|
<package id="Microsoft.Data.Sqlite.Core" version="2.0.0" targetFramework="net461" />
|
||||||
<package id="Microsoft.EntityFrameworkCore" version="2.0.0" targetFramework="net461" />
|
<package id="Microsoft.EntityFrameworkCore" version="2.0.0" targetFramework="net461" />
|
||||||
|
Loading…
Reference in New Issue
Block a user