diff --git a/osu.Android.props b/osu.Android.props
index 99cda7693d..80b1c5b52f 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,6 +52,6 @@
-
+
diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/SliderBodyPiece.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/SliderBodyPiece.cs
index 1c3d270c95..6e22c35ab3 100644
--- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/SliderBodyPiece.cs
+++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/SliderBodyPiece.cs
@@ -26,6 +26,10 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
{
AccentColour = Color4.Transparent
};
+
+ // SliderSelectionBlueprint relies on calling ReceivePositionalInputAt on this drawable to determine whether selection should occur.
+ // Without AlwaysPresent, a movement in a parent container (ie. the editor composer area resizing) could cause incorrect input handling.
+ AlwaysPresent = true;
}
[BackgroundDependencyLoader]
diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs
index 67c85a1120..a416fd4daf 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs
@@ -108,7 +108,7 @@ namespace osu.Game.Tests.Visual.SongSelect
AddAssert("check version", () => infoWedge.Info.VersionLabel.Current.Value == $"{ruleset.ShortName}Version");
AddAssert("check title", () => infoWedge.Info.TitleLabel.Current.Value == $"{ruleset.ShortName}Source — {ruleset.ShortName}Title");
AddAssert("check artist", () => infoWedge.Info.ArtistLabel.Current.Value == $"{ruleset.ShortName}Artist");
- AddAssert("check author", () => infoWedge.Info.MapperContainer.Children.OfType().Any(s => s.Current.Value == $"{ruleset.ShortName}Author"));
+ AddAssert("check author", () => infoWedge.Info.MapperContainer.ChildrenOfType().Any(s => s.Current.Value == $"{ruleset.ShortName}Author"));
}
private void testInfoLabels(int expectedCount)
@@ -124,7 +124,7 @@ namespace osu.Game.Tests.Visual.SongSelect
AddAssert("check empty version", () => string.IsNullOrEmpty(infoWedge.Info.VersionLabel.Current.Value));
AddAssert("check default title", () => infoWedge.Info.TitleLabel.Current.Value == Beatmap.Default.BeatmapInfo.Metadata.Title);
AddAssert("check default artist", () => infoWedge.Info.ArtistLabel.Current.Value == Beatmap.Default.BeatmapInfo.Metadata.Artist);
- AddAssert("check empty author", () => !infoWedge.Info.MapperContainer.Children.Any());
+ AddAssert("check empty author", () => !infoWedge.Info.MapperContainer.ChildrenOfType().Any());
AddAssert("check no info labels", () => !infoWedge.Info.ChildrenOfType().Any());
}
diff --git a/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs b/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs
index 31c1439c8f..1ffcf9722a 100644
--- a/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs
+++ b/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs
@@ -13,6 +13,8 @@ using osuTK.Graphics;
using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics;
+using osu.Game.Users;
+using osu.Game.Graphics.Containers;
namespace osu.Game.Overlays.BeatmapSet
{
@@ -50,7 +52,7 @@ namespace osu.Game.Overlays.BeatmapSet
fields.Children = new Drawable[]
{
- new Field("mapped by", BeatmapSet.Metadata.Author.Username, OsuFont.GetFont(weight: FontWeight.Regular, italics: true)),
+ new Field("mapped by", BeatmapSet.Metadata.Author, OsuFont.GetFont(weight: FontWeight.Regular, italics: true)),
new Field("submitted", online.Submitted, OsuFont.GetFont(weight: FontWeight.Bold))
{
Margin = new MarginPadding { Top = 5 },
@@ -146,6 +148,25 @@ namespace osu.Game.Overlays.BeatmapSet
}
};
}
+
+ public Field(string first, User second, FontUsage secondFont)
+ {
+ AutoSizeAxes = Axes.Both;
+ Direction = FillDirection.Horizontal;
+
+ Children = new[]
+ {
+ new LinkFlowContainer(s =>
+ {
+ s.Font = OsuFont.GetFont(size: 11);
+ }).With(d =>
+ {
+ d.AutoSizeAxes = Axes.Both;
+ d.AddText($"{first} ");
+ d.AddUserLink(second, s => s.Font = secondFont.With(size: 11));
+ }),
+ };
+ }
}
}
}
diff --git a/osu.Game/Screens/Edit/Editor.cs b/osu.Game/Screens/Edit/Editor.cs
index da0e9ebbaf..434683a016 100644
--- a/osu.Game/Screens/Edit/Editor.cs
+++ b/osu.Game/Screens/Edit/Editor.cs
@@ -17,7 +17,6 @@ using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
using osu.Framework.Logging;
using osu.Framework.Screens;
-using osu.Framework.Timing;
using osu.Game.Beatmaps;
using osu.Game.Configuration;
using osu.Game.Graphics;
@@ -144,8 +143,7 @@ namespace osu.Game.Screens.Edit
// Todo: should probably be done at a DrawableRuleset level to share logic with Player.
clock = new EditorClock(playableBeatmap, beatDivisor) { IsCoupled = false };
-
- UpdateClockSource();
+ clock.ChangeSource(loadableBeatmap.Track);
dependencies.CacheAs(clock);
AddInternal(clock);
@@ -308,11 +306,7 @@ namespace osu.Game.Screens.Edit
///
/// If the beatmap's track has changed, this method must be called to keep the editor in a valid state.
///
- public void UpdateClockSource()
- {
- var sourceClock = (IAdjustableClock)Beatmap.Value.Track ?? new StopwatchClock();
- clock.ChangeSource(sourceClock);
- }
+ public void UpdateClockSource() => clock.ChangeSource(Beatmap.Value.Track);
protected void Save()
{
@@ -583,7 +577,7 @@ namespace osu.Game.Screens.Edit
private void resetTrack(bool seekToStart = false)
{
- Beatmap.Value.Track?.Stop();
+ Beatmap.Value.Track.Stop();
if (seekToStart)
{
diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
index 18615d9192..e1cf0cef4e 100644
--- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -28,6 +28,7 @@ using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.UI;
using osu.Game.Screens.Ranking.Expanded;
+using osu.Game.Graphics.Containers;
namespace osu.Game.Screens.Select
{
@@ -286,7 +287,7 @@ namespace osu.Game.Screens.Select
Margin = new MarginPadding { Top = 10 },
Direction = FillDirection.Horizontal,
AutoSizeAxes = Axes.Both,
- Children = getMapper(metadata)
+ Child = getMapper(metadata),
},
infoLabelContainer = new FillFlowContainer
{
@@ -406,24 +407,20 @@ namespace osu.Game.Screens.Select
});
}
- private OsuSpriteText[] getMapper(BeatmapMetadata metadata)
+ private Drawable getMapper(BeatmapMetadata metadata)
{
- if (string.IsNullOrEmpty(metadata.Author?.Username))
- return Array.Empty();
+ if (metadata.Author == null)
+ return Empty();
- return new[]
+ return new LinkFlowContainer(s =>
{
- new OsuSpriteText
- {
- Text = "mapped by ",
- Font = OsuFont.GetFont(size: 15),
- },
- new OsuSpriteText
- {
- Text = metadata.Author.Username,
- Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 15),
- }
- };
+ s.Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 15);
+ }).With(d =>
+ {
+ d.AutoSizeAxes = Axes.Both;
+ d.AddText("mapped by ");
+ d.AddUserLink(metadata.Author);
+ });
}
protected override void Dispose(bool isDisposing)
diff --git a/osu.Game/Tests/Visual/EditorClockTestScene.cs b/osu.Game/Tests/Visual/EditorClockTestScene.cs
index 79cfee8518..34393fba7d 100644
--- a/osu.Game/Tests/Visual/EditorClockTestScene.cs
+++ b/osu.Game/Tests/Visual/EditorClockTestScene.cs
@@ -4,7 +4,6 @@
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Input.Events;
-using osu.Framework.Timing;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Screens.Edit;
@@ -46,7 +45,7 @@ namespace osu.Game.Tests.Visual
private void beatmapChanged(ValueChangedEvent e)
{
Clock.ControlPointInfo = e.NewValue.Beatmap.ControlPointInfo;
- Clock.ChangeSource((IAdjustableClock)e.NewValue.Track ?? new StopwatchClock());
+ Clock.ChangeSource(e.NewValue.Track);
Clock.ProcessFrame();
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index e448972066..29189781a7 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -29,7 +29,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 43ed2d7dc8..c4eb7aefba 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,7 +70,7 @@
-
+
@@ -93,7 +93,7 @@
-
+