mirror of
https://github.com/ppy/osu.git
synced 2025-02-06 04:53:06 +08:00
Merge branch 'master' into first-run-setup
This commit is contained in:
commit
7d8cf1bbb6
108
osu.Game.Rulesets.Osu.Tests/LegacyMainCirclePieceTest.cs
Normal file
108
osu.Game.Rulesets.Osu.Tests/LegacyMainCirclePieceTest.cs
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Graphics.OpenGL.Textures;
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
|
using osu.Framework.Graphics.Textures;
|
||||||
|
using osu.Framework.Testing;
|
||||||
|
using osu.Game.Rulesets.Osu.Skinning.Legacy;
|
||||||
|
using osu.Game.Skinning;
|
||||||
|
using osu.Game.Tests.Visual;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Tests
|
||||||
|
{
|
||||||
|
[HeadlessTest]
|
||||||
|
public class LegacyMainCirclePieceTest : OsuTestScene
|
||||||
|
{
|
||||||
|
private static readonly object?[][] texture_priority_cases =
|
||||||
|
{
|
||||||
|
// default priority lookup
|
||||||
|
new object?[]
|
||||||
|
{
|
||||||
|
// available textures
|
||||||
|
new[] { @"hitcircle", @"hitcircleoverlay" },
|
||||||
|
// priority lookup prefix
|
||||||
|
null,
|
||||||
|
// expected circle and overlay
|
||||||
|
@"hitcircle", @"hitcircleoverlay",
|
||||||
|
},
|
||||||
|
// custom priority lookup
|
||||||
|
new object?[]
|
||||||
|
{
|
||||||
|
new[] { @"hitcircle", @"hitcircleoverlay", @"sliderstartcircle", @"sliderstartcircleoverlay" },
|
||||||
|
@"sliderstartcircle",
|
||||||
|
@"sliderstartcircle", @"sliderstartcircleoverlay",
|
||||||
|
},
|
||||||
|
// when no sprites are available for the specified prefix, fall back to "hitcircle"/"hitcircleoverlay".
|
||||||
|
new object?[]
|
||||||
|
{
|
||||||
|
new[] { @"hitcircle", @"hitcircleoverlay" },
|
||||||
|
@"sliderstartcircle",
|
||||||
|
@"hitcircle", @"hitcircleoverlay",
|
||||||
|
},
|
||||||
|
// when a circle is available for the specified prefix but no overlay exists, no overlay is displayed.
|
||||||
|
new object?[]
|
||||||
|
{
|
||||||
|
new[] { @"hitcircle", @"hitcircleoverlay", @"sliderstartcircle" },
|
||||||
|
@"sliderstartcircle",
|
||||||
|
@"sliderstartcircle", null
|
||||||
|
},
|
||||||
|
// when no circle is available for the specified prefix but an overlay exists, the overlay is ignored.
|
||||||
|
new object?[]
|
||||||
|
{
|
||||||
|
new[] { @"hitcircle", @"hitcircleoverlay", @"sliderstartcircleoverlay" },
|
||||||
|
@"sliderstartcircle",
|
||||||
|
@"hitcircle", @"hitcircleoverlay",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
[TestCaseSource(nameof(texture_priority_cases))]
|
||||||
|
public void TestTexturePriorities(string[] textureFilenames, string priorityLookup, string? expectedCircle, string? expectedOverlay)
|
||||||
|
{
|
||||||
|
TestLegacyMainCirclePiece piece = null!;
|
||||||
|
|
||||||
|
AddStep("load circle piece", () =>
|
||||||
|
{
|
||||||
|
var skin = new Mock<ISkinSource>();
|
||||||
|
|
||||||
|
// shouldn't be required as GetTexture(string) calls GetTexture(string, WrapMode, WrapMode) by default,
|
||||||
|
// but moq doesn't handle that well, therefore explicitly requiring to use `CallBase`:
|
||||||
|
// https://github.com/moq/moq4/issues/972
|
||||||
|
skin.Setup(s => s.GetTexture(It.IsAny<string>())).CallBase();
|
||||||
|
|
||||||
|
skin.Setup(s => s.GetTexture(It.IsIn(textureFilenames), It.IsAny<WrapMode>(), It.IsAny<WrapMode>()))
|
||||||
|
.Returns((string componentName, WrapMode _, WrapMode __) => new Texture(1, 1) { AssetName = componentName });
|
||||||
|
|
||||||
|
Child = new DependencyProvidingContainer
|
||||||
|
{
|
||||||
|
CachedDependencies = new (Type, object)[] { (typeof(ISkinSource), skin.Object) },
|
||||||
|
Child = piece = new TestLegacyMainCirclePiece(priorityLookup),
|
||||||
|
};
|
||||||
|
|
||||||
|
var sprites = this.ChildrenOfType<Sprite>().Where(s => s.Texture.AssetName != null).DistinctBy(s => s.Texture.AssetName).ToArray();
|
||||||
|
Debug.Assert(sprites.Length <= 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
AddAssert("check circle sprite", () => piece.CircleSprite?.Texture?.AssetName == expectedCircle);
|
||||||
|
AddAssert("check overlay sprite", () => piece.OverlaySprite?.Texture?.AssetName == expectedOverlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class TestLegacyMainCirclePiece : LegacyMainCirclePiece
|
||||||
|
{
|
||||||
|
public new Sprite? CircleSprite => base.CircleSprite.ChildrenOfType<Sprite>().DistinctBy(s => s.Texture.AssetName).SingleOrDefault();
|
||||||
|
public new Sprite? OverlaySprite => base.OverlaySprite.ChildrenOfType<Sprite>().DistinctBy(s => s.Texture.AssetName).SingleOrDefault();
|
||||||
|
|
||||||
|
public TestLegacyMainCirclePiece(string? priorityLookupPrefix)
|
||||||
|
: base(priorityLookupPrefix, false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Beatmaps
|
namespace osu.Game.Rulesets.Osu.Beatmaps
|
||||||
@ -20,13 +21,13 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
{
|
{
|
||||||
new BeatmapStatistic
|
new BeatmapStatistic
|
||||||
{
|
{
|
||||||
Name = @"Circle Count",
|
Name = BeatmapsetsStrings.ShowStatsCountCircles,
|
||||||
Content = circles.ToString(),
|
Content = circles.ToString(),
|
||||||
CreateIcon = () => new BeatmapStatisticIcon(BeatmapStatisticsIconType.Circles),
|
CreateIcon = () => new BeatmapStatisticIcon(BeatmapStatisticsIconType.Circles),
|
||||||
},
|
},
|
||||||
new BeatmapStatistic
|
new BeatmapStatistic
|
||||||
{
|
{
|
||||||
Name = @"Slider Count",
|
Name = BeatmapsetsStrings.ShowStatsCountSliders,
|
||||||
Content = sliders.ToString(),
|
Content = sliders.ToString(),
|
||||||
CreateIcon = () => new BeatmapStatisticIcon(BeatmapStatisticsIconType.Sliders),
|
CreateIcon = () => new BeatmapStatisticIcon(BeatmapStatisticsIconType.Sliders),
|
||||||
},
|
},
|
||||||
|
@ -3,10 +3,10 @@
|
|||||||
|
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Extensions.ObjectExtensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Graphics.Textures;
|
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
@ -16,63 +16,61 @@ using osu.Game.Skinning;
|
|||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Skinning.Legacy
|
namespace osu.Game.Rulesets.Osu.Skinning.Legacy
|
||||||
{
|
{
|
||||||
public class LegacyMainCirclePiece : CompositeDrawable
|
public class LegacyMainCirclePiece : CompositeDrawable
|
||||||
{
|
{
|
||||||
public override bool RemoveCompletedTransforms => false;
|
public override bool RemoveCompletedTransforms => false;
|
||||||
|
|
||||||
private readonly string priorityLookup;
|
/// <summary>
|
||||||
|
/// A prioritised prefix to perform texture lookups with.
|
||||||
|
/// </summary>
|
||||||
|
private readonly string? priorityLookupPrefix;
|
||||||
|
|
||||||
private readonly bool hasNumber;
|
private readonly bool hasNumber;
|
||||||
|
|
||||||
public LegacyMainCirclePiece(string priorityLookup = null, bool hasNumber = true)
|
protected Drawable CircleSprite = null!;
|
||||||
|
protected Drawable OverlaySprite = null!;
|
||||||
|
|
||||||
|
protected Container OverlayLayer { get; private set; } = null!;
|
||||||
|
|
||||||
|
private SkinnableSpriteText hitCircleText = null!;
|
||||||
|
|
||||||
|
private readonly Bindable<Color4> accentColour = new Bindable<Color4>();
|
||||||
|
private readonly IBindable<int> indexInCurrentCombo = new Bindable<int>();
|
||||||
|
|
||||||
|
[Resolved(canBeNull: true)]
|
||||||
|
private DrawableHitObject? drawableObject { get; set; }
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private ISkinSource skin { get; set; } = null!;
|
||||||
|
|
||||||
|
public LegacyMainCirclePiece(string? priorityLookupPrefix = null, bool hasNumber = true)
|
||||||
{
|
{
|
||||||
this.priorityLookup = priorityLookup;
|
this.priorityLookupPrefix = priorityLookupPrefix;
|
||||||
this.hasNumber = hasNumber;
|
this.hasNumber = hasNumber;
|
||||||
|
|
||||||
Size = new Vector2(OsuHitObject.OBJECT_RADIUS * 2);
|
Size = new Vector2(OsuHitObject.OBJECT_RADIUS * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Drawable hitCircleSprite;
|
|
||||||
|
|
||||||
protected Container OverlayLayer { get; private set; }
|
|
||||||
|
|
||||||
private Drawable hitCircleOverlay;
|
|
||||||
private SkinnableSpriteText hitCircleText;
|
|
||||||
|
|
||||||
private readonly Bindable<Color4> accentColour = new Bindable<Color4>();
|
|
||||||
private readonly IBindable<int> indexInCurrentCombo = new Bindable<int>();
|
|
||||||
|
|
||||||
[Resolved]
|
|
||||||
private DrawableHitObject drawableObject { get; set; }
|
|
||||||
|
|
||||||
[Resolved]
|
|
||||||
private ISkinSource skin { get; set; }
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
var drawableOsuObject = (DrawableOsuHitObject)drawableObject;
|
var drawableOsuObject = (DrawableOsuHitObject?)drawableObject;
|
||||||
|
|
||||||
bool allowFallback = false;
|
// if a base texture for the specified prefix exists, continue using it for subsequent lookups.
|
||||||
|
// otherwise fall back to the default prefix "hitcircle".
|
||||||
// attempt lookup using priority specification
|
string circleName = (priorityLookupPrefix != null && skin.GetTexture(priorityLookupPrefix) != null) ? priorityLookupPrefix : @"hitcircle";
|
||||||
Texture baseTexture = getTextureWithFallback(string.Empty);
|
|
||||||
|
|
||||||
// if the base texture was not found without a fallback, switch on fallback mode and re-perform the lookup.
|
|
||||||
if (baseTexture == null)
|
|
||||||
{
|
|
||||||
allowFallback = true;
|
|
||||||
baseTexture = getTextureWithFallback(string.Empty);
|
|
||||||
}
|
|
||||||
|
|
||||||
// at this point, any further texture fetches should be correctly using the priority source if the base texture was retrieved using it.
|
// at this point, any further texture fetches should be correctly using the priority source if the base texture was retrieved using it.
|
||||||
// the flow above handles the case where a sliderendcircle.png is retrieved from the skin, but sliderendcircleoverlay.png doesn't exist.
|
// the conditional above handles the case where a sliderendcircle.png is retrieved from the skin, but sliderendcircleoverlay.png doesn't exist.
|
||||||
// expected behaviour in this scenario is not showing the overlay, rather than using hitcircleoverlay.png (potentially from the default/fall-through skin).
|
// expected behaviour in this scenario is not showing the overlay, rather than using hitcircleoverlay.png.
|
||||||
|
|
||||||
InternalChildren = new[]
|
InternalChildren = new[]
|
||||||
{
|
{
|
||||||
hitCircleSprite = new KiaiFlashingDrawable(() => new Sprite { Texture = baseTexture })
|
CircleSprite = new KiaiFlashingDrawable(() => new Sprite { Texture = skin.GetTexture(circleName) })
|
||||||
{
|
{
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
@ -81,7 +79,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
|
|||||||
{
|
{
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Child = hitCircleOverlay = new KiaiFlashingDrawable(() => getAnimationWithFallback(@"overlay", 1000 / 2d))
|
Child = OverlaySprite = new KiaiFlashingDrawable(() => skin.GetAnimation(@$"{circleName}overlay", true, true, frameLength: 1000 / 2d))
|
||||||
{
|
{
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
@ -105,39 +103,12 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
|
|||||||
bool overlayAboveNumber = skin.GetConfig<OsuSkinConfiguration, bool>(OsuSkinConfiguration.HitCircleOverlayAboveNumber)?.Value ?? true;
|
bool overlayAboveNumber = skin.GetConfig<OsuSkinConfiguration, bool>(OsuSkinConfiguration.HitCircleOverlayAboveNumber)?.Value ?? true;
|
||||||
|
|
||||||
if (overlayAboveNumber)
|
if (overlayAboveNumber)
|
||||||
OverlayLayer.ChangeChildDepth(hitCircleOverlay, float.MinValue);
|
OverlayLayer.ChangeChildDepth(OverlaySprite, float.MinValue);
|
||||||
|
|
||||||
accentColour.BindTo(drawableObject.AccentColour);
|
if (drawableOsuObject != null)
|
||||||
indexInCurrentCombo.BindTo(drawableOsuObject.IndexInCurrentComboBindable);
|
|
||||||
|
|
||||||
Texture getTextureWithFallback(string name)
|
|
||||||
{
|
{
|
||||||
Texture tex = null;
|
accentColour.BindTo(drawableOsuObject.AccentColour);
|
||||||
|
indexInCurrentCombo.BindTo(drawableOsuObject.IndexInCurrentComboBindable);
|
||||||
if (!string.IsNullOrEmpty(priorityLookup))
|
|
||||||
{
|
|
||||||
tex = skin.GetTexture($"{priorityLookup}{name}");
|
|
||||||
|
|
||||||
if (!allowFallback)
|
|
||||||
return tex;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tex ?? skin.GetTexture($"hitcircle{name}");
|
|
||||||
}
|
|
||||||
|
|
||||||
Drawable getAnimationWithFallback(string name, double frameLength)
|
|
||||||
{
|
|
||||||
Drawable animation = null;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(priorityLookup))
|
|
||||||
{
|
|
||||||
animation = skin.GetAnimation($"{priorityLookup}{name}", true, true, frameLength: frameLength);
|
|
||||||
|
|
||||||
if (!allowFallback)
|
|
||||||
return animation;
|
|
||||||
}
|
|
||||||
|
|
||||||
return animation ?? skin.GetAnimation($"hitcircle{name}", true, true, frameLength: frameLength);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,28 +116,31 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
|
|||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
accentColour.BindValueChanged(colour => hitCircleSprite.Colour = LegacyColourCompatibility.DisallowZeroAlpha(colour.NewValue), true);
|
accentColour.BindValueChanged(colour => CircleSprite.Colour = LegacyColourCompatibility.DisallowZeroAlpha(colour.NewValue), true);
|
||||||
if (hasNumber)
|
if (hasNumber)
|
||||||
indexInCurrentCombo.BindValueChanged(index => hitCircleText.Text = (index.NewValue + 1).ToString(), true);
|
indexInCurrentCombo.BindValueChanged(index => hitCircleText.Text = (index.NewValue + 1).ToString(), true);
|
||||||
|
|
||||||
drawableObject.ApplyCustomUpdateState += updateStateTransforms;
|
if (drawableObject != null)
|
||||||
updateStateTransforms(drawableObject, drawableObject.State.Value);
|
{
|
||||||
|
drawableObject.ApplyCustomUpdateState += updateStateTransforms;
|
||||||
|
updateStateTransforms(drawableObject, drawableObject.State.Value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateStateTransforms(DrawableHitObject drawableHitObject, ArmedState state)
|
private void updateStateTransforms(DrawableHitObject drawableHitObject, ArmedState state)
|
||||||
{
|
{
|
||||||
const double legacy_fade_duration = 240;
|
const double legacy_fade_duration = 240;
|
||||||
|
|
||||||
using (BeginAbsoluteSequence(drawableObject.HitStateUpdateTime))
|
using (BeginAbsoluteSequence(drawableObject.AsNonNull().HitStateUpdateTime))
|
||||||
{
|
{
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case ArmedState.Hit:
|
case ArmedState.Hit:
|
||||||
hitCircleSprite.FadeOut(legacy_fade_duration, Easing.Out);
|
CircleSprite.FadeOut(legacy_fade_duration, Easing.Out);
|
||||||
hitCircleSprite.ScaleTo(1.4f, legacy_fade_duration, Easing.Out);
|
CircleSprite.ScaleTo(1.4f, legacy_fade_duration, Easing.Out);
|
||||||
|
|
||||||
hitCircleOverlay.FadeOut(legacy_fade_duration, Easing.Out);
|
OverlaySprite.FadeOut(legacy_fade_duration, Easing.Out);
|
||||||
hitCircleOverlay.ScaleTo(1.4f, legacy_fade_duration, Easing.Out);
|
OverlaySprite.ScaleTo(1.4f, legacy_fade_duration, Easing.Out);
|
||||||
|
|
||||||
if (hasNumber)
|
if (hasNumber)
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
// 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.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Testing;
|
||||||
|
using osu.Game.Overlays.Mods;
|
||||||
|
using osu.Game.Screens.OnlinePlay;
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.Visual.Multiplayer
|
||||||
|
{
|
||||||
|
public class TestSceneFreeModSelectScreen : MultiplayerTestScene
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void TestFreeModSelect()
|
||||||
|
{
|
||||||
|
FreeModSelectScreen freeModSelectScreen = null;
|
||||||
|
|
||||||
|
AddStep("create free mod select screen", () => Child = freeModSelectScreen = new FreeModSelectScreen
|
||||||
|
{
|
||||||
|
State = { Value = Visibility.Visible }
|
||||||
|
});
|
||||||
|
|
||||||
|
AddAssert("all visible mods are playable",
|
||||||
|
() => this.ChildrenOfType<ModPanel>()
|
||||||
|
.Where(panel => panel.IsPresent)
|
||||||
|
.All(panel => panel.Mod.HasImplementation && panel.Mod.UserPlayable));
|
||||||
|
|
||||||
|
AddToggleStep("toggle visibility", visible =>
|
||||||
|
{
|
||||||
|
if (freeModSelectScreen != null)
|
||||||
|
freeModSelectScreen.State.Value = visible ? Visibility.Visible : Visibility.Hidden;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,7 @@ using osu.Framework.Graphics.Sprites;
|
|||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Osu.Mods;
|
using osu.Game.Rulesets.Osu.Mods;
|
||||||
@ -55,7 +56,7 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
|
|
||||||
AddStep("no mods selected", () => SelectedMods.Value = Array.Empty<Mod>());
|
AddStep("no mods selected", () => SelectedMods.Value = Array.Empty<Mod>());
|
||||||
|
|
||||||
AddAssert("first bar text is Circle Size", () => advancedStats.ChildrenOfType<SpriteText>().First().Text == "Circle Size");
|
AddAssert("first bar text is correct", () => advancedStats.ChildrenOfType<SpriteText>().First().Text == BeatmapsetsStrings.ShowStatsCs);
|
||||||
AddAssert("circle size bar is white", () => barIsWhite(advancedStats.FirstValue));
|
AddAssert("circle size bar is white", () => barIsWhite(advancedStats.FirstValue));
|
||||||
AddAssert("HP drain bar is white", () => barIsWhite(advancedStats.HpDrain));
|
AddAssert("HP drain bar is white", () => barIsWhite(advancedStats.HpDrain));
|
||||||
AddAssert("accuracy bar is white", () => barIsWhite(advancedStats.Accuracy));
|
AddAssert("accuracy bar is white", () => barIsWhite(advancedStats.Accuracy));
|
||||||
@ -78,7 +79,7 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
StarRating = 8
|
StarRating = 8
|
||||||
});
|
});
|
||||||
|
|
||||||
AddAssert("first bar text is Key Count", () => advancedStats.ChildrenOfType<SpriteText>().First().Text == "Key Count");
|
AddAssert("first bar text is correct", () => advancedStats.ChildrenOfType<SpriteText>().First().Text == BeatmapsetsStrings.ShowStatsCsMania);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -23,7 +23,7 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private RulesetStore rulesetStore { get; set; }
|
private RulesetStore rulesetStore { get; set; }
|
||||||
|
|
||||||
private ModSelectScreen modSelectScreen;
|
private UserModSelectScreen modSelectScreen;
|
||||||
|
|
||||||
[SetUpSteps]
|
[SetUpSteps]
|
||||||
public void SetUpSteps()
|
public void SetUpSteps()
|
||||||
@ -35,7 +35,7 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
|
|
||||||
private void createScreen()
|
private void createScreen()
|
||||||
{
|
{
|
||||||
AddStep("create screen", () => Child = modSelectScreen = new ModSelectScreen
|
AddStep("create screen", () => Child = modSelectScreen = new UserModSelectScreen
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
State = { Value = Visibility.Visible },
|
State = { Value = Visibility.Visible },
|
||||||
|
@ -10,19 +10,19 @@ using osu.Game.Overlays;
|
|||||||
namespace osu.Game.Tests.Visual.UserInterface
|
namespace osu.Game.Tests.Visual.UserInterface
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class TestScenePopupScreenTitle : OsuTestScene
|
public class TestSceneShearedOverlayHeader : OsuTestScene
|
||||||
{
|
{
|
||||||
[Cached]
|
[Cached]
|
||||||
private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Green);
|
private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Green);
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestPopupScreenTitle()
|
public void TestShearedOverlayHeader()
|
||||||
{
|
{
|
||||||
AddStep("create content", () =>
|
AddStep("create content", () =>
|
||||||
{
|
{
|
||||||
Child = new PopupScreenTitle
|
Child = new ShearedOverlayHeader
|
||||||
{
|
{
|
||||||
Title = "Popup Screen Title",
|
Title = "Sheared overlay header",
|
||||||
Description = string.Join(" ", Enumerable.Repeat("This is a description.", 20)),
|
Description = string.Join(" ", Enumerable.Repeat("This is a description.", 20)),
|
||||||
Close = () => { }
|
Close = () => { }
|
||||||
};
|
};
|
||||||
@ -34,9 +34,9 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
{
|
{
|
||||||
AddStep("create content", () =>
|
AddStep("create content", () =>
|
||||||
{
|
{
|
||||||
Child = new PopupScreenTitle
|
Child = new ShearedOverlayHeader
|
||||||
{
|
{
|
||||||
Title = "Popup Screen Title",
|
Title = "Sheared overlay header",
|
||||||
Description = "This is a description."
|
Description = "This is a description."
|
||||||
};
|
};
|
||||||
});
|
});
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
{
|
{
|
||||||
@ -14,6 +15,6 @@ namespace osu.Game.Beatmaps
|
|||||||
public Func<Drawable> CreateIcon;
|
public Func<Drawable> CreateIcon;
|
||||||
|
|
||||||
public string Content;
|
public string Content;
|
||||||
public string Name;
|
public LocalisableString Name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ using osu.Game.Graphics.Containers;
|
|||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Online;
|
using osu.Game.Online;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps.Drawables
|
namespace osu.Game.Beatmaps.Drawables
|
||||||
{
|
{
|
||||||
@ -104,7 +105,7 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
if ((beatmapSet as IBeatmapSetOnlineInfo)?.Availability.DownloadDisabled == true)
|
if ((beatmapSet as IBeatmapSetOnlineInfo)?.Availability.DownloadDisabled == true)
|
||||||
{
|
{
|
||||||
button.Enabled.Value = false;
|
button.Enabled.Value = false;
|
||||||
button.TooltipText = "this beatmap is currently not available for download.";
|
button.TooltipText = BeatmapsetsStrings.AvailabilityDisabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using osu.Framework.Graphics.UserInterface;
|
using osu.Framework.Graphics.UserInterface;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
|
|
||||||
namespace osu.Game.Graphics.UserInterface
|
namespace osu.Game.Graphics.UserInterface
|
||||||
{
|
{
|
||||||
@ -15,7 +16,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public OsuMenuItem(string text, MenuItemType type, Action action)
|
public OsuMenuItem(LocalisableString text, MenuItemType type, Action action)
|
||||||
: base(text, action)
|
: base(text, action)
|
||||||
{
|
{
|
||||||
Type = type;
|
Type = type;
|
||||||
|
@ -5,6 +5,7 @@ using System;
|
|||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Graphics.UserInterface.PageSelector
|
namespace osu.Game.Graphics.UserInterface.PageSelector
|
||||||
{
|
{
|
||||||
@ -29,7 +30,7 @@ namespace osu.Game.Graphics.UserInterface.PageSelector
|
|||||||
Direction = FillDirection.Horizontal,
|
Direction = FillDirection.Horizontal,
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
previousPageButton = new PageSelectorPrevNextButton(false, "prev")
|
previousPageButton = new PageSelectorPrevNextButton(false, CommonStrings.PaginationPrevious)
|
||||||
{
|
{
|
||||||
Action = () => CurrentPage.Value -= 1,
|
Action = () => CurrentPage.Value -= 1,
|
||||||
},
|
},
|
||||||
@ -38,7 +39,7 @@ namespace osu.Game.Graphics.UserInterface.PageSelector
|
|||||||
AutoSizeAxes = Axes.Both,
|
AutoSizeAxes = Axes.Both,
|
||||||
Direction = FillDirection.Horizontal,
|
Direction = FillDirection.Horizontal,
|
||||||
},
|
},
|
||||||
nextPageButton = new PageSelectorPrevNextButton(true, "next")
|
nextPageButton = new PageSelectorPrevNextButton(true, CommonStrings.PaginationNext)
|
||||||
{
|
{
|
||||||
Action = () => CurrentPage.Value += 1
|
Action = () => CurrentPage.Value += 1
|
||||||
}
|
}
|
||||||
|
@ -2,9 +2,11 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Extensions.LocalisationExtensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
@ -13,12 +15,12 @@ namespace osu.Game.Graphics.UserInterface.PageSelector
|
|||||||
public class PageSelectorPrevNextButton : PageSelectorButton
|
public class PageSelectorPrevNextButton : PageSelectorButton
|
||||||
{
|
{
|
||||||
private readonly bool rightAligned;
|
private readonly bool rightAligned;
|
||||||
private readonly string text;
|
private readonly LocalisableString text;
|
||||||
|
|
||||||
private SpriteIcon icon;
|
private SpriteIcon icon;
|
||||||
private OsuSpriteText name;
|
private OsuSpriteText name;
|
||||||
|
|
||||||
public PageSelectorPrevNextButton(bool rightAligned, string text)
|
public PageSelectorPrevNextButton(bool rightAligned, LocalisableString text)
|
||||||
{
|
{
|
||||||
this.rightAligned = rightAligned;
|
this.rightAligned = rightAligned;
|
||||||
this.text = text;
|
this.text = text;
|
||||||
|
@ -5,6 +5,7 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Framework.Input.Events;
|
using osu.Framework.Input.Events;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Input;
|
using osuTK.Input;
|
||||||
|
|
||||||
@ -27,7 +28,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
});
|
});
|
||||||
|
|
||||||
TextFlow.Padding = new MarginPadding { Right = 35 };
|
TextFlow.Padding = new MarginPadding { Right = 35 };
|
||||||
PlaceholderText = "type to search";
|
PlaceholderText = HomeStrings.SearchPlaceholder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool OnPressed(KeyBindingPressEvent<PlatformAction> e)
|
public override bool OnPressed(KeyBindingPressEvent<PlatformAction> e)
|
||||||
|
@ -19,8 +19,10 @@ using osuTK;
|
|||||||
|
|
||||||
namespace osu.Game.Graphics.UserInterface
|
namespace osu.Game.Graphics.UserInterface
|
||||||
{
|
{
|
||||||
public class PopupScreenTitle : CompositeDrawable
|
public class ShearedOverlayHeader : CompositeDrawable
|
||||||
{
|
{
|
||||||
|
public const float HEIGHT = main_area_height + 2 * corner_radius;
|
||||||
|
|
||||||
public LocalisableString Title
|
public LocalisableString Title
|
||||||
{
|
{
|
||||||
set => titleSpriteText.Text = value;
|
set => titleSpriteText.Text = value;
|
||||||
@ -48,7 +50,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
private readonly OsuTextFlowContainer descriptionText;
|
private readonly OsuTextFlowContainer descriptionText;
|
||||||
private readonly IconButton closeButton;
|
private readonly IconButton closeButton;
|
||||||
|
|
||||||
public PopupScreenTitle()
|
public ShearedOverlayHeader()
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
AutoSizeAxes = Axes.Y;
|
AutoSizeAxes = Axes.Y;
|
||||||
@ -67,7 +69,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
underlayContainer = new Container
|
underlayContainer = new Container
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
Height = main_area_height + 2 * corner_radius,
|
Height = HEIGHT,
|
||||||
CornerRadius = corner_radius,
|
CornerRadius = corner_radius,
|
||||||
Masking = true,
|
Masking = true,
|
||||||
BorderThickness = 2,
|
BorderThickness = 2,
|
@ -11,7 +11,9 @@ using osu.Game.Graphics.Sprites;
|
|||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Framework.Extensions.LocalisationExtensions;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Graphics.UserInterface
|
namespace osu.Game.Graphics.UserInterface
|
||||||
{
|
{
|
||||||
@ -80,7 +82,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Font = OsuFont.GetFont(size: 12, weight: FontWeight.SemiBold),
|
Font = OsuFont.GetFont(size: 12, weight: FontWeight.SemiBold),
|
||||||
Text = "show more".ToUpper(),
|
Text = CommonStrings.ButtonsShowMore.ToUpper(),
|
||||||
},
|
},
|
||||||
rightIcon = new ChevronIcon
|
rightIcon = new ChevronIcon
|
||||||
{
|
{
|
||||||
|
@ -14,6 +14,7 @@ using osu.Framework.Localisation;
|
|||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Graphics.UserInterfaceV2
|
namespace osu.Game.Graphics.UserInterfaceV2
|
||||||
@ -139,7 +140,7 @@ namespace osu.Game.Graphics.UserInterfaceV2
|
|||||||
|
|
||||||
public MenuItem[] ContextMenuItems => new MenuItem[]
|
public MenuItem[] ContextMenuItems => new MenuItem[]
|
||||||
{
|
{
|
||||||
new OsuMenuItem("Delete", MenuItemType.Destructive, () => DeleteRequested?.Invoke())
|
new OsuMenuItem(CommonStrings.ButtonsDelete, MenuItemType.Destructive, () => DeleteRequested?.Invoke())
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,16 +9,6 @@ namespace osu.Game.Localisation
|
|||||||
{
|
{
|
||||||
private const string prefix = @"osu.Game.Resources.Localisation.Common";
|
private const string prefix = @"osu.Game.Resources.Localisation.Common";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// "Cancel"
|
|
||||||
/// </summary>
|
|
||||||
public static LocalisableString Cancel => new TranslatableString(getKey(@"cancel"), @"Cancel");
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// "Clear"
|
|
||||||
/// </summary>
|
|
||||||
public static LocalisableString Clear => new TranslatableString(getKey(@"clear"), @"Clear");
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// "Back"
|
/// "Back"
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
30
osu.Game/Localisation/DebugLocalisationStore.cs
Normal file
30
osu.Game/Localisation/DebugLocalisationStore.cs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// 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 System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
|
|
||||||
|
namespace osu.Game.Localisation
|
||||||
|
{
|
||||||
|
public class DebugLocalisationStore : ILocalisationStore
|
||||||
|
{
|
||||||
|
public string Get(string lookup) => $@"[[{lookup.Substring(lookup.LastIndexOf('.') + 1)}]]";
|
||||||
|
|
||||||
|
public Task<string> GetAsync(string lookup, CancellationToken cancellationToken = default) => Task.FromResult(Get(lookup));
|
||||||
|
|
||||||
|
public Stream GetStream(string name) => throw new NotImplementedException();
|
||||||
|
|
||||||
|
public IEnumerable<string> GetAvailableResources() => throw new NotImplementedException();
|
||||||
|
|
||||||
|
public CultureInfo EffectiveCulture { get; } = CultureInfo.CurrentCulture;
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -110,6 +110,11 @@ namespace osu.Game.Localisation
|
|||||||
// zh_hk,
|
// zh_hk,
|
||||||
|
|
||||||
[Description(@"繁體中文(台灣)")]
|
[Description(@"繁體中文(台灣)")]
|
||||||
zh_hant
|
zh_hant,
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
[Description(@"Debug (show raw keys)")]
|
||||||
|
debug
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,8 +13,8 @@ namespace osu.Game.Online.API.Requests
|
|||||||
|
|
||||||
private readonly BeatmapSetType type;
|
private readonly BeatmapSetType type;
|
||||||
|
|
||||||
public GetUserBeatmapsRequest(long userId, BeatmapSetType type, int page = 0, int itemsPerPage = 6)
|
public GetUserBeatmapsRequest(long userId, BeatmapSetType type, PaginationParameters pagination)
|
||||||
: base(page, itemsPerPage)
|
: base(pagination)
|
||||||
{
|
{
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
|
@ -10,8 +10,8 @@ namespace osu.Game.Online.API.Requests
|
|||||||
{
|
{
|
||||||
private readonly long userId;
|
private readonly long userId;
|
||||||
|
|
||||||
public GetUserKudosuHistoryRequest(long userId, int page = 0, int itemsPerPage = 5)
|
public GetUserKudosuHistoryRequest(long userId, PaginationParameters pagination)
|
||||||
: base(page, itemsPerPage)
|
: base(pagination)
|
||||||
{
|
{
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,8 @@ namespace osu.Game.Online.API.Requests
|
|||||||
{
|
{
|
||||||
private readonly long userId;
|
private readonly long userId;
|
||||||
|
|
||||||
public GetUserMostPlayedBeatmapsRequest(long userId, int page = 0, int itemsPerPage = 5)
|
public GetUserMostPlayedBeatmapsRequest(long userId, PaginationParameters pagination)
|
||||||
: base(page, itemsPerPage)
|
: base(pagination)
|
||||||
{
|
{
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,8 @@ namespace osu.Game.Online.API.Requests
|
|||||||
{
|
{
|
||||||
private readonly long userId;
|
private readonly long userId;
|
||||||
|
|
||||||
public GetUserRecentActivitiesRequest(long userId, int page = 0, int itemsPerPage = 5)
|
public GetUserRecentActivitiesRequest(long userId, PaginationParameters pagination)
|
||||||
: base(page, itemsPerPage)
|
: base(pagination)
|
||||||
{
|
{
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,8 @@ namespace osu.Game.Online.API.Requests
|
|||||||
private readonly ScoreType type;
|
private readonly ScoreType type;
|
||||||
private readonly RulesetInfo ruleset;
|
private readonly RulesetInfo ruleset;
|
||||||
|
|
||||||
public GetUserScoresRequest(long userId, ScoreType type, int page = 0, int itemsPerPage = 5, RulesetInfo ruleset = null)
|
public GetUserScoresRequest(long userId, ScoreType type, PaginationParameters pagination, RulesetInfo ruleset = null)
|
||||||
: base(page, itemsPerPage)
|
: base(pagination)
|
||||||
{
|
{
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
|
@ -8,21 +8,19 @@ namespace osu.Game.Online.API.Requests
|
|||||||
{
|
{
|
||||||
public abstract class PaginatedAPIRequest<T> : APIRequest<T> where T : class
|
public abstract class PaginatedAPIRequest<T> : APIRequest<T> where T : class
|
||||||
{
|
{
|
||||||
private readonly int page;
|
private readonly PaginationParameters pagination;
|
||||||
private readonly int itemsPerPage;
|
|
||||||
|
|
||||||
protected PaginatedAPIRequest(int page, int itemsPerPage)
|
protected PaginatedAPIRequest(PaginationParameters pagination)
|
||||||
{
|
{
|
||||||
this.page = page;
|
this.pagination = pagination;
|
||||||
this.itemsPerPage = itemsPerPage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override WebRequest CreateWebRequest()
|
protected override WebRequest CreateWebRequest()
|
||||||
{
|
{
|
||||||
var req = base.CreateWebRequest();
|
var req = base.CreateWebRequest();
|
||||||
|
|
||||||
req.AddParameter("offset", (page * itemsPerPage).ToString(CultureInfo.InvariantCulture));
|
req.AddParameter("offset", pagination.Offset.ToString(CultureInfo.InvariantCulture));
|
||||||
req.AddParameter("limit", itemsPerPage.ToString(CultureInfo.InvariantCulture));
|
req.AddParameter("limit", pagination.Limit.ToString(CultureInfo.InvariantCulture));
|
||||||
|
|
||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
|
38
osu.Game/Online/API/Requests/PaginationParameters.cs
Normal file
38
osu.Game/Online/API/Requests/PaginationParameters.cs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a pagination data used for <see cref="PaginatedAPIRequest{T}"/>.
|
||||||
|
/// </summary>
|
||||||
|
public readonly struct PaginationParameters
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The starting point of the request.
|
||||||
|
/// </summary>
|
||||||
|
public int Offset { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The maximum number of items to return in this request.
|
||||||
|
/// </summary>
|
||||||
|
public int Limit { get; }
|
||||||
|
|
||||||
|
public PaginationParameters(int offset, int limit)
|
||||||
|
{
|
||||||
|
Offset = offset;
|
||||||
|
Limit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PaginationParameters(int limit)
|
||||||
|
: this(0, limit)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a <see cref="PaginationParameters"/> of the next number of items defined by <paramref name="limit"/> after this.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="limit">The limit of the next pagination.</param>
|
||||||
|
public PaginationParameters TakeNext(int limit) => new PaginationParameters(Offset + Limit, limit);
|
||||||
|
}
|
||||||
|
}
|
@ -1,22 +1,23 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System.ComponentModel;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests.Responses
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
{
|
{
|
||||||
public enum APIPlayStyle
|
public enum APIPlayStyle
|
||||||
{
|
{
|
||||||
[Description("Keyboard")]
|
[LocalisableDescription(typeof(CommonStrings), nameof(CommonStrings.DeviceKeyboard))]
|
||||||
Keyboard,
|
Keyboard,
|
||||||
|
|
||||||
[Description("Mouse")]
|
[LocalisableDescription(typeof(CommonStrings), nameof(CommonStrings.DeviceMouse))]
|
||||||
Mouse,
|
Mouse,
|
||||||
|
|
||||||
[Description("Tablet")]
|
[LocalisableDescription(typeof(CommonStrings), nameof(CommonStrings.DeviceTablet))]
|
||||||
Tablet,
|
Tablet,
|
||||||
|
|
||||||
[Description("Touch Screen")]
|
[LocalisableDescription(typeof(CommonStrings), nameof(CommonStrings.DeviceTouch))]
|
||||||
Touch,
|
Touch,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ using osu.Framework.Input.Events;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Overlays.Chat;
|
using osu.Game.Overlays.Chat;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Online.Chat
|
namespace osu.Game.Online.Chat
|
||||||
@ -63,7 +64,7 @@ namespace osu.Game.Online.Chat
|
|||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
Height = text_box_height,
|
Height = text_box_height,
|
||||||
PlaceholderText = "type your message",
|
PlaceholderText = ChatStrings.InputPlaceholder,
|
||||||
CornerRadius = corner_radius,
|
CornerRadius = corner_radius,
|
||||||
ReleaseFocusOnCommit = false,
|
ReleaseFocusOnCommit = false,
|
||||||
HoldFocus = true,
|
HoldFocus = true,
|
||||||
|
@ -30,6 +30,7 @@ using osu.Game.Users.Drawables;
|
|||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Utils;
|
using osu.Game.Utils;
|
||||||
|
|
||||||
namespace osu.Game.Online.Leaderboards
|
namespace osu.Game.Online.Leaderboards
|
||||||
@ -291,8 +292,8 @@ namespace osu.Game.Online.Leaderboards
|
|||||||
|
|
||||||
protected virtual IEnumerable<LeaderboardScoreStatistic> GetStatistics(ScoreInfo model) => new[]
|
protected virtual IEnumerable<LeaderboardScoreStatistic> GetStatistics(ScoreInfo model) => new[]
|
||||||
{
|
{
|
||||||
new LeaderboardScoreStatistic(FontAwesome.Solid.Link, "Max Combo", model.MaxCombo.ToString()),
|
new LeaderboardScoreStatistic(FontAwesome.Solid.Link, BeatmapsetsStrings.ShowScoreboardHeadersCombo, model.MaxCombo.ToString()),
|
||||||
new LeaderboardScoreStatistic(FontAwesome.Solid.Crosshairs, "Accuracy", model.DisplayAccuracy)
|
new LeaderboardScoreStatistic(FontAwesome.Solid.Crosshairs, BeatmapsetsStrings.ShowScoreboardHeadersAccuracy, model.DisplayAccuracy)
|
||||||
};
|
};
|
||||||
|
|
||||||
protected override bool OnHover(HoverEvent e)
|
protected override bool OnHover(HoverEvent e)
|
||||||
@ -403,9 +404,9 @@ namespace osu.Game.Online.Leaderboards
|
|||||||
{
|
{
|
||||||
public IconUsage Icon;
|
public IconUsage Icon;
|
||||||
public LocalisableString Value;
|
public LocalisableString Value;
|
||||||
public string Name;
|
public LocalisableString Name;
|
||||||
|
|
||||||
public LeaderboardScoreStatistic(IconUsage icon, string name, LocalisableString value)
|
public LeaderboardScoreStatistic(IconUsage icon, LocalisableString name, LocalisableString value)
|
||||||
{
|
{
|
||||||
Icon = icon;
|
Icon = icon;
|
||||||
Name = name;
|
Name = name;
|
||||||
@ -426,7 +427,7 @@ namespace osu.Game.Online.Leaderboards
|
|||||||
items.Add(new OsuMenuItem("Export", MenuItemType.Standard, () => new LegacyScoreExporter(storage).Export(Score)));
|
items.Add(new OsuMenuItem("Export", MenuItemType.Standard, () => new LegacyScoreExporter(storage).Export(Score)));
|
||||||
|
|
||||||
if (!isOnlineScope)
|
if (!isOnlineScope)
|
||||||
items.Add(new OsuMenuItem("Delete", MenuItemType.Destructive, () => dialogOverlay?.Push(new LocalScoreDeleteDialog(Score))));
|
items.Add(new OsuMenuItem(CommonStrings.ButtonsDelete, MenuItemType.Destructive, () => dialogOverlay?.Push(new LocalScoreDeleteDialog(Score))));
|
||||||
|
|
||||||
return items.ToArray();
|
return items.ToArray();
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System.ComponentModel;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Online.Rooms
|
namespace osu.Game.Online.Rooms
|
||||||
{
|
{
|
||||||
@ -11,10 +12,10 @@ namespace osu.Game.Online.Rooms
|
|||||||
|
|
||||||
Playlists,
|
Playlists,
|
||||||
|
|
||||||
[Description("Head to head")]
|
[LocalisableDescription(typeof(MatchesStrings), nameof(MatchesStrings.MatchTeamTypesHeadToHead))]
|
||||||
HeadToHead,
|
HeadToHead,
|
||||||
|
|
||||||
[Description("Team VS")]
|
[LocalisableDescription(typeof(MatchesStrings), nameof(MatchesStrings.MatchTeamTypesTeamVs))]
|
||||||
TeamVersus,
|
TeamVersus,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -630,6 +630,14 @@ namespace osu.Game
|
|||||||
|
|
||||||
foreach (var language in Enum.GetValues(typeof(Language)).OfType<Language>())
|
foreach (var language in Enum.GetValues(typeof(Language)).OfType<Language>())
|
||||||
{
|
{
|
||||||
|
#if DEBUG
|
||||||
|
if (language == Language.debug)
|
||||||
|
{
|
||||||
|
Localisation.AddLanguage(Language.debug.ToString(), new DebugLocalisationStore());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
string cultureCode = language.ToCultureCode();
|
string cultureCode = language.ToCultureCode();
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -16,6 +16,7 @@ using osu.Game.Graphics.Sprites;
|
|||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Overlays.Settings;
|
using osu.Game.Overlays.Settings;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
@ -68,7 +69,7 @@ namespace osu.Game.Overlays.AccountCreation
|
|||||||
},
|
},
|
||||||
usernameTextBox = new OsuTextBox
|
usernameTextBox = new OsuTextBox
|
||||||
{
|
{
|
||||||
PlaceholderText = "username",
|
PlaceholderText = UsersStrings.LoginUsername,
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
TabbableContentContainer = this
|
TabbableContentContainer = this
|
||||||
},
|
},
|
||||||
|
@ -8,6 +8,7 @@ using osu.Framework.Graphics.Shapes;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.BeatmapSet
|
namespace osu.Game.Overlays.BeatmapSet
|
||||||
@ -69,14 +70,14 @@ namespace osu.Game.Overlays.BeatmapSet
|
|||||||
{
|
{
|
||||||
textContainer.Clear();
|
textContainer.Clear();
|
||||||
textContainer.AddParagraph(downloadDisabled
|
textContainer.AddParagraph(downloadDisabled
|
||||||
? "This beatmap is currently not available for download."
|
? BeatmapsetsStrings.AvailabilityDisabled
|
||||||
: "Portions of this beatmap have been removed at the request of the creator or a third-party rights holder.", t => t.Colour = Color4.Orange);
|
: BeatmapsetsStrings.AvailabilityPartsRemoved, t => t.Colour = Color4.Orange);
|
||||||
|
|
||||||
if (hasExternalLink)
|
if (hasExternalLink)
|
||||||
{
|
{
|
||||||
textContainer.NewParagraph();
|
textContainer.NewParagraph();
|
||||||
textContainer.NewParagraph();
|
textContainer.NewParagraph();
|
||||||
textContainer.AddLink("Check here for more information.", BeatmapSet.Availability.ExternalLink, creationParameters: t => t.Font = OsuFont.GetFont(size: 10));
|
textContainer.AddLink(BeatmapsetsStrings.AvailabilityMoreInfo, BeatmapSet.Availability.ExternalLink, creationParameters: t => t.Font = OsuFont.GetFont(size: 10));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ using osu.Game.Graphics.Sprites;
|
|||||||
using osuTK;
|
using osuTK;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.BeatmapSet.Scores
|
namespace osu.Game.Overlays.BeatmapSet.Scores
|
||||||
{
|
{
|
||||||
@ -28,7 +29,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
|
|||||||
{
|
{
|
||||||
Anchor = Anchor.TopCentre,
|
Anchor = Anchor.TopCentre,
|
||||||
Origin = Anchor.TopCentre,
|
Origin = Anchor.TopCentre,
|
||||||
Text = @"You need to be an osu!supporter to access the friend and country rankings!",
|
Text = BeatmapsetsStrings.ShowScoreboardSupporterOnly,
|
||||||
Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold),
|
Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold),
|
||||||
},
|
},
|
||||||
text = new LinkFlowContainer(t => t.Font = t.Font.With(size: 11))
|
text = new LinkFlowContainer(t => t.Font = t.Font.With(size: 11))
|
||||||
|
@ -160,7 +160,7 @@ namespace osu.Game.Overlays
|
|||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Height = 1,
|
Height = 1,
|
||||||
PlaceholderText = "type your message",
|
PlaceholderText = Resources.Localisation.Web.ChatStrings.InputPlaceholder,
|
||||||
ReleaseFocusOnCommit = false,
|
ReleaseFocusOnCommit = false,
|
||||||
HoldFocus = true,
|
HoldFocus = true,
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Comments.Buttons
|
namespace osu.Game.Overlays.Comments.Buttons
|
||||||
{
|
{
|
||||||
@ -25,7 +26,7 @@ namespace osu.Game.Overlays.Comments.Buttons
|
|||||||
{
|
{
|
||||||
public ButtonContent()
|
public ButtonContent()
|
||||||
{
|
{
|
||||||
Text = "load replies";
|
Text = CommentsStrings.LoadReplies;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ using osu.Game.Graphics.Sprites;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Comments.Buttons
|
namespace osu.Game.Overlays.Comments.Buttons
|
||||||
{
|
{
|
||||||
@ -38,7 +39,7 @@ namespace osu.Game.Overlays.Comments.Buttons
|
|||||||
{
|
{
|
||||||
AlwaysPresent = true,
|
AlwaysPresent = true,
|
||||||
Font = OsuFont.GetFont(size: 12, weight: FontWeight.SemiBold),
|
Font = OsuFont.GetFont(size: 12, weight: FontWeight.SemiBold),
|
||||||
Text = "show more"
|
Text = CommonStrings.ButtonsShowMore
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ using osu.Framework.Graphics.Shapes;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Comments
|
namespace osu.Game.Overlays.Comments
|
||||||
{
|
{
|
||||||
@ -54,7 +55,7 @@ namespace osu.Game.Overlays.Comments
|
|||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold),
|
Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold),
|
||||||
Margin = new MarginPadding { Horizontal = 20 },
|
Margin = new MarginPadding { Horizontal = 20 },
|
||||||
Text = @"Cancel"
|
Text = CommonStrings.ButtonsCancel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -16,6 +16,7 @@ using osu.Framework.Threading;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using APIUser = osu.Game.Online.API.Requests.Responses.APIUser;
|
using APIUser = osu.Game.Online.API.Requests.Responses.APIUser;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Comments
|
namespace osu.Game.Overlays.Comments
|
||||||
@ -328,7 +329,7 @@ namespace osu.Game.Overlays.Comments
|
|||||||
Anchor = Anchor.CentreLeft,
|
Anchor = Anchor.CentreLeft,
|
||||||
Origin = Anchor.CentreLeft,
|
Origin = Anchor.CentreLeft,
|
||||||
Margin = new MarginPadding { Left = 50 },
|
Margin = new MarginPadding { Left = 50 },
|
||||||
Text = @"No comments yet."
|
Text = CommentsStrings.Empty
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,9 @@ using osu.Game.Graphics;
|
|||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osu.Framework.Input.Events;
|
using osu.Framework.Input.Events;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Comments
|
namespace osu.Game.Overlays.Comments
|
||||||
{
|
{
|
||||||
@ -91,7 +93,7 @@ namespace osu.Game.Overlays.Comments
|
|||||||
Anchor = Anchor.CentreLeft,
|
Anchor = Anchor.CentreLeft,
|
||||||
Origin = Anchor.CentreLeft,
|
Origin = Anchor.CentreLeft,
|
||||||
Font = OsuFont.GetFont(size: 12, weight: FontWeight.SemiBold),
|
Font = OsuFont.GetFont(size: 12, weight: FontWeight.SemiBold),
|
||||||
Text = @"Show deleted"
|
Text = CommonStrings.ButtonsShowDeleted
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@ -126,9 +128,13 @@ namespace osu.Game.Overlays.Comments
|
|||||||
|
|
||||||
public enum CommentsSortCriteria
|
public enum CommentsSortCriteria
|
||||||
{
|
{
|
||||||
[System.ComponentModel.Description(@"Recent")]
|
[LocalisableDescription(typeof(SortStrings), nameof(SortStrings.New))]
|
||||||
New,
|
New,
|
||||||
|
|
||||||
|
[LocalisableDescription(typeof(SortStrings), nameof(SortStrings.Old))]
|
||||||
Old,
|
Old,
|
||||||
|
|
||||||
|
[LocalisableDescription(typeof(SortStrings), nameof(SortStrings.Top))]
|
||||||
Top
|
Top
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,10 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Extensions.LocalisationExtensions;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Comments
|
namespace osu.Game.Overlays.Comments
|
||||||
{
|
{
|
||||||
@ -18,7 +21,8 @@ namespace osu.Game.Overlays.Comments
|
|||||||
|
|
||||||
private void onCurrentChanged(ValueChangedEvent<int> count)
|
private void onCurrentChanged(ValueChangedEvent<int> count)
|
||||||
{
|
{
|
||||||
Text = $@"Show More ({count.NewValue})".ToUpper();
|
Text = new TranslatableString(@"_", "{0} ({1})",
|
||||||
|
CommonStrings.ButtonsShowMore.ToUpper(), count.NewValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -150,7 +150,7 @@ namespace osu.Game.Overlays.Comments
|
|||||||
{
|
{
|
||||||
Alpha = Comment.IsDeleted ? 1 : 0,
|
Alpha = Comment.IsDeleted ? 1 : 0,
|
||||||
Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold),
|
Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold),
|
||||||
Text = "deleted"
|
Text = CommentsStrings.Deleted
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -9,6 +9,7 @@ using osuTK;
|
|||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Comments
|
namespace osu.Game.Overlays.Comments
|
||||||
{
|
{
|
||||||
@ -39,7 +40,7 @@ namespace osu.Game.Overlays.Comments
|
|||||||
Origin = Anchor.CentreLeft,
|
Origin = Anchor.CentreLeft,
|
||||||
Font = OsuFont.GetFont(size: 20, italics: true),
|
Font = OsuFont.GetFont(size: 20, italics: true),
|
||||||
Colour = colourProvider.Light1,
|
Colour = colourProvider.Light1,
|
||||||
Text = @"Comments"
|
Text = CommentsStrings.Title
|
||||||
},
|
},
|
||||||
new CircularContainer
|
new CircularContainer
|
||||||
{
|
{
|
||||||
|
@ -14,6 +14,7 @@ using osu.Game.Database;
|
|||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osu.Game.Online.Spectator;
|
using osu.Game.Online.Spectator;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Screens;
|
using osu.Game.Screens;
|
||||||
using osu.Game.Screens.OnlinePlay.Match.Components;
|
using osu.Game.Screens.OnlinePlay.Match.Components;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
@ -138,7 +139,7 @@ namespace osu.Game.Overlays.Dashboard
|
|||||||
new PurpleTriangleButton
|
new PurpleTriangleButton
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
Text = "Watch",
|
Text = "Spectate",
|
||||||
Anchor = Anchor.TopCentre,
|
Anchor = Anchor.TopCentre,
|
||||||
Origin = Anchor.TopCentre,
|
Origin = Anchor.TopCentre,
|
||||||
Action = () => performer?.PerformFromScreen(s => s.Push(new SoloSpectator(User))),
|
Action = () => performer?.PerformFromScreen(s => s.Push(new SoloSpectator(User))),
|
||||||
|
@ -6,6 +6,7 @@ using System.Linq;
|
|||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
@ -49,7 +50,7 @@ namespace osu.Game.Overlays.Dashboard.Home
|
|||||||
flow.AddRange(beatmapSets.Select(CreateBeatmapPanel));
|
flow.AddRange(beatmapSets.Select(CreateBeatmapPanel));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract string Title { get; }
|
protected abstract LocalisableString Title { get; }
|
||||||
|
|
||||||
protected abstract DashboardBeatmapPanel CreateBeatmapPanel(APIBeatmapSet beatmapSet);
|
protected abstract DashboardBeatmapPanel CreateBeatmapPanel(APIBeatmapSet beatmapSet);
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Dashboard.Home
|
namespace osu.Game.Overlays.Dashboard.Home
|
||||||
{
|
{
|
||||||
@ -15,6 +17,6 @@ namespace osu.Game.Overlays.Dashboard.Home
|
|||||||
|
|
||||||
protected override DashboardBeatmapPanel CreateBeatmapPanel(APIBeatmapSet beatmapSet) => new DashboardNewBeatmapPanel(beatmapSet);
|
protected override DashboardBeatmapPanel CreateBeatmapPanel(APIBeatmapSet beatmapSet) => new DashboardNewBeatmapPanel(beatmapSet);
|
||||||
|
|
||||||
protected override string Title => "New Ranked Beatmaps";
|
protected override LocalisableString Title => HomeStrings.UserBeatmapsNew;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Dashboard.Home
|
namespace osu.Game.Overlays.Dashboard.Home
|
||||||
{
|
{
|
||||||
@ -15,6 +17,6 @@ namespace osu.Game.Overlays.Dashboard.Home
|
|||||||
|
|
||||||
protected override DashboardBeatmapPanel CreateBeatmapPanel(APIBeatmapSet beatmapSet) => new DashboardPopularBeatmapPanel(beatmapSet);
|
protected override DashboardBeatmapPanel CreateBeatmapPanel(APIBeatmapSet beatmapSet) => new DashboardPopularBeatmapPanel(beatmapSet);
|
||||||
|
|
||||||
protected override string Title => "Popular Beatmaps";
|
protected override LocalisableString Title => HomeStrings.UserBeatmapsPopular;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Dashboard.Home.News
|
namespace osu.Game.Overlays.Dashboard.Home.News
|
||||||
@ -35,7 +36,7 @@ namespace osu.Game.Overlays.Dashboard.Home.News
|
|||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Margin = new MarginPadding { Vertical = 20 },
|
Margin = new MarginPadding { Vertical = 20 },
|
||||||
Text = "see more"
|
Text = CommonStrings.ButtonsSeeMore
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Dialog
|
namespace osu.Game.Overlays.Dialog
|
||||||
{
|
{
|
||||||
@ -33,7 +34,7 @@ namespace osu.Game.Overlays.Dialog
|
|||||||
},
|
},
|
||||||
new PopupDialogCancelButton
|
new PopupDialogCancelButton
|
||||||
{
|
{
|
||||||
Text = Localisation.CommonStrings.Cancel,
|
Text = CommonStrings.ButtonsCancel,
|
||||||
Action = onCancel
|
Action = onCancel
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -13,6 +13,7 @@ using osu.Game.Graphics.Containers;
|
|||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Overlays.Settings;
|
using osu.Game.Overlays.Settings;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Login
|
namespace osu.Game.Overlays.Login
|
||||||
@ -50,14 +51,14 @@ namespace osu.Game.Overlays.Login
|
|||||||
{
|
{
|
||||||
username = new OsuTextBox
|
username = new OsuTextBox
|
||||||
{
|
{
|
||||||
PlaceholderText = "username",
|
PlaceholderText = UsersStrings.LoginUsername,
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
Text = api?.ProvidedUsername ?? string.Empty,
|
Text = api?.ProvidedUsername ?? string.Empty,
|
||||||
TabbableContentContainer = this
|
TabbableContentContainer = this
|
||||||
},
|
},
|
||||||
password = new OsuPasswordTextBox
|
password = new OsuPasswordTextBox
|
||||||
{
|
{
|
||||||
PlaceholderText = "password",
|
PlaceholderText = UsersStrings.LoginPassword,
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
TabbableContentContainer = this,
|
TabbableContentContainer = this,
|
||||||
},
|
},
|
||||||
@ -88,7 +89,7 @@ namespace osu.Game.Overlays.Login
|
|||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
Child = new SettingsButton
|
Child = new SettingsButton
|
||||||
{
|
{
|
||||||
Text = "Sign in",
|
Text = UsersStrings.LoginButton,
|
||||||
Action = performLogin
|
Action = performLogin
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,14 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Login
|
namespace osu.Game.Overlays.Login
|
||||||
{
|
{
|
||||||
public enum UserAction
|
public enum UserAction
|
||||||
{
|
{
|
||||||
|
[LocalisableDescription(typeof(UsersStrings), nameof(UsersStrings.StatusOnline))]
|
||||||
Online,
|
Online,
|
||||||
|
|
||||||
[Description(@"Do not disturb")]
|
[Description(@"Do not disturb")]
|
||||||
|
@ -58,7 +58,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
AutoSizeAxes = Axes.X,
|
AutoSizeAxes = Axes.X,
|
||||||
Masking = true,
|
Masking = true,
|
||||||
CornerRadius = ModPanel.CORNER_RADIUS,
|
CornerRadius = ModPanel.CORNER_RADIUS,
|
||||||
Shear = new Vector2(ModPanel.SHEAR_X, 0),
|
Shear = new Vector2(ShearedOverlayContainer.SHEAR, 0),
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
underlayBackground = new Box
|
underlayBackground = new Box
|
||||||
@ -98,7 +98,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Margin = new MarginPadding { Horizontal = 18 },
|
Margin = new MarginPadding { Horizontal = 18 },
|
||||||
Shear = new Vector2(-ModPanel.SHEAR_X, 0),
|
Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0),
|
||||||
Text = "Difficulty Multiplier",
|
Text = "Difficulty Multiplier",
|
||||||
Font = OsuFont.Default.With(size: 17, weight: FontWeight.SemiBold)
|
Font = OsuFont.Default.With(size: 17, weight: FontWeight.SemiBold)
|
||||||
}
|
}
|
||||||
@ -109,7 +109,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
AutoSizeAxes = Axes.Both,
|
AutoSizeAxes = Axes.Both,
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Shear = new Vector2(-ModPanel.SHEAR_X, 0),
|
Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0),
|
||||||
Direction = FillDirection.Horizontal,
|
Direction = FillDirection.Horizontal,
|
||||||
Spacing = new Vector2(2, 0),
|
Spacing = new Vector2(2, 0),
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
|
@ -37,7 +37,9 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
private void updateIncompatibility()
|
private void updateIncompatibility()
|
||||||
{
|
{
|
||||||
incompatible.Value = selectedMods.Value.Count > 0 && !selectedMods.Value.Contains(Mod) && !ModUtils.CheckCompatibleSet(selectedMods.Value.Append(Mod));
|
incompatible.Value = selectedMods.Value.Count > 0
|
||||||
|
&& selectedMods.Value.All(selected => selected.GetType() != Mod.GetType())
|
||||||
|
&& !ModUtils.CheckCompatibleSet(selectedMods.Value.Append(Mod));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void UpdateState()
|
protected override void UpdateState()
|
||||||
@ -46,8 +48,8 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
if (incompatible.Value)
|
if (incompatible.Value)
|
||||||
{
|
{
|
||||||
Colour4 backgroundColour = ColourProvider.Background5;
|
Colour4 backgroundColour = ColourProvider.Background6;
|
||||||
Colour4 textBackgroundColour = ColourProvider.Background4;
|
Colour4 textBackgroundColour = ColourProvider.Background5;
|
||||||
|
|
||||||
Content.TransformTo(nameof(BorderColour), ColourInfo.GradientVertical(backgroundColour, textBackgroundColour), TRANSITION_DURATION, Easing.OutQuint);
|
Content.TransformTo(nameof(BorderColour), ColourInfo.GradientVertical(backgroundColour, textBackgroundColour), TRANSITION_DURATION, Easing.OutQuint);
|
||||||
Background.FadeColour(backgroundColour, TRANSITION_DURATION, Easing.OutQuint);
|
Background.FadeColour(backgroundColour, TRANSITION_DURATION, Easing.OutQuint);
|
||||||
|
@ -54,6 +54,8 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
public Bindable<IReadOnlyList<Mod>> SelectedMods = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());
|
public Bindable<IReadOnlyList<Mod>> SelectedMods = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());
|
||||||
|
|
||||||
|
protected virtual ModPanel CreateModPanel(Mod mod) => new ModPanel(mod);
|
||||||
|
|
||||||
private readonly Key[]? toggleKeys;
|
private readonly Key[]? toggleKeys;
|
||||||
|
|
||||||
private readonly Bindable<Dictionary<ModType, IReadOnlyList<Mod>>> availableMods = new Bindable<Dictionary<ModType, IReadOnlyList<Mod>>>();
|
private readonly Bindable<Dictionary<ModType, IReadOnlyList<Mod>>> availableMods = new Bindable<Dictionary<ModType, IReadOnlyList<Mod>>>();
|
||||||
@ -79,7 +81,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
Width = 320;
|
Width = 320;
|
||||||
RelativeSizeAxes = Axes.Y;
|
RelativeSizeAxes = Axes.Y;
|
||||||
Shear = new Vector2(ModPanel.SHEAR_X, 0);
|
Shear = new Vector2(ShearedOverlayContainer.SHEAR, 0);
|
||||||
|
|
||||||
Container controlContainer;
|
Container controlContainer;
|
||||||
InternalChildren = new Drawable[]
|
InternalChildren = new Drawable[]
|
||||||
@ -113,7 +115,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
Anchor = Anchor.CentreLeft,
|
Anchor = Anchor.CentreLeft,
|
||||||
Origin = Anchor.CentreLeft,
|
Origin = Anchor.CentreLeft,
|
||||||
Shear = new Vector2(-ModPanel.SHEAR_X, 0),
|
Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0),
|
||||||
Padding = new MarginPadding
|
Padding = new MarginPadding
|
||||||
{
|
{
|
||||||
Horizontal = 17,
|
Horizontal = 17,
|
||||||
@ -193,7 +195,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
Scale = new Vector2(0.8f),
|
Scale = new Vector2(0.8f),
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
LabelText = "Enable All",
|
LabelText = "Enable All",
|
||||||
Shear = new Vector2(-ModPanel.SHEAR_X, 0)
|
Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0)
|
||||||
});
|
});
|
||||||
panelFlow.Padding = new MarginPadding
|
panelFlow.Padding = new MarginPadding
|
||||||
{
|
{
|
||||||
@ -258,10 +260,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
cancellationTokenSource?.Cancel();
|
cancellationTokenSource?.Cancel();
|
||||||
|
|
||||||
var panels = newMods.Select(mod => new ModPanel(mod)
|
var panels = newMods.Select(mod => CreateModPanel(mod).With(panel => panel.Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0)));
|
||||||
{
|
|
||||||
Shear = new Vector2(-ModPanel.SHEAR_X, 0)
|
|
||||||
});
|
|
||||||
|
|
||||||
Task? loadTask;
|
Task? loadTask;
|
||||||
|
|
||||||
|
@ -42,7 +42,6 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
protected const double TRANSITION_DURATION = 150;
|
protected const double TRANSITION_DURATION = 150;
|
||||||
|
|
||||||
public const float SHEAR_X = 0.2f;
|
|
||||||
public const float CORNER_RADIUS = 7;
|
public const float CORNER_RADIUS = 7;
|
||||||
|
|
||||||
protected const float HEIGHT = 42;
|
protected const float HEIGHT = 42;
|
||||||
@ -67,7 +66,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
Content.Masking = true;
|
Content.Masking = true;
|
||||||
Content.CornerRadius = CORNER_RADIUS;
|
Content.CornerRadius = CORNER_RADIUS;
|
||||||
Content.BorderThickness = 2;
|
Content.BorderThickness = 2;
|
||||||
Content.Shear = new Vector2(SHEAR_X, 0);
|
Content.Shear = new Vector2(ShearedOverlayContainer.SHEAR, 0);
|
||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
@ -83,7 +82,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Active = { BindTarget = Active },
|
Active = { BindTarget = Active },
|
||||||
Shear = new Vector2(-SHEAR_X, 0),
|
Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0),
|
||||||
Scale = new Vector2(HEIGHT / ModSwitchSmall.DEFAULT_SIZE)
|
Scale = new Vector2(HEIGHT / ModSwitchSmall.DEFAULT_SIZE)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -116,10 +115,10 @@ namespace osu.Game.Overlays.Mods
|
|||||||
{
|
{
|
||||||
Text = mod.Name,
|
Text = mod.Name,
|
||||||
Font = OsuFont.TorusAlternate.With(size: 18, weight: FontWeight.SemiBold),
|
Font = OsuFont.TorusAlternate.With(size: 18, weight: FontWeight.SemiBold),
|
||||||
Shear = new Vector2(-SHEAR_X, 0),
|
Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0),
|
||||||
Margin = new MarginPadding
|
Margin = new MarginPadding
|
||||||
{
|
{
|
||||||
Left = -18 * SHEAR_X
|
Left = -18 * ShearedOverlayContainer.SHEAR
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
@ -128,7 +127,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
Font = OsuFont.Default.With(size: 12),
|
Font = OsuFont.Default.With(size: 12),
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
Truncate = true,
|
Truncate = true,
|
||||||
Shear = new Vector2(-SHEAR_X, 0)
|
Shear = new Vector2(-ShearedOverlayContainer.SHEAR, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -159,7 +158,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
playStateChangeSamples();
|
playStateChangeSamples();
|
||||||
UpdateState();
|
UpdateState();
|
||||||
});
|
});
|
||||||
Filtered.BindValueChanged(_ => updateFilterState());
|
Filtered.BindValueChanged(_ => updateFilterState(), true);
|
||||||
|
|
||||||
UpdateState();
|
UpdateState();
|
||||||
FinishTransforms(true);
|
FinishTransforms(true);
|
||||||
|
@ -20,6 +20,7 @@ using osu.Game.Graphics.Containers;
|
|||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Input.Bindings;
|
using osu.Game.Input.Bindings;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Screens;
|
using osu.Game.Screens;
|
||||||
using osu.Game.Utils;
|
using osu.Game.Utils;
|
||||||
@ -317,7 +318,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
CloseButton = new TriangleButton
|
CloseButton = new TriangleButton
|
||||||
{
|
{
|
||||||
Width = 180,
|
Width = 180,
|
||||||
Text = "Close",
|
Text = CommonStrings.ButtonsClose,
|
||||||
Action = Hide,
|
Action = Hide,
|
||||||
Origin = Anchor.CentreLeft,
|
Origin = Anchor.CentreLeft,
|
||||||
Anchor = Anchor.CentreLeft,
|
Anchor = Anchor.CentreLeft,
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
@ -9,7 +11,6 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
|
||||||
using osu.Framework.Input.Events;
|
using osu.Framework.Input.Events;
|
||||||
using osu.Framework.Layout;
|
using osu.Framework.Layout;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
@ -21,158 +22,58 @@ using osuTK.Input;
|
|||||||
|
|
||||||
namespace osu.Game.Overlays.Mods
|
namespace osu.Game.Overlays.Mods
|
||||||
{
|
{
|
||||||
public class ModSelectScreen : OsuFocusedOverlayContainer
|
public abstract class ModSelectScreen : ShearedOverlayContainer
|
||||||
{
|
{
|
||||||
[Cached]
|
protected override OverlayColourScheme ColourScheme => OverlayColourScheme.Green;
|
||||||
private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Green);
|
|
||||||
|
|
||||||
[Cached]
|
[Cached]
|
||||||
public Bindable<IReadOnlyList<Mod>> SelectedMods { get; private set; } = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());
|
public Bindable<IReadOnlyList<Mod>> SelectedMods { get; private set; } = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());
|
||||||
|
|
||||||
protected override bool StartHidden => true;
|
private Func<Mod, bool> isValidMod = m => true;
|
||||||
|
|
||||||
|
public Func<Mod, bool> IsValidMod
|
||||||
|
{
|
||||||
|
get => isValidMod;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
isValidMod = value ?? throw new ArgumentNullException(nameof(value));
|
||||||
|
|
||||||
|
if (IsLoaded)
|
||||||
|
updateAvailableMods();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether configurable <see cref="Mod"/>s can be configured by the local user.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual bool AllowCustomisation => true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether the total score multiplier calculated from the current selected set of mods should be shown.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual bool ShowTotalMultiplier => true;
|
||||||
|
|
||||||
|
protected virtual ModColumn CreateModColumn(ModType modType, Key[]? toggleKeys = null) => new ModColumn(modType, false, toggleKeys);
|
||||||
|
|
||||||
private readonly BindableBool customisationVisible = new BindableBool();
|
private readonly BindableBool customisationVisible = new BindableBool();
|
||||||
|
|
||||||
private DifficultyMultiplierDisplay multiplierDisplay;
|
private DifficultyMultiplierDisplay? multiplierDisplay;
|
||||||
private ModSettingsArea modSettingsArea;
|
private ModSettingsArea modSettingsArea = null!;
|
||||||
private FillFlowContainer<ModColumn> columnFlow;
|
private FillFlowContainer<ModColumn> columnFlow = null!;
|
||||||
private GridContainer grid;
|
|
||||||
private Container mainContent;
|
|
||||||
|
|
||||||
private PopupScreenTitle header;
|
|
||||||
private Container footer;
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both;
|
Header.Title = "Mod Select";
|
||||||
RelativePositionAxes = Axes.Both;
|
Header.Description = "Mods provide different ways to enjoy gameplay. Some have an effect on the score you can achieve during ranked play. Others are just for fun.";
|
||||||
|
|
||||||
InternalChildren = new Drawable[]
|
AddRange(new Drawable[]
|
||||||
{
|
{
|
||||||
mainContent = new Container
|
new ClickToReturnContainer
|
||||||
{
|
{
|
||||||
Origin = Anchor.BottomCentre,
|
|
||||||
Anchor = Anchor.BottomCentre,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Children = new Drawable[]
|
HandleMouse = { BindTarget = customisationVisible },
|
||||||
{
|
OnClicked = () => customisationVisible.Value = false
|
||||||
grid = new GridContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
RowDimensions = new[]
|
|
||||||
{
|
|
||||||
new Dimension(GridSizeMode.AutoSize),
|
|
||||||
new Dimension(GridSizeMode.AutoSize),
|
|
||||||
new Dimension(),
|
|
||||||
new Dimension(GridSizeMode.Absolute, 75),
|
|
||||||
},
|
|
||||||
Content = new[]
|
|
||||||
{
|
|
||||||
new Drawable[]
|
|
||||||
{
|
|
||||||
header = new PopupScreenTitle
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Title = "Mod Select",
|
|
||||||
Description = "Mods provide different ways to enjoy gameplay. Some have an effect on the score you can achieve during ranked play. Others are just for fun.",
|
|
||||||
Close = Hide
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new Drawable[]
|
|
||||||
{
|
|
||||||
new Container
|
|
||||||
{
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
AutoSizeAxes = Axes.X,
|
|
||||||
RelativePositionAxes = Axes.X,
|
|
||||||
X = 0.3f,
|
|
||||||
Height = DifficultyMultiplierDisplay.HEIGHT,
|
|
||||||
Margin = new MarginPadding
|
|
||||||
{
|
|
||||||
Horizontal = 100,
|
|
||||||
Vertical = 10
|
|
||||||
},
|
|
||||||
Child = multiplierDisplay = new DifficultyMultiplierDisplay
|
|
||||||
{
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new Drawable[]
|
|
||||||
{
|
|
||||||
new Container
|
|
||||||
{
|
|
||||||
Depth = float.MaxValue,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
RelativePositionAxes = Axes.Both,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new OsuScrollContainer(Direction.Horizontal)
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Masking = false,
|
|
||||||
ClampExtension = 100,
|
|
||||||
ScrollbarOverlapsContent = false,
|
|
||||||
Child = columnFlow = new ModColumnContainer
|
|
||||||
{
|
|
||||||
Direction = FillDirection.Horizontal,
|
|
||||||
RelativeSizeAxes = Axes.Y,
|
|
||||||
AutoSizeAxes = Axes.X,
|
|
||||||
Spacing = new Vector2(10, 0),
|
|
||||||
Margin = new MarginPadding { Right = 70 },
|
|
||||||
Children = new[]
|
|
||||||
{
|
|
||||||
new ModColumn(ModType.DifficultyReduction, false, new[] { Key.Q, Key.W, Key.E, Key.R, Key.T, Key.Y, Key.U, Key.I, Key.O, Key.P }),
|
|
||||||
new ModColumn(ModType.DifficultyIncrease, false, new[] { Key.A, Key.S, Key.D, Key.F, Key.G, Key.H, Key.J, Key.K, Key.L }),
|
|
||||||
new ModColumn(ModType.Automation, false, new[] { Key.Z, Key.X, Key.C, Key.V, Key.B, Key.N, Key.M }),
|
|
||||||
new ModColumn(ModType.Conversion, false),
|
|
||||||
new ModColumn(ModType.Fun, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new[] { Empty() }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
footer = new Container
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Anchor = Anchor.BottomCentre,
|
|
||||||
Origin = Anchor.BottomCentre,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Height = 50,
|
|
||||||
Anchor = Anchor.BottomCentre,
|
|
||||||
Origin = Anchor.BottomCentre,
|
|
||||||
Colour = colourProvider.Background5
|
|
||||||
},
|
|
||||||
new ShearedToggleButton(200)
|
|
||||||
{
|
|
||||||
Anchor = Anchor.BottomLeft,
|
|
||||||
Origin = Anchor.BottomLeft,
|
|
||||||
Margin = new MarginPadding { Vertical = 14, Left = 70 },
|
|
||||||
Text = "Mod Customisation",
|
|
||||||
Active = { BindTarget = customisationVisible }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new ClickToReturnContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
HandleMouse = { BindTarget = customisationVisible },
|
|
||||||
OnClicked = () => customisationVisible.Value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
modSettingsArea = new ModSettingsArea
|
modSettingsArea = new ModSettingsArea
|
||||||
{
|
{
|
||||||
@ -180,9 +81,76 @@ namespace osu.Game.Overlays.Mods
|
|||||||
Origin = Anchor.BottomCentre,
|
Origin = Anchor.BottomCentre,
|
||||||
Height = 0
|
Height = 0
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
columnFlow.Shear = new Vector2(ModPanel.SHEAR_X, 0);
|
MainAreaContent.AddRange(new Drawable[]
|
||||||
|
{
|
||||||
|
new Container
|
||||||
|
{
|
||||||
|
Padding = new MarginPadding
|
||||||
|
{
|
||||||
|
Top = (ShowTotalMultiplier ? DifficultyMultiplierDisplay.HEIGHT : 0) + PADDING,
|
||||||
|
},
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
RelativePositionAxes = Axes.Both,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new OsuScrollContainer(Direction.Horizontal)
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Masking = false,
|
||||||
|
ClampExtension = 100,
|
||||||
|
ScrollbarOverlapsContent = false,
|
||||||
|
Child = columnFlow = new ModColumnContainer
|
||||||
|
{
|
||||||
|
Direction = FillDirection.Horizontal,
|
||||||
|
Shear = new Vector2(SHEAR, 0),
|
||||||
|
RelativeSizeAxes = Axes.Y,
|
||||||
|
AutoSizeAxes = Axes.X,
|
||||||
|
Spacing = new Vector2(10, 0),
|
||||||
|
Margin = new MarginPadding { Right = 70 },
|
||||||
|
Children = new[]
|
||||||
|
{
|
||||||
|
CreateModColumn(ModType.DifficultyReduction, new[] { Key.Q, Key.W, Key.E, Key.R, Key.T, Key.Y, Key.U, Key.I, Key.O, Key.P }),
|
||||||
|
CreateModColumn(ModType.DifficultyIncrease, new[] { Key.A, Key.S, Key.D, Key.F, Key.G, Key.H, Key.J, Key.K, Key.L }),
|
||||||
|
CreateModColumn(ModType.Automation, new[] { Key.Z, Key.X, Key.C, Key.V, Key.B, Key.N, Key.M }),
|
||||||
|
CreateModColumn(ModType.Conversion),
|
||||||
|
CreateModColumn(ModType.Fun)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (ShowTotalMultiplier)
|
||||||
|
{
|
||||||
|
MainAreaContent.Add(new Container
|
||||||
|
{
|
||||||
|
Anchor = Anchor.TopRight,
|
||||||
|
Origin = Anchor.TopRight,
|
||||||
|
AutoSizeAxes = Axes.X,
|
||||||
|
Height = DifficultyMultiplierDisplay.HEIGHT,
|
||||||
|
Margin = new MarginPadding { Horizontal = 100 },
|
||||||
|
Child = multiplierDisplay = new DifficultyMultiplierDisplay
|
||||||
|
{
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AllowCustomisation)
|
||||||
|
{
|
||||||
|
Footer.Add(new ShearedToggleButton(200)
|
||||||
|
{
|
||||||
|
Anchor = Anchor.BottomLeft,
|
||||||
|
Origin = Anchor.BottomLeft,
|
||||||
|
Margin = new MarginPadding { Vertical = PADDING, Left = 70 },
|
||||||
|
Text = "Mod Customisation",
|
||||||
|
Active = { BindTarget = customisationVisible }
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
@ -204,10 +172,15 @@ namespace osu.Game.Overlays.Mods
|
|||||||
}
|
}
|
||||||
|
|
||||||
customisationVisible.BindValueChanged(_ => updateCustomisationVisualState(), true);
|
customisationVisible.BindValueChanged(_ => updateCustomisationVisualState(), true);
|
||||||
|
|
||||||
|
updateAvailableMods();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateMultiplier()
|
private void updateMultiplier()
|
||||||
{
|
{
|
||||||
|
if (multiplierDisplay == null)
|
||||||
|
return;
|
||||||
|
|
||||||
double multiplier = 1.0;
|
double multiplier = 1.0;
|
||||||
|
|
||||||
foreach (var mod in SelectedMods.Value)
|
foreach (var mod in SelectedMods.Value)
|
||||||
@ -216,8 +189,17 @@ namespace osu.Game.Overlays.Mods
|
|||||||
multiplierDisplay.Current.Value = multiplier;
|
multiplierDisplay.Current.Value = multiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateAvailableMods()
|
||||||
|
{
|
||||||
|
foreach (var column in columnFlow)
|
||||||
|
column.Filter = isValidMod;
|
||||||
|
}
|
||||||
|
|
||||||
private void updateCustomisation(ValueChangedEvent<IReadOnlyList<Mod>> valueChangedEvent)
|
private void updateCustomisation(ValueChangedEvent<IReadOnlyList<Mod>> valueChangedEvent)
|
||||||
{
|
{
|
||||||
|
if (!AllowCustomisation)
|
||||||
|
return;
|
||||||
|
|
||||||
bool anyCustomisableMod = false;
|
bool anyCustomisableMod = false;
|
||||||
bool anyModWithRequiredCustomisationAdded = false;
|
bool anyModWithRequiredCustomisationAdded = false;
|
||||||
|
|
||||||
@ -247,12 +229,12 @@ namespace osu.Game.Overlays.Mods
|
|||||||
{
|
{
|
||||||
const double transition_duration = 300;
|
const double transition_duration = 300;
|
||||||
|
|
||||||
grid.FadeColour(customisationVisible.Value ? Colour4.Gray : Colour4.White, transition_duration, Easing.InOutCubic);
|
MainAreaContent.FadeColour(customisationVisible.Value ? Colour4.Gray : Colour4.White, transition_duration, Easing.InOutCubic);
|
||||||
|
|
||||||
float modAreaHeight = customisationVisible.Value ? ModSettingsArea.HEIGHT : 0;
|
float modAreaHeight = customisationVisible.Value ? ModSettingsArea.HEIGHT : 0;
|
||||||
|
|
||||||
modSettingsArea.ResizeHeightTo(modAreaHeight, transition_duration, Easing.InOutCubic);
|
modSettingsArea.ResizeHeightTo(modAreaHeight, transition_duration, Easing.InOutCubic);
|
||||||
mainContent.TransformTo(nameof(Margin), new MarginPadding { Bottom = modAreaHeight }, transition_duration, Easing.InOutCubic);
|
TopLevelContent.MoveToY(-modAreaHeight, transition_duration, Easing.InOutCubic);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool selectionBindableSyncInProgress;
|
private bool selectionBindableSyncInProgress;
|
||||||
@ -287,12 +269,8 @@ namespace osu.Game.Overlays.Mods
|
|||||||
const double fade_in_duration = 400;
|
const double fade_in_duration = 400;
|
||||||
|
|
||||||
base.PopIn();
|
base.PopIn();
|
||||||
this.FadeIn(fade_in_duration, Easing.OutQuint);
|
|
||||||
|
|
||||||
header.MoveToY(0, fade_in_duration, Easing.OutQuint);
|
multiplierDisplay?
|
||||||
footer.MoveToY(0, fade_in_duration, Easing.OutQuint);
|
|
||||||
|
|
||||||
multiplierDisplay
|
|
||||||
.Delay(fade_in_duration * 0.65f)
|
.Delay(fade_in_duration * 0.65f)
|
||||||
.FadeIn(fade_in_duration / 2, Easing.OutQuint)
|
.FadeIn(fade_in_duration / 2, Easing.OutQuint)
|
||||||
.ScaleTo(1, fade_in_duration, Easing.OutElastic);
|
.ScaleTo(1, fade_in_duration, Easing.OutElastic);
|
||||||
@ -311,15 +289,11 @@ namespace osu.Game.Overlays.Mods
|
|||||||
const double fade_out_duration = 500;
|
const double fade_out_duration = 500;
|
||||||
|
|
||||||
base.PopOut();
|
base.PopOut();
|
||||||
this.FadeOut(fade_out_duration, Easing.OutQuint);
|
|
||||||
|
|
||||||
multiplierDisplay
|
multiplierDisplay?
|
||||||
.FadeOut(fade_out_duration / 2, Easing.OutQuint)
|
.FadeOut(fade_out_duration / 2, Easing.OutQuint)
|
||||||
.ScaleTo(0.75f, fade_out_duration, Easing.OutQuint);
|
.ScaleTo(0.75f, fade_out_duration, Easing.OutQuint);
|
||||||
|
|
||||||
header.MoveToY(-header.DrawHeight, fade_out_duration, Easing.OutQuint);
|
|
||||||
footer.MoveToY(footer.DrawHeight, fade_out_duration, Easing.OutQuint);
|
|
||||||
|
|
||||||
for (int i = 0; i < columnFlow.Count; i++)
|
for (int i = 0; i < columnFlow.Count; i++)
|
||||||
{
|
{
|
||||||
const float distance = 700;
|
const float distance = 700;
|
||||||
@ -355,7 +329,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
{
|
{
|
||||||
Padding = new MarginPadding
|
Padding = new MarginPadding
|
||||||
{
|
{
|
||||||
Left = DrawHeight * ModPanel.SHEAR_X,
|
Left = DrawHeight * SHEAR,
|
||||||
Bottom = 10
|
Bottom = 10
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -368,7 +342,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
{
|
{
|
||||||
public BindableBool HandleMouse { get; } = new BindableBool();
|
public BindableBool HandleMouse { get; } = new BindableBool();
|
||||||
|
|
||||||
public Action OnClicked { get; set; }
|
public Action? OnClicked { get; set; }
|
||||||
|
|
||||||
protected override bool Handle(UIEvent e)
|
protected override bool Handle(UIEvent e)
|
||||||
{
|
{
|
||||||
|
138
osu.Game/Overlays/Mods/ShearedOverlayContainer.cs
Normal file
138
osu.Game/Overlays/Mods/ShearedOverlayContainer.cs
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Game.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
|
||||||
|
namespace osu.Game.Overlays.Mods
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A sheared overlay which provides a header and footer and basic animations.
|
||||||
|
/// Exposes <see cref="TopLevelContent"/>, <see cref="MainAreaContent"/> and <see cref="Footer"/> as valid targets for content.
|
||||||
|
/// </summary>
|
||||||
|
public abstract class ShearedOverlayContainer : OsuFocusedOverlayContainer
|
||||||
|
{
|
||||||
|
protected const float PADDING = 14;
|
||||||
|
|
||||||
|
public const float SHEAR = 0.2f;
|
||||||
|
|
||||||
|
[Cached]
|
||||||
|
protected readonly OverlayColourProvider ColourProvider;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The overlay's header.
|
||||||
|
/// </summary>
|
||||||
|
protected ShearedOverlayHeader Header { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The overlay's footer.
|
||||||
|
/// </summary>
|
||||||
|
protected Container Footer { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A container containing all content, including the header and footer.
|
||||||
|
/// May be used for overlay-wide animations.
|
||||||
|
/// </summary>
|
||||||
|
protected Container TopLevelContent { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A container for content that is to be displayed between the header and footer.
|
||||||
|
/// </summary>
|
||||||
|
protected Container MainAreaContent { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A container for content that is to be displayed inside the footer.
|
||||||
|
/// </summary>
|
||||||
|
protected Container FooterContent { get; private set; }
|
||||||
|
|
||||||
|
protected abstract OverlayColourScheme ColourScheme { get; }
|
||||||
|
|
||||||
|
protected override bool StartHidden => true;
|
||||||
|
|
||||||
|
protected override bool BlockNonPositionalInput => true;
|
||||||
|
|
||||||
|
protected ShearedOverlayContainer()
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both;
|
||||||
|
|
||||||
|
ColourProvider = new OverlayColourProvider(ColourScheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
const float footer_height = 50;
|
||||||
|
|
||||||
|
Child = TopLevelContent = new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
Header = new ShearedOverlayHeader
|
||||||
|
{
|
||||||
|
Anchor = Anchor.TopCentre,
|
||||||
|
Depth = float.MinValue,
|
||||||
|
Origin = Anchor.TopCentre,
|
||||||
|
Close = Hide
|
||||||
|
},
|
||||||
|
MainAreaContent = new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Padding = new MarginPadding
|
||||||
|
{
|
||||||
|
Top = ShearedOverlayHeader.HEIGHT,
|
||||||
|
Bottom = footer_height + PADDING,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Footer = new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Depth = float.MinValue,
|
||||||
|
Height = footer_height,
|
||||||
|
Margin = new MarginPadding { Top = PADDING },
|
||||||
|
Anchor = Anchor.BottomCentre,
|
||||||
|
Origin = Anchor.BottomCentre,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Box
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Colour = ColourProvider.Background5
|
||||||
|
},
|
||||||
|
FooterContent = new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void PopIn()
|
||||||
|
{
|
||||||
|
const double fade_in_duration = 400;
|
||||||
|
|
||||||
|
base.PopIn();
|
||||||
|
this.FadeIn(fade_in_duration, Easing.OutQuint);
|
||||||
|
|
||||||
|
Header.MoveToY(0, fade_in_duration, Easing.OutQuint);
|
||||||
|
Footer.MoveToY(0, fade_in_duration, Easing.OutQuint);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void PopOut()
|
||||||
|
{
|
||||||
|
const double fade_out_duration = 500;
|
||||||
|
|
||||||
|
base.PopOut();
|
||||||
|
this.FadeOut(fade_out_duration, Easing.OutQuint);
|
||||||
|
|
||||||
|
Header.MoveToY(-Header.DrawHeight, fade_out_duration, Easing.OutQuint);
|
||||||
|
Footer.MoveToY(Footer.DrawHeight, fade_out_duration, Easing.OutQuint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
24
osu.Game/Overlays/Mods/UserModSelectScreen.cs
Normal file
24
osu.Game/Overlays/Mods/UserModSelectScreen.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// 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 JetBrains.Annotations;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
|
using osuTK.Input;
|
||||||
|
|
||||||
|
namespace osu.Game.Overlays.Mods
|
||||||
|
{
|
||||||
|
public class UserModSelectScreen : ModSelectScreen
|
||||||
|
{
|
||||||
|
protected override ModColumn CreateModColumn(ModType modType, Key[] toggleKeys = null) => new UserModColumn(modType, false, toggleKeys);
|
||||||
|
|
||||||
|
private class UserModColumn : ModColumn
|
||||||
|
{
|
||||||
|
public UserModColumn(ModType modType, bool allowBulkSelection, [CanBeNull] Key[] toggleKeys = null)
|
||||||
|
: base(modType, allowBulkSelection, toggleKeys)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override ModPanel CreateModPanel(Mod mod) => new IncompatibilityDisplayingModPanel(mod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -15,7 +15,8 @@ using osu.Framework.Localisation;
|
|||||||
using osu.Framework.Logging;
|
using osu.Framework.Logging;
|
||||||
using osu.Framework.Threading;
|
using osu.Framework.Threading;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Localisation;
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
using NotificationsStrings = osu.Game.Localisation.NotificationsStrings;
|
||||||
|
|
||||||
namespace osu.Game.Overlays
|
namespace osu.Game.Overlays
|
||||||
{
|
{
|
||||||
@ -61,7 +62,7 @@ namespace osu.Game.Overlays
|
|||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
new NotificationSection(@"Notifications", @"Clear All")
|
new NotificationSection(AccountsStrings.NotificationsTitle, "Clear All")
|
||||||
{
|
{
|
||||||
AcceptTypes = new[] { typeof(SimpleNotification) }
|
AcceptTypes = new[] { typeof(SimpleNotification) }
|
||||||
},
|
},
|
||||||
|
@ -6,6 +6,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Extensions.IEnumerableExtensions;
|
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||||
|
using osu.Framework.Extensions.LocalisationExtensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
@ -34,9 +35,9 @@ namespace osu.Game.Overlays.Notifications
|
|||||||
|
|
||||||
private readonly string clearButtonText;
|
private readonly string clearButtonText;
|
||||||
|
|
||||||
private readonly string titleText;
|
private readonly LocalisableString titleText;
|
||||||
|
|
||||||
public NotificationSection(string title, string clearButtonText)
|
public NotificationSection(LocalisableString title, string clearButtonText)
|
||||||
{
|
{
|
||||||
this.clearButtonText = clearButtonText.ToUpperInvariant();
|
this.clearButtonText = clearButtonText.ToUpperInvariant();
|
||||||
titleText = title;
|
titleText = title;
|
||||||
@ -84,7 +85,7 @@ namespace osu.Game.Overlays.Notifications
|
|||||||
{
|
{
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = titleText.ToUpperInvariant(),
|
Text = titleText.ToUpper(),
|
||||||
Font = OsuFont.GetFont(weight: FontWeight.Bold)
|
Font = OsuFont.GetFont(weight: FontWeight.Bold)
|
||||||
},
|
},
|
||||||
countDrawable = new OsuSpriteText
|
countDrawable = new OsuSpriteText
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
|
||||||
using Humanizer;
|
using Humanizer;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
@ -11,10 +10,12 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
@ -83,7 +84,7 @@ namespace osu.Game.Overlays.Profile.Header
|
|||||||
if (user == null) return;
|
if (user == null) return;
|
||||||
|
|
||||||
if (user.JoinDate.ToUniversalTime().Year < 2008)
|
if (user.JoinDate.ToUniversalTime().Year < 2008)
|
||||||
topLinkContainer.AddText("Here since the beginning");
|
topLinkContainer.AddText(UsersStrings.ShowFirstMembers);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
topLinkContainer.AddText("Joined ");
|
topLinkContainer.AddText("Joined ");
|
||||||
@ -94,7 +95,7 @@ namespace osu.Game.Overlays.Profile.Header
|
|||||||
|
|
||||||
if (user.IsOnline)
|
if (user.IsOnline)
|
||||||
{
|
{
|
||||||
topLinkContainer.AddText("Currently online");
|
topLinkContainer.AddText(UsersStrings.ShowLastvisitOnline);
|
||||||
addSpacer(topLinkContainer);
|
addSpacer(topLinkContainer);
|
||||||
}
|
}
|
||||||
else if (user.LastVisit.HasValue)
|
else if (user.LastVisit.HasValue)
|
||||||
@ -108,7 +109,16 @@ namespace osu.Game.Overlays.Profile.Header
|
|||||||
if (user.PlayStyles?.Length > 0)
|
if (user.PlayStyles?.Length > 0)
|
||||||
{
|
{
|
||||||
topLinkContainer.AddText("Plays with ");
|
topLinkContainer.AddText("Plays with ");
|
||||||
topLinkContainer.AddText(string.Join(", ", user.PlayStyles.Select(style => style.GetDescription())), embolden);
|
|
||||||
|
LocalisableString playStylesString = user.PlayStyles[0].GetLocalisableDescription();
|
||||||
|
|
||||||
|
for (int i = 1; i < user.PlayStyles.Length; i++)
|
||||||
|
{
|
||||||
|
playStylesString = new TranslatableString(@"_", @"{0}{1}", playStylesString, CommonStrings.ArrayAndWordsConnector);
|
||||||
|
playStylesString = new TranslatableString(@"_", @"{0}{1}", playStylesString, user.PlayStyles[i].GetLocalisableDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
topLinkContainer.AddText(playStylesString, embolden);
|
||||||
|
|
||||||
addSpacer(topLinkContainer);
|
addSpacer(topLinkContainer);
|
||||||
}
|
}
|
||||||
|
@ -20,11 +20,12 @@ namespace osu.Game.Overlays.Profile.Sections.Beatmaps
|
|||||||
private const float panel_padding = 10f;
|
private const float panel_padding = 10f;
|
||||||
private readonly BeatmapSetType type;
|
private readonly BeatmapSetType type;
|
||||||
|
|
||||||
|
protected override int InitialItemsCount => type == BeatmapSetType.Graveyard ? 2 : 6;
|
||||||
|
|
||||||
public PaginatedBeatmapContainer(BeatmapSetType type, Bindable<APIUser> user, LocalisableString headerText)
|
public PaginatedBeatmapContainer(BeatmapSetType type, Bindable<APIUser> user, LocalisableString headerText)
|
||||||
: base(user, headerText)
|
: base(user, headerText)
|
||||||
{
|
{
|
||||||
this.type = type;
|
this.type = type;
|
||||||
ItemsPerPage = 6;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -57,8 +58,8 @@ namespace osu.Game.Overlays.Profile.Sections.Beatmaps
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override APIRequest<List<APIBeatmapSet>> CreateRequest() =>
|
protected override APIRequest<List<APIBeatmapSet>> CreateRequest(PaginationParameters pagination) =>
|
||||||
new GetUserBeatmapsRequest(User.Value.Id, type, VisiblePages++, ItemsPerPage);
|
new GetUserBeatmapsRequest(User.Value.Id, type, pagination);
|
||||||
|
|
||||||
protected override Drawable CreateDrawableItem(APIBeatmapSet model) => model.OnlineID > 0
|
protected override Drawable CreateDrawableItem(APIBeatmapSet model) => model.OnlineID > 0
|
||||||
? new BeatmapCardNormal(model)
|
? new BeatmapCardNormal(model)
|
||||||
|
@ -19,7 +19,6 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
|
|||||||
public PaginatedMostPlayedBeatmapContainer(Bindable<APIUser> user)
|
public PaginatedMostPlayedBeatmapContainer(Bindable<APIUser> user)
|
||||||
: base(user, UsersStrings.ShowExtraHistoricalMostPlayedTitle)
|
: base(user, UsersStrings.ShowExtraHistoricalMostPlayedTitle)
|
||||||
{
|
{
|
||||||
ItemsPerPage = 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -30,8 +29,8 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
|
|||||||
|
|
||||||
protected override int GetCount(APIUser user) => user.BeatmapPlayCountsCount;
|
protected override int GetCount(APIUser user) => user.BeatmapPlayCountsCount;
|
||||||
|
|
||||||
protected override APIRequest<List<APIUserMostPlayedBeatmap>> CreateRequest() =>
|
protected override APIRequest<List<APIUserMostPlayedBeatmap>> CreateRequest(PaginationParameters pagination) =>
|
||||||
new GetUserMostPlayedBeatmapsRequest(User.Value.Id, VisiblePages++, ItemsPerPage);
|
new GetUserMostPlayedBeatmapsRequest(User.Value.Id, pagination);
|
||||||
|
|
||||||
protected override Drawable CreateDrawableItem(APIUserMostPlayedBeatmap mostPlayed) =>
|
protected override Drawable CreateDrawableItem(APIUserMostPlayedBeatmap mostPlayed) =>
|
||||||
new DrawableMostPlayedBeatmap(mostPlayed);
|
new DrawableMostPlayedBeatmap(mostPlayed);
|
||||||
|
@ -17,11 +17,10 @@ namespace osu.Game.Overlays.Profile.Sections.Kudosu
|
|||||||
public PaginatedKudosuHistoryContainer(Bindable<APIUser> user)
|
public PaginatedKudosuHistoryContainer(Bindable<APIUser> user)
|
||||||
: base(user, missingText: UsersStrings.ShowExtraKudosuEntryEmpty)
|
: base(user, missingText: UsersStrings.ShowExtraKudosuEntryEmpty)
|
||||||
{
|
{
|
||||||
ItemsPerPage = 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override APIRequest<List<APIKudosuHistory>> CreateRequest()
|
protected override APIRequest<List<APIKudosuHistory>> CreateRequest(PaginationParameters pagination)
|
||||||
=> new GetUserKudosuHistoryRequest(User.Value.Id, VisiblePages++, ItemsPerPage);
|
=> new GetUserKudosuHistoryRequest(User.Value.Id, pagination);
|
||||||
|
|
||||||
protected override Drawable CreateDrawableItem(APIKudosuHistory item) => new DrawableKudosuHistoryItem(item);
|
protected override Drawable CreateDrawableItem(APIKudosuHistory item) => new DrawableKudosuHistoryItem(item);
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ using osu.Game.Graphics.Sprites;
|
|||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
@ -21,11 +22,20 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
{
|
{
|
||||||
public abstract class PaginatedProfileSubsection<TModel> : ProfileSubsection
|
public abstract class PaginatedProfileSubsection<TModel> : ProfileSubsection
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The number of items displayed per page.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual int ItemsPerPage => 50;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The number of items displayed initially.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual int InitialItemsCount => 5;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private IAPIProvider api { get; set; }
|
private IAPIProvider api { get; set; }
|
||||||
|
|
||||||
protected int VisiblePages;
|
protected PaginationParameters? CurrentPage { get; private set; }
|
||||||
protected int ItemsPerPage;
|
|
||||||
|
|
||||||
protected ReverseChildIDFillFlowContainer<Drawable> ItemsContainer { get; private set; }
|
protected ReverseChildIDFillFlowContainer<Drawable> ItemsContainer { get; private set; }
|
||||||
|
|
||||||
@ -87,7 +97,7 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
loadCancellation?.Cancel();
|
loadCancellation?.Cancel();
|
||||||
retrievalRequest?.Cancel();
|
retrievalRequest?.Cancel();
|
||||||
|
|
||||||
VisiblePages = 0;
|
CurrentPage = null;
|
||||||
ItemsContainer.Clear();
|
ItemsContainer.Clear();
|
||||||
|
|
||||||
if (e.NewValue != null)
|
if (e.NewValue != null)
|
||||||
@ -101,7 +111,9 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
{
|
{
|
||||||
loadCancellation = new CancellationTokenSource();
|
loadCancellation = new CancellationTokenSource();
|
||||||
|
|
||||||
retrievalRequest = CreateRequest();
|
CurrentPage = CurrentPage?.TakeNext(ItemsPerPage) ?? new PaginationParameters(InitialItemsCount);
|
||||||
|
|
||||||
|
retrievalRequest = CreateRequest(CurrentPage.Value);
|
||||||
retrievalRequest.Success += UpdateItems;
|
retrievalRequest.Success += UpdateItems;
|
||||||
|
|
||||||
api.Queue(retrievalRequest);
|
api.Queue(retrievalRequest);
|
||||||
@ -111,7 +123,7 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
{
|
{
|
||||||
OnItemsReceived(items);
|
OnItemsReceived(items);
|
||||||
|
|
||||||
if (!items.Any() && VisiblePages == 1)
|
if (!items.Any() && CurrentPage?.Offset == 0)
|
||||||
{
|
{
|
||||||
moreButton.Hide();
|
moreButton.Hide();
|
||||||
moreButton.IsLoading = false;
|
moreButton.IsLoading = false;
|
||||||
@ -125,7 +137,8 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
LoadComponentsAsync(items.Select(CreateDrawableItem).Where(d => d != null), drawables =>
|
LoadComponentsAsync(items.Select(CreateDrawableItem).Where(d => d != null), drawables =>
|
||||||
{
|
{
|
||||||
missing.Hide();
|
missing.Hide();
|
||||||
moreButton.FadeTo(items.Count == ItemsPerPage ? 1 : 0);
|
|
||||||
|
moreButton.FadeTo(items.Count == CurrentPage?.Limit ? 1 : 0);
|
||||||
moreButton.IsLoading = false;
|
moreButton.IsLoading = false;
|
||||||
|
|
||||||
ItemsContainer.AddRange(drawables);
|
ItemsContainer.AddRange(drawables);
|
||||||
@ -138,7 +151,7 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract APIRequest<List<TModel>> CreateRequest();
|
protected abstract APIRequest<List<TModel>> CreateRequest(PaginationParameters pagination);
|
||||||
|
|
||||||
protected abstract Drawable CreateDrawableItem(TModel model);
|
protected abstract Drawable CreateDrawableItem(TModel model);
|
||||||
|
|
||||||
|
@ -23,8 +23,6 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
|
|||||||
: base(user, headerText)
|
: base(user, headerText)
|
||||||
{
|
{
|
||||||
this.type = type;
|
this.type = type;
|
||||||
|
|
||||||
ItemsPerPage = 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -56,14 +54,14 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
|
|||||||
|
|
||||||
protected override void OnItemsReceived(List<APIScore> items)
|
protected override void OnItemsReceived(List<APIScore> items)
|
||||||
{
|
{
|
||||||
if (VisiblePages == 0)
|
if (CurrentPage == null || CurrentPage?.Offset == 0)
|
||||||
drawableItemIndex = 0;
|
drawableItemIndex = 0;
|
||||||
|
|
||||||
base.OnItemsReceived(items);
|
base.OnItemsReceived(items);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override APIRequest<List<APIScore>> CreateRequest() =>
|
protected override APIRequest<List<APIScore>> CreateRequest(PaginationParameters pagination) =>
|
||||||
new GetUserScoresRequest(User.Value.Id, type, VisiblePages++, ItemsPerPage);
|
new GetUserScoresRequest(User.Value.Id, type, pagination);
|
||||||
|
|
||||||
private int drawableItemIndex;
|
private int drawableItemIndex;
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@ namespace osu.Game.Overlays.Profile.Sections.Recent
|
|||||||
public PaginatedRecentActivityContainer(Bindable<APIUser> user)
|
public PaginatedRecentActivityContainer(Bindable<APIUser> user)
|
||||||
: base(user, missingText: EventsStrings.Empty)
|
: base(user, missingText: EventsStrings.Empty)
|
||||||
{
|
{
|
||||||
ItemsPerPage = 10;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -28,8 +27,8 @@ namespace osu.Game.Overlays.Profile.Sections.Recent
|
|||||||
ItemsContainer.Spacing = new Vector2(0, 8);
|
ItemsContainer.Spacing = new Vector2(0, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override APIRequest<List<APIRecentActivity>> CreateRequest() =>
|
protected override APIRequest<List<APIRecentActivity>> CreateRequest(PaginationParameters pagination) =>
|
||||||
new GetUserRecentActivitiesRequest(User.Value.Id, VisiblePages++, ItemsPerPage);
|
new GetUserRecentActivitiesRequest(User.Value.Id, pagination);
|
||||||
|
|
||||||
protected override Drawable CreateDrawableItem(APIRecentActivity model) => new DrawableRecentActivity(model);
|
protected override Drawable CreateDrawableItem(APIRecentActivity model) => new DrawableRecentActivity(model);
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ using osu.Game.Graphics.Sprites;
|
|||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Input;
|
using osu.Game.Input;
|
||||||
using osu.Game.Input.Bindings;
|
using osu.Game.Input.Bindings;
|
||||||
using osu.Game.Localisation;
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
using osuTK.Input;
|
using osuTK.Input;
|
||||||
@ -402,7 +402,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
|
|||||||
{
|
{
|
||||||
public CancelButton()
|
public CancelButton()
|
||||||
{
|
{
|
||||||
Text = CommonStrings.Cancel;
|
Text = CommonStrings.ButtonsCancel;
|
||||||
Size = new Vector2(80, 20);
|
Size = new Vector2(80, 20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -411,7 +411,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
|
|||||||
{
|
{
|
||||||
public ClearButton()
|
public ClearButton()
|
||||||
{
|
{
|
||||||
Text = CommonStrings.Clear;
|
Text = CommonStrings.ButtonsClear;
|
||||||
Size = new Vector2(80, 20);
|
Size = new Vector2(80, 20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ using osu.Framework.Graphics.Effects;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Users.Drawables;
|
using osu.Game.Users.Drawables;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
@ -62,7 +63,7 @@ namespace osu.Game.Overlays.Toolbar
|
|||||||
switch (state.NewValue)
|
switch (state.NewValue)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
Text = @"Guest";
|
Text = UsersStrings.AnonymousUsername;
|
||||||
avatar.User = new APIUser();
|
avatar.User = new APIUser();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -7,7 +7,9 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Containers.Markdown;
|
using osu.Framework.Graphics.Containers.Markdown;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Wiki.Markdown
|
namespace osu.Game.Overlays.Wiki.Markdown
|
||||||
{
|
{
|
||||||
@ -46,14 +48,14 @@ namespace osu.Game.Overlays.Wiki.Markdown
|
|||||||
{
|
{
|
||||||
Add(new NoticeBox
|
Add(new NoticeBox
|
||||||
{
|
{
|
||||||
Text = "The content on this page is incomplete or outdated. If you are able to help out, please consider updating the article!",
|
Text = WikiStrings.ShowIncompleteOrOutdated,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (needsCleanup)
|
else if (needsCleanup)
|
||||||
{
|
{
|
||||||
Add(new NoticeBox
|
Add(new NoticeBox
|
||||||
{
|
{
|
||||||
Text = "This page does not meet the standards of the osu! wiki and needs to be cleaned up or rewritten. If you are able to help out, please consider updating the article!",
|
Text = WikiStrings.ShowNeedsCleanupOrRewrite,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -63,7 +65,7 @@ namespace osu.Game.Overlays.Wiki.Markdown
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private IMarkdownTextFlowComponent parentFlowComponent { get; set; }
|
private IMarkdownTextFlowComponent parentFlowComponent { get; set; }
|
||||||
|
|
||||||
public string Text { get; set; }
|
public LocalisableString Text { get; set; }
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OverlayColourProvider colourProvider, OsuColour colour)
|
private void load(OverlayColourProvider colourProvider, OsuColour colour)
|
||||||
|
@ -3,11 +3,13 @@
|
|||||||
|
|
||||||
using Markdig.Syntax;
|
using Markdig.Syntax;
|
||||||
using Markdig.Syntax.Inlines;
|
using Markdig.Syntax.Inlines;
|
||||||
|
using osu.Framework.Extensions.LocalisationExtensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Containers.Markdown;
|
using osu.Framework.Graphics.Containers.Markdown;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Wiki
|
namespace osu.Game.Overlays.Wiki
|
||||||
{
|
{
|
||||||
@ -24,7 +26,7 @@ namespace osu.Game.Overlays.Wiki
|
|||||||
{
|
{
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = "CONTENTS",
|
Text = WikiStrings.ShowToc.ToUpper(),
|
||||||
Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold),
|
Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold),
|
||||||
Margin = new MarginPadding { Bottom = 5 },
|
Margin = new MarginPadding { Bottom = 5 },
|
||||||
},
|
},
|
||||||
|
@ -17,6 +17,7 @@ using osu.Framework.Input.Events;
|
|||||||
using osu.Framework.Utils;
|
using osu.Framework.Utils;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Input.Bindings;
|
using osu.Game.Input.Bindings;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets.Edit;
|
using osu.Game.Rulesets.Edit;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Input;
|
using osuTK.Input;
|
||||||
@ -358,7 +359,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
if (SelectedBlueprints.Count == 1)
|
if (SelectedBlueprints.Count == 1)
|
||||||
items.AddRange(SelectedBlueprints[0].ContextMenuItems);
|
items.AddRange(SelectedBlueprints[0].ContextMenuItems);
|
||||||
|
|
||||||
items.Add(new OsuMenuItem("Delete", MenuItemType.Destructive, DeleteSelected));
|
items.Add(new OsuMenuItem(CommonStrings.ButtonsDelete, MenuItemType.Destructive, DeleteSelected));
|
||||||
|
|
||||||
return items.ToArray();
|
return items.ToArray();
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ using osu.Game.Input.Bindings;
|
|||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Overlays.Notifications;
|
using osu.Game.Overlays.Notifications;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Rulesets.Edit;
|
using osu.Game.Rulesets.Edit;
|
||||||
using osu.Game.Screens.Edit.Components;
|
using osu.Game.Screens.Edit.Components;
|
||||||
@ -252,7 +253,7 @@ namespace osu.Game.Screens.Edit
|
|||||||
{
|
{
|
||||||
Items = createFileMenuItems()
|
Items = createFileMenuItems()
|
||||||
},
|
},
|
||||||
new MenuItem("Edit")
|
new MenuItem(CommonStrings.ButtonsEdit)
|
||||||
{
|
{
|
||||||
Items = new[]
|
Items = new[]
|
||||||
{
|
{
|
||||||
|
@ -8,6 +8,7 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Graphics.UserInterfaceV2;
|
using osu.Game.Graphics.UserInterfaceV2;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Edit.Setup
|
namespace osu.Game.Screens.Edit.Setup
|
||||||
{
|
{
|
||||||
@ -27,7 +28,7 @@ namespace osu.Game.Screens.Edit.Setup
|
|||||||
{
|
{
|
||||||
circleSizeSlider = new LabelledSliderBar<float>
|
circleSizeSlider = new LabelledSliderBar<float>
|
||||||
{
|
{
|
||||||
Label = "Object Size",
|
Label = BeatmapsetsStrings.ShowStatsCs,
|
||||||
FixedLabelWidth = LABEL_WIDTH,
|
FixedLabelWidth = LABEL_WIDTH,
|
||||||
Description = "The size of all hit objects",
|
Description = "The size of all hit objects",
|
||||||
Current = new BindableFloat(Beatmap.Difficulty.CircleSize)
|
Current = new BindableFloat(Beatmap.Difficulty.CircleSize)
|
||||||
@ -40,7 +41,7 @@ namespace osu.Game.Screens.Edit.Setup
|
|||||||
},
|
},
|
||||||
healthDrainSlider = new LabelledSliderBar<float>
|
healthDrainSlider = new LabelledSliderBar<float>
|
||||||
{
|
{
|
||||||
Label = "Health Drain",
|
Label = BeatmapsetsStrings.ShowStatsDrain,
|
||||||
FixedLabelWidth = LABEL_WIDTH,
|
FixedLabelWidth = LABEL_WIDTH,
|
||||||
Description = "The rate of passive health drain throughout playable time",
|
Description = "The rate of passive health drain throughout playable time",
|
||||||
Current = new BindableFloat(Beatmap.Difficulty.DrainRate)
|
Current = new BindableFloat(Beatmap.Difficulty.DrainRate)
|
||||||
@ -53,7 +54,7 @@ namespace osu.Game.Screens.Edit.Setup
|
|||||||
},
|
},
|
||||||
approachRateSlider = new LabelledSliderBar<float>
|
approachRateSlider = new LabelledSliderBar<float>
|
||||||
{
|
{
|
||||||
Label = "Approach Rate",
|
Label = BeatmapsetsStrings.ShowStatsAr,
|
||||||
FixedLabelWidth = LABEL_WIDTH,
|
FixedLabelWidth = LABEL_WIDTH,
|
||||||
Description = "The speed at which objects are presented to the player",
|
Description = "The speed at which objects are presented to the player",
|
||||||
Current = new BindableFloat(Beatmap.Difficulty.ApproachRate)
|
Current = new BindableFloat(Beatmap.Difficulty.ApproachRate)
|
||||||
@ -66,7 +67,7 @@ namespace osu.Game.Screens.Edit.Setup
|
|||||||
},
|
},
|
||||||
overallDifficultySlider = new LabelledSliderBar<float>
|
overallDifficultySlider = new LabelledSliderBar<float>
|
||||||
{
|
{
|
||||||
Label = "Overall Difficulty",
|
Label = BeatmapsetsStrings.ShowStatsAccuracy,
|
||||||
FixedLabelWidth = LABEL_WIDTH,
|
FixedLabelWidth = LABEL_WIDTH,
|
||||||
Description = "The harshness of hit windows and difficulty of special objects (ie. spinners)",
|
Description = "The harshness of hit windows and difficulty of special objects (ie. spinners)",
|
||||||
Current = new BindableFloat(Beatmap.Difficulty.OverallDifficulty)
|
Current = new BindableFloat(Beatmap.Difficulty.OverallDifficulty)
|
||||||
|
@ -7,6 +7,7 @@ using osu.Framework.Graphics.UserInterface;
|
|||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Graphics.UserInterfaceV2;
|
using osu.Game.Graphics.UserInterfaceV2;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Edit.Setup
|
namespace osu.Game.Screens.Edit.Setup
|
||||||
{
|
{
|
||||||
@ -48,15 +49,15 @@ namespace osu.Game.Screens.Edit.Setup
|
|||||||
|
|
||||||
creatorTextBox = createTextBox<LabelledTextBox>("Creator", metadata.Author.Username),
|
creatorTextBox = createTextBox<LabelledTextBox>("Creator", metadata.Author.Username),
|
||||||
difficultyTextBox = createTextBox<LabelledTextBox>("Difficulty Name", Beatmap.BeatmapInfo.DifficultyName),
|
difficultyTextBox = createTextBox<LabelledTextBox>("Difficulty Name", Beatmap.BeatmapInfo.DifficultyName),
|
||||||
sourceTextBox = createTextBox<LabelledTextBox>("Source", metadata.Source),
|
sourceTextBox = createTextBox<LabelledTextBox>(BeatmapsetsStrings.ShowInfoSource, metadata.Source),
|
||||||
tagsTextBox = createTextBox<LabelledTextBox>("Tags", metadata.Tags)
|
tagsTextBox = createTextBox<LabelledTextBox>(BeatmapsetsStrings.ShowInfoTags, metadata.Tags)
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach (var item in Children.OfType<LabelledTextBox>())
|
foreach (var item in Children.OfType<LabelledTextBox>())
|
||||||
item.OnCommit += onCommit;
|
item.OnCommit += onCommit;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TTextBox createTextBox<TTextBox>(string label, string initialValue)
|
private TTextBox createTextBox<TTextBox>(LocalisableString label, string initialValue)
|
||||||
where TTextBox : LabelledTextBox, new()
|
where TTextBox : LabelledTextBox, new()
|
||||||
=> new TTextBox
|
=> new TTextBox
|
||||||
{
|
{
|
||||||
|
@ -26,7 +26,6 @@ using osu.Game.Input.Bindings;
|
|||||||
using osu.Game.Localisation;
|
using osu.Game.Localisation;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Overlays.Notifications;
|
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
using osuTK.Input;
|
using osuTK.Input;
|
||||||
@ -120,9 +119,6 @@ namespace osu.Game.Screens.Menu
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private IAPIProvider api { get; set; }
|
private IAPIProvider api { get; set; }
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
|
||||||
private INotificationOverlay notifications { get; set; }
|
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private LoginOverlay loginOverlay { get; set; }
|
private LoginOverlay loginOverlay { get; set; }
|
||||||
|
|
||||||
@ -166,17 +162,7 @@ namespace osu.Game.Screens.Menu
|
|||||||
{
|
{
|
||||||
if (api.State.Value != APIState.Online)
|
if (api.State.Value != APIState.Online)
|
||||||
{
|
{
|
||||||
notifications?.Post(new SimpleNotification
|
loginOverlay?.Show();
|
||||||
{
|
|
||||||
Text = "You gotta be online to multi 'yo!",
|
|
||||||
Icon = FontAwesome.Solid.Globe,
|
|
||||||
Activated = () =>
|
|
||||||
{
|
|
||||||
loginOverlay?.Show();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -187,17 +173,7 @@ namespace osu.Game.Screens.Menu
|
|||||||
{
|
{
|
||||||
if (api.State.Value != APIState.Online)
|
if (api.State.Value != APIState.Online)
|
||||||
{
|
{
|
||||||
notifications?.Post(new SimpleNotification
|
loginOverlay?.Show();
|
||||||
{
|
|
||||||
Text = "You gotta be online to view playlists 'yo!",
|
|
||||||
Icon = FontAwesome.Solid.Globe,
|
|
||||||
Activated = () =>
|
|
||||||
{
|
|
||||||
loginOverlay?.Show();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ using osu.Framework.Bindables;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
@ -34,7 +35,7 @@ namespace osu.Game.Screens.OnlinePlay.Components
|
|||||||
private readonly Circle line;
|
private readonly Circle line;
|
||||||
private readonly OsuSpriteText details;
|
private readonly OsuSpriteText details;
|
||||||
|
|
||||||
public OverlinedHeader(string title)
|
public OverlinedHeader(LocalisableString title)
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
AutoSizeAxes = Axes.Y;
|
AutoSizeAxes = Axes.Y;
|
||||||
|
@ -26,6 +26,7 @@ using osu.Game.Online;
|
|||||||
using osu.Game.Online.Chat;
|
using osu.Game.Online.Chat;
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
using osu.Game.Overlays.BeatmapSet;
|
using osu.Game.Overlays.BeatmapSet;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Screens.Play.HUD;
|
using osu.Game.Screens.Play.HUD;
|
||||||
@ -449,7 +450,7 @@ namespace osu.Game.Screens.OnlinePlay
|
|||||||
Size = new Vector2(30, 30),
|
Size = new Vector2(30, 30),
|
||||||
Alpha = AllowEditing ? 1 : 0,
|
Alpha = AllowEditing ? 1 : 0,
|
||||||
Action = () => RequestEdit?.Invoke(Item),
|
Action = () => RequestEdit?.Invoke(Item),
|
||||||
TooltipText = "Edit"
|
TooltipText = CommonStrings.ButtonsEdit
|
||||||
},
|
},
|
||||||
removeButton = new PlaylistRemoveButton
|
removeButton = new PlaylistRemoveButton
|
||||||
{
|
{
|
||||||
|
29
osu.Game/Screens/OnlinePlay/FreeModSelectScreen.cs
Normal file
29
osu.Game/Screens/OnlinePlay/FreeModSelectScreen.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// 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.Game.Overlays.Mods;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
|
using osuTK.Input;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.OnlinePlay
|
||||||
|
{
|
||||||
|
public class FreeModSelectScreen : ModSelectScreen
|
||||||
|
{
|
||||||
|
protected override bool AllowCustomisation => false;
|
||||||
|
protected override bool ShowTotalMultiplier => false;
|
||||||
|
|
||||||
|
public new Func<Mod, bool> IsValidMod
|
||||||
|
{
|
||||||
|
get => base.IsValidMod;
|
||||||
|
set => base.IsValidMod = m => m.HasImplementation && m.UserPlayable && value.Invoke(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FreeModSelectScreen()
|
||||||
|
{
|
||||||
|
IsValidMod = _ => true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override ModColumn CreateModColumn(ModType modType, Key[] toggleKeys = null) => new ModColumn(modType, true, toggleKeys);
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,7 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osu.Game.Online.Leaderboards;
|
using osu.Game.Online.Leaderboards;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Screens.OnlinePlay.Match.Components
|
namespace osu.Game.Screens.OnlinePlay.Match.Components
|
||||||
@ -30,8 +31,8 @@ namespace osu.Game.Screens.OnlinePlay.Match.Components
|
|||||||
|
|
||||||
protected override IEnumerable<LeaderboardScoreStatistic> GetStatistics(ScoreInfo model) => new[]
|
protected override IEnumerable<LeaderboardScoreStatistic> GetStatistics(ScoreInfo model) => new[]
|
||||||
{
|
{
|
||||||
new LeaderboardScoreStatistic(FontAwesome.Solid.Crosshairs, "Accuracy", model.DisplayAccuracy),
|
new LeaderboardScoreStatistic(FontAwesome.Solid.Crosshairs, RankingsStrings.StatAccuracy, model.DisplayAccuracy),
|
||||||
new LeaderboardScoreStatistic(FontAwesome.Solid.Sync, "Total Attempts", score.TotalAttempts.ToString()),
|
new LeaderboardScoreStatistic(FontAwesome.Solid.Sync, RankingsStrings.StatPlayCount, score.TotalAttempts.ToString()),
|
||||||
new LeaderboardScoreStatistic(FontAwesome.Solid.Check, "Completed Beatmaps", score.CompletedBeatmaps.ToString()),
|
new LeaderboardScoreStatistic(FontAwesome.Solid.Check, "Completed Beatmaps", score.CompletedBeatmaps.ToString()),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ using osu.Game.Beatmaps.Drawables;
|
|||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Screens.OnlinePlay.Lounge.Components;
|
using osu.Game.Screens.OnlinePlay.Lounge.Components;
|
||||||
using osu.Game.Screens.OnlinePlay.Match.Components;
|
using osu.Game.Screens.OnlinePlay.Match.Components;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
@ -49,7 +50,7 @@ namespace osu.Game.Screens.OnlinePlay.Match
|
|||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Y,
|
RelativeSizeAxes = Axes.Y,
|
||||||
Size = new Vector2(100, 1),
|
Size = new Vector2(100, 1),
|
||||||
Text = "Edit",
|
Text = CommonStrings.ButtonsEdit,
|
||||||
Action = () => OnEdit?.Invoke()
|
Action = () => OnEdit?.Invoke()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Game.Online.Multiplayer;
|
using osu.Game.Online.Multiplayer;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Screens.OnlinePlay.Components;
|
using osu.Game.Screens.OnlinePlay.Components;
|
||||||
|
|
||||||
namespace osu.Game.Screens.OnlinePlay.Multiplayer.Participants
|
namespace osu.Game.Screens.OnlinePlay.Multiplayer.Participants
|
||||||
@ -13,7 +14,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Participants
|
|||||||
private MultiplayerClient client { get; set; }
|
private MultiplayerClient client { get; set; }
|
||||||
|
|
||||||
public ParticipantsListHeader()
|
public ParticipantsListHeader()
|
||||||
: base("Participants")
|
: base(RankingsStrings.SpotlightParticipants)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ using osu.Game.Beatmaps.Drawables;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Screens.Play.HUD;
|
using osu.Game.Screens.Play.HUD;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
@ -158,7 +159,7 @@ namespace osu.Game.Screens.Play
|
|||||||
{
|
{
|
||||||
new Drawable[]
|
new Drawable[]
|
||||||
{
|
{
|
||||||
new MetadataLineLabel("Source"),
|
new MetadataLineLabel(BeatmapsetsStrings.ShowInfoSource),
|
||||||
new MetadataLineInfo(metadata.Source)
|
new MetadataLineInfo(metadata.Source)
|
||||||
},
|
},
|
||||||
new Drawable[]
|
new Drawable[]
|
||||||
@ -213,7 +214,7 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
private class MetadataLineLabel : OsuSpriteText
|
private class MetadataLineLabel : OsuSpriteText
|
||||||
{
|
{
|
||||||
public MetadataLineLabel(string text)
|
public MetadataLineLabel(LocalisableString text)
|
||||||
{
|
{
|
||||||
Anchor = Anchor.TopRight;
|
Anchor = Anchor.TopRight;
|
||||||
Origin = Anchor.TopRight;
|
Origin = Anchor.TopRight;
|
||||||
|
@ -5,6 +5,7 @@ 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.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
@ -42,7 +43,7 @@ namespace osu.Game.Screens.Play.Break
|
|||||||
Direction = FillDirection.Vertical,
|
Direction = FillDirection.Vertical,
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
AccuracyDisplay = new PercentageBreakInfoLine("Accuracy"),
|
AccuracyDisplay = new PercentageBreakInfoLine(BeatmapsetsStrings.ShowStatsAccuracy),
|
||||||
|
|
||||||
// See https://github.com/ppy/osu/discussions/15185
|
// See https://github.com/ppy/osu/discussions/15185
|
||||||
// RankDisplay = new BreakInfoLine<int>("Rank"),
|
// RankDisplay = new BreakInfoLine<int>("Rank"),
|
||||||
|
@ -26,7 +26,7 @@ namespace osu.Game.Screens.Play.Break
|
|||||||
|
|
||||||
private readonly string prefix;
|
private readonly string prefix;
|
||||||
|
|
||||||
public BreakInfoLine(string name, string prefix = @"")
|
public BreakInfoLine(LocalisableString name, string prefix = @"")
|
||||||
{
|
{
|
||||||
this.prefix = prefix;
|
this.prefix = prefix;
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ namespace osu.Game.Screens.Play.Break
|
|||||||
|
|
||||||
public class PercentageBreakInfoLine : BreakInfoLine<double>
|
public class PercentageBreakInfoLine : BreakInfoLine<double>
|
||||||
{
|
{
|
||||||
public PercentageBreakInfoLine(string name, string prefix = "")
|
public PercentageBreakInfoLine(LocalisableString name, string prefix = "")
|
||||||
: base(name, prefix)
|
: base(name, prefix)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ using osu.Game.Beatmaps;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Rulesets.Difficulty;
|
using osu.Game.Rulesets.Difficulty;
|
||||||
using osu.Game.Rulesets.Judgements;
|
using osu.Game.Rulesets.Judgements;
|
||||||
@ -200,7 +201,7 @@ namespace osu.Game.Screens.Play.HUD
|
|||||||
{
|
{
|
||||||
Anchor = Anchor.BottomLeft,
|
Anchor = Anchor.BottomLeft,
|
||||||
Origin = Anchor.BottomLeft,
|
Origin = Anchor.BottomLeft,
|
||||||
Text = @"pp",
|
Text = BeatmapsetsStrings.ShowScoreboardHeaderspp,
|
||||||
Font = OsuFont.Numeric.With(size: 8),
|
Font = OsuFont.Numeric.With(size: 8),
|
||||||
Padding = new MarginPadding { Bottom = 1.5f }, // align baseline better
|
Padding = new MarginPadding { Bottom = 1.5f }, // align baseline better
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
|
using osu.Game.Localisation;
|
||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Play.PlayerSettings
|
namespace osu.Game.Screens.Play.PlayerSettings
|
||||||
@ -20,7 +21,7 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
|||||||
{
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
beatmapHitsoundsToggle = new PlayerCheckbox { LabelText = "Beatmap hitsounds" },
|
beatmapHitsoundsToggle = new PlayerCheckbox { LabelText = SkinSettingsStrings.BeatmapHitsounds },
|
||||||
new BeatmapOffsetControl
|
new BeatmapOffsetControl
|
||||||
{
|
{
|
||||||
ReferenceScore = { BindTarget = ReferenceScore },
|
ReferenceScore = { BindTarget = ReferenceScore },
|
||||||
|
@ -5,6 +5,7 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Localisation;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Play.PlayerSettings
|
namespace osu.Game.Screens.Play.PlayerSettings
|
||||||
{
|
{
|
||||||
@ -23,7 +24,7 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
|||||||
{
|
{
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = "Background dim:"
|
Text = GameplaySettingsStrings.BackgroundDim
|
||||||
},
|
},
|
||||||
dimSliderBar = new PlayerSliderBar<double>
|
dimSliderBar = new PlayerSliderBar<double>
|
||||||
{
|
{
|
||||||
@ -31,7 +32,7 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
|||||||
},
|
},
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = "Background blur:"
|
Text = GameplaySettingsStrings.BackgroundBlur
|
||||||
},
|
},
|
||||||
blurSliderBar = new PlayerSliderBar<double>
|
blurSliderBar = new PlayerSliderBar<double>
|
||||||
{
|
{
|
||||||
@ -41,9 +42,9 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
|||||||
{
|
{
|
||||||
Text = "Toggles:"
|
Text = "Toggles:"
|
||||||
},
|
},
|
||||||
showStoryboardToggle = new PlayerCheckbox { LabelText = "Storyboard / Video" },
|
showStoryboardToggle = new PlayerCheckbox { LabelText = GraphicsSettingsStrings.StoryboardVideo },
|
||||||
beatmapSkinsToggle = new PlayerCheckbox { LabelText = "Beatmap skins" },
|
beatmapSkinsToggle = new PlayerCheckbox { LabelText = SkinSettingsStrings.BeatmapSkins },
|
||||||
beatmapColorsToggle = new PlayerCheckbox { LabelText = "Beatmap colours" },
|
beatmapColorsToggle = new PlayerCheckbox { LabelText = SkinSettingsStrings.BeatmapColours },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,9 +9,11 @@ using osu.Framework.Graphics.Colour;
|
|||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Effects;
|
using osu.Framework.Graphics.Effects;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Online.Leaderboards;
|
using osu.Game.Online.Leaderboards;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
using osu.Game.Screens.Play.HUD;
|
using osu.Game.Screens.Play.HUD;
|
||||||
@ -127,8 +129,8 @@ namespace osu.Game.Screens.Ranking.Contracted
|
|||||||
Spacing = new Vector2(0, 5),
|
Spacing = new Vector2(0, 5),
|
||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
createStatistic("Max Combo", $"x{score.MaxCombo}"),
|
createStatistic(BeatmapsetsStrings.ShowScoreboardHeadersCombo, $"x{score.MaxCombo}"),
|
||||||
createStatistic("Accuracy", $"{score.Accuracy.FormatAccuracy()}"),
|
createStatistic(BeatmapsetsStrings.ShowScoreboardHeadersAccuracy, $"{score.Accuracy.FormatAccuracy()}"),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new ModFlowDisplay
|
new ModFlowDisplay
|
||||||
@ -200,7 +202,7 @@ namespace osu.Game.Screens.Ranking.Contracted
|
|||||||
private Drawable createStatistic(HitResultDisplayStatistic result)
|
private Drawable createStatistic(HitResultDisplayStatistic result)
|
||||||
=> createStatistic(result.DisplayName, result.MaxCount == null ? $"{result.Count}" : $"{result.Count}/{result.MaxCount}");
|
=> createStatistic(result.DisplayName, result.MaxCount == null ? $"{result.Count}" : $"{result.Count}/{result.MaxCount}");
|
||||||
|
|
||||||
private Drawable createStatistic(string key, string value) => new Container
|
private Drawable createStatistic(LocalisableString key, string value) => new Container
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
|
@ -6,6 +6,7 @@ using osu.Framework.Localisation;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Screens.Ranking.Expanded.Accuracy;
|
using osu.Game.Screens.Ranking.Expanded.Accuracy;
|
||||||
using osu.Game.Utils;
|
using osu.Game.Utils;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
@ -26,7 +27,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Statistics
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="accuracy">The accuracy to display.</param>
|
/// <param name="accuracy">The accuracy to display.</param>
|
||||||
public AccuracyStatistic(double accuracy)
|
public AccuracyStatistic(double accuracy)
|
||||||
: base("accuracy")
|
: base(BeatmapsetsStrings.ShowScoreboardHeadersAccuracy)
|
||||||
{
|
{
|
||||||
this.accuracy = accuracy;
|
this.accuracy = accuracy;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ using osu.Framework.Graphics.Colour;
|
|||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Screens.Ranking.Expanded.Accuracy;
|
using osu.Game.Screens.Ranking.Expanded.Accuracy;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
@ -27,7 +28,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Statistics
|
|||||||
/// <param name="combo">The combo to be displayed.</param>
|
/// <param name="combo">The combo to be displayed.</param>
|
||||||
/// <param name="maxCombo">The maximum value of <paramref name="combo"/>.</param>
|
/// <param name="maxCombo">The maximum value of <paramref name="combo"/>.</param>
|
||||||
public ComboStatistic(int combo, int? maxCombo)
|
public ComboStatistic(int combo, int? maxCombo)
|
||||||
: base("combo", combo, maxCombo)
|
: base(BeatmapsetsStrings.ShowScoreboardHeadersCombo, combo, maxCombo)
|
||||||
{
|
{
|
||||||
isPerfect = combo == maxCombo;
|
isPerfect = combo == maxCombo;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
@ -26,7 +27,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Statistics
|
|||||||
/// <param name="header">The name of the statistic.</param>
|
/// <param name="header">The name of the statistic.</param>
|
||||||
/// <param name="count">The value to display.</param>
|
/// <param name="count">The value to display.</param>
|
||||||
/// <param name="maxCount">The maximum value of <paramref name="count"/>. Not displayed if null.</param>
|
/// <param name="maxCount">The maximum value of <paramref name="count"/>. Not displayed if null.</param>
|
||||||
public CounterStatistic(string header, int count, int? maxCount = null)
|
public CounterStatistic(LocalisableString header, int count, int? maxCount = null)
|
||||||
: base(header)
|
: base(header)
|
||||||
{
|
{
|
||||||
this.count = count;
|
this.count = count;
|
||||||
|
@ -8,6 +8,7 @@ using osu.Framework.Bindables;
|
|||||||
using osu.Framework.Extensions;
|
using osu.Framework.Extensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking.Expanded.Statistics
|
namespace osu.Game.Screens.Ranking.Expanded.Statistics
|
||||||
@ -23,7 +24,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Statistics
|
|||||||
private RollingCounter<int> counter;
|
private RollingCounter<int> counter;
|
||||||
|
|
||||||
public PerformanceStatistic(ScoreInfo score)
|
public PerformanceStatistic(ScoreInfo score)
|
||||||
: base("PP")
|
: base(BeatmapsetsStrings.ShowScoreboardHeaderspp)
|
||||||
{
|
{
|
||||||
this.score = score;
|
this.score = score;
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,12 @@
|
|||||||
|
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
|
using osu.Framework.Extensions.LocalisationExtensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
|
||||||
@ -19,14 +21,14 @@ namespace osu.Game.Screens.Ranking.Expanded.Statistics
|
|||||||
{
|
{
|
||||||
protected SpriteText HeaderText { get; private set; }
|
protected SpriteText HeaderText { get; private set; }
|
||||||
|
|
||||||
private readonly string header;
|
private readonly LocalisableString header;
|
||||||
private Drawable content;
|
private Drawable content;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new <see cref="StatisticDisplay"/>.
|
/// Creates a new <see cref="StatisticDisplay"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="header">The name of the statistic.</param>
|
/// <param name="header">The name of the statistic.</param>
|
||||||
protected StatisticDisplay(string header)
|
protected StatisticDisplay(LocalisableString header)
|
||||||
{
|
{
|
||||||
this.header = header;
|
this.header = header;
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
@ -60,7 +62,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Statistics
|
|||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Font = OsuFont.Torus.With(size: 12, weight: FontWeight.SemiBold),
|
Font = OsuFont.Torus.With(size: 12, weight: FontWeight.SemiBold),
|
||||||
Text = header.ToUpperInvariant(),
|
Text = header.ToUpper(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -16,6 +16,7 @@ using osu.Game.Online;
|
|||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.API.Requests;
|
using osu.Game.Online.API.Requests;
|
||||||
using osu.Game.Overlays.BeatmapSet;
|
using osu.Game.Overlays.BeatmapSet;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Screens.Select.Details;
|
using osu.Game.Screens.Select.Details;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
@ -155,7 +156,7 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = "Points of Failure",
|
Text = BeatmapsetsStrings.ShowInfoPointsOfFailure,
|
||||||
Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 14),
|
Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 14),
|
||||||
},
|
},
|
||||||
failRetryGraph = new FailRetryGraph
|
failRetryGraph = new FailRetryGraph
|
||||||
|
@ -24,6 +24,7 @@ using osu.Game.Graphics.Backgrounds;
|
|||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
@ -136,14 +137,7 @@ namespace osu.Game.Screens.Select.Carousel
|
|||||||
},
|
},
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = "mapped by",
|
Text = BeatmapsetsStrings.ShowDetailsMappedBy(beatmapInfo.Metadata.Author.Username),
|
||||||
Anchor = Anchor.BottomLeft,
|
|
||||||
Origin = Anchor.BottomLeft
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = $"{beatmapInfo.Metadata.Author.Username}",
|
|
||||||
Font = OsuFont.GetFont(italics: true),
|
|
||||||
Anchor = Anchor.BottomLeft,
|
Anchor = Anchor.BottomLeft,
|
||||||
Origin = Anchor.BottomLeft
|
Origin = Anchor.BottomLeft
|
||||||
},
|
},
|
||||||
@ -235,7 +229,7 @@ namespace osu.Game.Screens.Select.Carousel
|
|||||||
items.Add(new OsuMenuItem("Play", MenuItemType.Highlighted, () => startRequested(beatmapInfo)));
|
items.Add(new OsuMenuItem("Play", MenuItemType.Highlighted, () => startRequested(beatmapInfo)));
|
||||||
|
|
||||||
if (editRequested != null)
|
if (editRequested != null)
|
||||||
items.Add(new OsuMenuItem("Edit", MenuItemType.Standard, () => editRequested(beatmapInfo)));
|
items.Add(new OsuMenuItem(CommonStrings.ButtonsEdit, MenuItemType.Standard, () => editRequested(beatmapInfo)));
|
||||||
|
|
||||||
if (beatmapInfo.OnlineID > 0 && beatmapOverlay != null)
|
if (beatmapInfo.OnlineID > 0 && beatmapOverlay != null)
|
||||||
items.Add(new OsuMenuItem("Details...", MenuItemType.Standard, () => beatmapOverlay.FetchAndShowBeatmap(beatmapInfo.OnlineID)));
|
items.Add(new OsuMenuItem("Details...", MenuItemType.Standard, () => beatmapOverlay.FetchAndShowBeatmap(beatmapInfo.OnlineID)));
|
||||||
@ -250,7 +244,7 @@ namespace osu.Game.Screens.Select.Carousel
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hideRequested != null)
|
if (hideRequested != null)
|
||||||
items.Add(new OsuMenuItem("Hide", MenuItemType.Destructive, () => hideRequested(beatmapInfo)));
|
items.Add(new OsuMenuItem(CommonStrings.ButtonsHide, MenuItemType.Destructive, () => hideRequested(beatmapInfo)));
|
||||||
|
|
||||||
return items.ToArray();
|
return items.ToArray();
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ using osu.Framework.Localisation;
|
|||||||
using osu.Framework.Threading;
|
using osu.Framework.Threading;
|
||||||
using osu.Framework.Utils;
|
using osu.Framework.Utils;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select.Details
|
namespace osu.Game.Screens.Select.Details
|
||||||
@ -63,10 +64,10 @@ namespace osu.Game.Screens.Select.Details
|
|||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
FirstValue = new StatisticRow(), // circle size/key amount
|
FirstValue = new StatisticRow(), // circle size/key amount
|
||||||
HpDrain = new StatisticRow { Title = "HP Drain" },
|
HpDrain = new StatisticRow { Title = BeatmapsetsStrings.ShowStatsDrain },
|
||||||
Accuracy = new StatisticRow { Title = "Accuracy" },
|
Accuracy = new StatisticRow { Title = BeatmapsetsStrings.ShowStatsAccuracy },
|
||||||
ApproachRate = new StatisticRow { Title = "Approach Rate" },
|
ApproachRate = new StatisticRow { Title = BeatmapsetsStrings.ShowStatsAr },
|
||||||
starDifficulty = new StatisticRow(10, true) { Title = "Star Difficulty" },
|
starDifficulty = new StatisticRow(10, true) { Title = BeatmapsetsStrings.ShowStatsStars },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -120,12 +121,12 @@ namespace osu.Game.Screens.Select.Details
|
|||||||
case 3:
|
case 3:
|
||||||
// Account for mania differences locally for now
|
// Account for mania differences locally for now
|
||||||
// Eventually this should be handled in a more modular way, allowing rulesets to return arbitrary difficulty attributes
|
// Eventually this should be handled in a more modular way, allowing rulesets to return arbitrary difficulty attributes
|
||||||
FirstValue.Title = "Key Count";
|
FirstValue.Title = BeatmapsetsStrings.ShowStatsCsMania;
|
||||||
FirstValue.Value = (baseDifficulty?.CircleSize ?? 0, null);
|
FirstValue.Value = (baseDifficulty?.CircleSize ?? 0, null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
FirstValue.Title = "Circle Size";
|
FirstValue.Title = BeatmapsetsStrings.ShowStatsCs;
|
||||||
FirstValue.Value = (baseDifficulty?.CircleSize ?? 0, adjustedDifficulty?.CircleSize);
|
FirstValue.Value = (baseDifficulty?.CircleSize ?? 0, adjustedDifficulty?.CircleSize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2,36 +2,38 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select.Filter
|
namespace osu.Game.Screens.Select.Filter
|
||||||
{
|
{
|
||||||
public enum SortMode
|
public enum SortMode
|
||||||
{
|
{
|
||||||
[Description("Artist")]
|
[LocalisableDescription(typeof(BeatmapsStrings), nameof(BeatmapsStrings.ListingSearchSortingArtist))]
|
||||||
Artist,
|
Artist,
|
||||||
|
|
||||||
[Description("Author")]
|
[Description("Author")]
|
||||||
Author,
|
Author,
|
||||||
|
|
||||||
[Description("BPM")]
|
[LocalisableDescription(typeof(BeatmapsetsStrings), nameof(BeatmapsetsStrings.ShowStatsBpm))]
|
||||||
BPM,
|
BPM,
|
||||||
|
|
||||||
[Description("Date Added")]
|
[Description("Date Added")]
|
||||||
DateAdded,
|
DateAdded,
|
||||||
|
|
||||||
[Description("Difficulty")]
|
[LocalisableDescription(typeof(BeatmapsStrings), nameof(BeatmapsStrings.ListingSearchSortingDifficulty))]
|
||||||
Difficulty,
|
Difficulty,
|
||||||
|
|
||||||
[Description("Length")]
|
[LocalisableDescription(typeof(SortStrings), nameof(SortStrings.ArtistTracksLength))]
|
||||||
Length,
|
Length,
|
||||||
|
|
||||||
[Description("Rank Achieved")]
|
[LocalisableDescription(typeof(BeatmapsStrings), nameof(BeatmapsStrings.ListingSearchFiltersRank))]
|
||||||
RankAchieved,
|
RankAchieved,
|
||||||
|
|
||||||
[Description("Source")]
|
[LocalisableDescription(typeof(BeatmapsetsStrings), nameof(BeatmapsetsStrings.ShowInfoSource))]
|
||||||
Source,
|
Source,
|
||||||
|
|
||||||
[Description("Title")]
|
[LocalisableDescription(typeof(BeatmapsStrings), nameof(BeatmapsStrings.ListingSearchSortingTitle))]
|
||||||
Title,
|
Title,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ using osu.Game.Graphics;
|
|||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Screens.Select.Filter;
|
using osu.Game.Screens.Select.Filter;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
@ -139,7 +140,7 @@ namespace osu.Game.Screens.Select
|
|||||||
},
|
},
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = "Sort by",
|
Text = SortStrings.Default,
|
||||||
Font = OsuFont.GetFont(size: 14),
|
Font = OsuFont.GetFont(size: 14),
|
||||||
Margin = new MarginPadding(5),
|
Margin = new MarginPadding(5),
|
||||||
Anchor = Anchor.BottomRight,
|
Anchor = Anchor.BottomRight,
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user