diff --git a/osu.Android.props b/osu.Android.props
index 2e388b8626..9067ae1cd9 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -51,8 +51,8 @@
-
-
+
+
diff --git a/osu.Game.Tests/Visual/Online/TestSceneWikiMarkdownContainer.cs b/osu.Game.Tests/Visual/Online/TestSceneWikiMarkdownContainer.cs
index b6dce2c398..af2e4fc91a 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneWikiMarkdownContainer.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneWikiMarkdownContainer.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using System.Linq;
using Markdig.Syntax.Inlines;
using NUnit.Framework;
using osu.Framework.Allocation;
@@ -9,6 +10,9 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Containers.Markdown;
using osu.Framework.Graphics.Shapes;
+using osu.Framework.Graphics.Sprites;
+using osu.Framework.Testing;
+using osu.Framework.Utils;
using osu.Game.Graphics.Containers.Markdown;
using osu.Game.Overlays;
using osu.Game.Overlays.Wiki.Markdown;
@@ -102,7 +106,7 @@ needs_cleanup: true
{
AddStep("Add absolute image", () =>
{
- markdownContainer.DocumentUrl = "https://dev.ppy.sh";
+ markdownContainer.CurrentPath = "https://dev.ppy.sh";
markdownContainer.Text = "![intro](/wiki/Interface/img/intro-screen.jpg)";
});
}
@@ -112,8 +116,7 @@ needs_cleanup: true
{
AddStep("Add relative image", () =>
{
- markdownContainer.DocumentUrl = "https://dev.ppy.sh";
- markdownContainer.CurrentPath = $"{API.WebsiteRootUrl}/wiki/Interface/";
+ markdownContainer.CurrentPath = "https://dev.ppy.sh/wiki/Interface/";
markdownContainer.Text = "![intro](img/intro-screen.jpg)";
});
}
@@ -123,8 +126,7 @@ needs_cleanup: true
{
AddStep("Add paragraph with block image", () =>
{
- markdownContainer.DocumentUrl = "https://dev.ppy.sh";
- markdownContainer.CurrentPath = $"{API.WebsiteRootUrl}/wiki/Interface/";
+ markdownContainer.CurrentPath = "https://dev.ppy.sh/wiki/Interface/";
markdownContainer.Text = @"Line before image
![play menu](img/play-menu.jpg ""Main Menu in osu!"")
@@ -138,7 +140,7 @@ Line after image";
{
AddStep("Add inline image", () =>
{
- markdownContainer.DocumentUrl = "https://dev.ppy.sh";
+ markdownContainer.CurrentPath = "https://dev.ppy.sh";
markdownContainer.Text = "![osu! mode icon](/wiki/shared/mode/osu.png) osu!";
});
}
@@ -148,7 +150,7 @@ Line after image";
{
AddStep("Add Table", () =>
{
- markdownContainer.DocumentUrl = "https://dev.ppy.sh";
+ markdownContainer.CurrentPath = "https://dev.ppy.sh";
markdownContainer.Text = @"
| Image | Name | Effect |
| :-: | :-: | :-- |
@@ -162,15 +164,33 @@ Line after image";
});
}
+ [Test]
+ public void TestWideImageNotExceedContainer()
+ {
+ AddStep("Add image", () =>
+ {
+ markdownContainer.CurrentPath = "https://dev.ppy.sh/wiki/osu!_Program_Files/";
+ markdownContainer.Text = "![](img/file_structure.jpg \"The file structure of osu!'s installation folder, on Windows and macOS\")";
+ });
+
+ AddUntilStep("Wait image to load", () => markdownContainer.ChildrenOfType().First().DelayedLoadCompleted);
+
+ AddStep("Change container width", () =>
+ {
+ markdownContainer.Width = 0.5f;
+ });
+
+ AddAssert("Image not exceed container width", () =>
+ {
+ var spriteImage = markdownContainer.ChildrenOfType().First();
+ return Precision.DefinitelyBigger(markdownContainer.DrawWidth, spriteImage.DrawWidth);
+ });
+ }
+
private class TestMarkdownContainer : WikiMarkdownContainer
{
public LinkInline Link;
- public new string DocumentUrl
- {
- set => base.DocumentUrl = value;
- }
-
public override MarkdownTextFlowContainer CreateTextFlow() => new TestMarkdownTextFlowContainer
{
UrlAdded = link => Link = link,
diff --git a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
index ae16169123..f85f9327fa 100644
--- a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
+++ b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs
@@ -15,6 +15,7 @@ using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Events;
using osu.Framework.Localisation;
+using osu.Framework.Utils;
namespace osu.Game.Graphics.UserInterface
{
@@ -99,7 +100,7 @@ namespace osu.Game.Graphics.UserInterface
[BackgroundDependencyLoader]
private void load(AudioManager audio, OsuColour colours)
{
- sample = audio.Samples.Get(@"UI/sliderbar-notch");
+ sample = audio.Samples.Get(@"UI/notch-tick");
AccentColour = colours.Pink;
}
@@ -149,7 +150,7 @@ namespace osu.Game.Graphics.UserInterface
private void playSample(T value)
{
- if (Clock == null || Clock.CurrentTime - lastSampleTime <= 50)
+ if (Clock == null || Clock.CurrentTime - lastSampleTime <= 30)
return;
if (value.Equals(lastSampleValue))
@@ -158,13 +159,15 @@ namespace osu.Game.Graphics.UserInterface
lastSampleValue = value;
lastSampleTime = Clock.CurrentTime;
- var channel = sample.Play();
+ var channel = sample.GetChannel();
- channel.Frequency.Value = 1 + NormalizedValue * 0.2f;
- if (NormalizedValue == 0)
- channel.Frequency.Value -= 0.4f;
- else if (NormalizedValue == 1)
- channel.Frequency.Value += 0.4f;
+ channel.Frequency.Value = 0.99f + RNG.NextDouble(0.02f) + NormalizedValue * 0.2f;
+
+ // intentionally pitched down, even when hitting max.
+ if (NormalizedValue == 0 || NormalizedValue == 1)
+ channel.Frequency.Value -= 0.5f;
+
+ channel.Play();
}
private void updateTooltipText(T value)
diff --git a/osu.Game/Online/Chat/MessageFormatter.cs b/osu.Game/Online/Chat/MessageFormatter.cs
index faee08742b..ae9199c428 100644
--- a/osu.Game/Online/Chat/MessageFormatter.cs
+++ b/osu.Game/Online/Chat/MessageFormatter.cs
@@ -320,6 +320,7 @@ namespace osu.Game.Online.Chat
JoinMultiplayerMatch,
Spectate,
OpenUserProfile,
+ SearchBeatmapSet,
OpenWiki,
Custom,
}
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index dcd2d68b43..c25b520892 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -305,6 +305,10 @@ namespace osu.Game
ShowChannel(link.Argument);
break;
+ case LinkAction.SearchBeatmapSet:
+ SearchBeatmapSet(link.Argument);
+ break;
+
case LinkAction.OpenEditorTimestamp:
case LinkAction.JoinMultiplayerMatch:
case LinkAction.Spectate:
@@ -375,6 +379,12 @@ namespace osu.Game
/// The beatmap to show.
public void ShowBeatmap(int beatmapId) => waitForReady(() => beatmapSetOverlay, _ => beatmapSetOverlay.FetchAndShowBeatmap(beatmapId));
+ ///
+ /// Shows the beatmap listing overlay, with the given in the search box.
+ ///
+ /// The query to search for.
+ public void SearchBeatmapSet(string query) => waitForReady(() => beatmapListing, _ => beatmapListing.ShowWithSearch(query));
+
///
/// Show a wiki's page as an overlay
///
diff --git a/osu.Game/Overlays/BeatmapListing/BeatmapListingFilterControl.cs b/osu.Game/Overlays/BeatmapListing/BeatmapListingFilterControl.cs
index d80ef075e9..650d105911 100644
--- a/osu.Game/Overlays/BeatmapListing/BeatmapListingFilterControl.cs
+++ b/osu.Game/Overlays/BeatmapListing/BeatmapListingFilterControl.cs
@@ -122,6 +122,9 @@ namespace osu.Game.Overlays.BeatmapListing
sortControlBackground.Colour = colourProvider.Background5;
}
+ public void Search(string query)
+ => searchControl.Query.Value = query;
+
protected override void LoadComplete()
{
base.LoadComplete();
diff --git a/osu.Game/Overlays/BeatmapListingOverlay.cs b/osu.Game/Overlays/BeatmapListingOverlay.cs
index 460b4ba4c9..6861d17f26 100644
--- a/osu.Game/Overlays/BeatmapListingOverlay.cs
+++ b/osu.Game/Overlays/BeatmapListingOverlay.cs
@@ -89,6 +89,12 @@ namespace osu.Game.Overlays
};
}
+ public void ShowWithSearch(string query)
+ {
+ filterControl.Search(query);
+ Show();
+ }
+
protected override BeatmapListingHeader CreateHeader() => new BeatmapListingHeader();
protected override Color4 BackgroundColour => ColourProvider.Background6;
diff --git a/osu.Game/Overlays/BeatmapSet/Info.cs b/osu.Game/Overlays/BeatmapSet/Info.cs
index dbe01ad27f..f9b8de9dba 100644
--- a/osu.Game/Overlays/BeatmapSet/Info.cs
+++ b/osu.Game/Overlays/BeatmapSet/Info.cs
@@ -8,15 +8,12 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
-using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
-using osuTK;
namespace osu.Game.Overlays.BeatmapSet
{
public class Info : Container
{
- private const float transition_duration = 250;
private const float metadata_width = 175;
private const float spacing = 20;
private const float base_height = 220;
@@ -60,7 +57,7 @@ namespace osu.Game.Overlays.BeatmapSet
Child = new Container
{
RelativeSizeAxes = Axes.Both,
- Child = new MetadataSection("Description"),
+ Child = new MetadataSection(MetadataType.Description),
},
},
new Container
@@ -78,10 +75,10 @@ namespace osu.Game.Overlays.BeatmapSet
Direction = FillDirection.Full,
Children = new[]
{
- source = new MetadataSection("Source"),
- genre = new MetadataSection("Genre") { Width = 0.5f },
- language = new MetadataSection("Language") { Width = 0.5f },
- tags = new MetadataSection("Tags"),
+ source = new MetadataSection(MetadataType.Source),
+ genre = new MetadataSection(MetadataType.Genre) { Width = 0.5f },
+ language = new MetadataSection(MetadataType.Language) { Width = 0.5f },
+ tags = new MetadataSection(MetadataType.Tags),
},
},
},
@@ -135,48 +132,5 @@ namespace osu.Game.Overlays.BeatmapSet
successRateBackground.Colour = colourProvider.Background4;
background.Colour = colourProvider.Background5;
}
-
- private class MetadataSection : FillFlowContainer
- {
- private readonly TextFlowContainer textFlow;
-
- public string Text
- {
- set
- {
- if (string.IsNullOrEmpty(value))
- {
- Hide();
- return;
- }
-
- this.FadeIn(transition_duration);
- textFlow.Clear();
- textFlow.AddText(value, s => s.Font = s.Font.With(size: 12));
- }
- }
-
- public MetadataSection(string title)
- {
- RelativeSizeAxes = Axes.X;
- AutoSizeAxes = Axes.Y;
- Spacing = new Vector2(5f);
-
- InternalChildren = new Drawable[]
- {
- new OsuSpriteText
- {
- Text = title,
- Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold),
- Margin = new MarginPadding { Top = 15 },
- },
- textFlow = new OsuTextFlowContainer
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- },
- };
- }
- }
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/MetadataSection.cs b/osu.Game/Overlays/BeatmapSet/MetadataSection.cs
new file mode 100644
index 0000000000..3648c55714
--- /dev/null
+++ b/osu.Game/Overlays/BeatmapSet/MetadataSection.cs
@@ -0,0 +1,115 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Extensions.Color4Extensions;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics;
+using osu.Game.Graphics.Containers;
+using osu.Game.Graphics.Sprites;
+using osu.Game.Online.Chat;
+using osuTK;
+using osuTK.Graphics;
+
+namespace osu.Game.Overlays.BeatmapSet
+{
+ public class MetadataSection : Container
+ {
+ private readonly FillFlowContainer textContainer;
+ private readonly MetadataType type;
+ private TextFlowContainer textFlow;
+
+ private const float transition_duration = 250;
+
+ public MetadataSection(MetadataType type)
+ {
+ this.type = type;
+
+ Alpha = 0;
+
+ RelativeSizeAxes = Axes.X;
+ AutoSizeAxes = Axes.Y;
+
+ InternalChild = textContainer = new FillFlowContainer
+ {
+ Alpha = 0,
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+
+ Margin = new MarginPadding { Top = 15 },
+ Spacing = new Vector2(5),
+ Children = new Drawable[]
+ {
+ new Container
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Child = new OsuSpriteText
+ {
+ Text = this.type.ToString(),
+ Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 14),
+ },
+ },
+ },
+ };
+ }
+
+ public string Text
+ {
+ set
+ {
+ if (string.IsNullOrEmpty(value))
+ {
+ this.FadeOut(transition_duration);
+ return;
+ }
+
+ this.FadeIn(transition_duration);
+
+ setTextAsync(value);
+ }
+ }
+
+ private void setTextAsync(string text)
+ {
+ LoadComponentAsync(new LinkFlowContainer(s => s.Font = s.Font.With(size: 14))
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Colour = Color4.White.Opacity(0.75f),
+ }, loaded =>
+ {
+ textFlow?.Expire();
+
+ switch (type)
+ {
+ case MetadataType.Tags:
+ string[] tags = text.Split(" ");
+
+ for (int i = 0; i <= tags.Length - 1; i++)
+ {
+ loaded.AddLink(tags[i], LinkAction.SearchBeatmapSet, tags[i]);
+
+ if (i != tags.Length - 1)
+ loaded.AddText(" ");
+ }
+
+ break;
+
+ case MetadataType.Source:
+ loaded.AddLink(text, LinkAction.SearchBeatmapSet, text);
+ break;
+
+ default:
+ loaded.AddText(text);
+ break;
+ }
+
+ textContainer.Add(textFlow = loaded);
+
+ // fade in if we haven't yet.
+ textContainer.FadeIn(transition_duration);
+ });
+ }
+ }
+}
diff --git a/osu.Game/Overlays/BeatmapSet/MetadataType.cs b/osu.Game/Overlays/BeatmapSet/MetadataType.cs
new file mode 100644
index 0000000000..1ab4c6887e
--- /dev/null
+++ b/osu.Game/Overlays/BeatmapSet/MetadataType.cs
@@ -0,0 +1,14 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+namespace osu.Game.Overlays.BeatmapSet
+{
+ public enum MetadataType
+ {
+ Tags,
+ Source,
+ Description,
+ Genre,
+ Language
+ }
+}
diff --git a/osu.Game/Overlays/Volume/VolumeMeter.cs b/osu.Game/Overlays/Volume/VolumeMeter.cs
index a15076581e..532b0f4a81 100644
--- a/osu.Game/Overlays/Volume/VolumeMeter.cs
+++ b/osu.Game/Overlays/Volume/VolumeMeter.cs
@@ -4,6 +4,8 @@
using System;
using System.Globalization;
using osu.Framework.Allocation;
+using osu.Framework.Audio;
+using osu.Framework.Audio.Sample;
using osu.Framework.Bindables;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
@@ -36,6 +38,9 @@ namespace osu.Game.Overlays.Volume
private OsuSpriteText text;
private BufferedContainer maxGlow;
+ private Sample sample;
+ private double sampleLastPlaybackTime;
+
public VolumeMeter(string name, float circleSize, Color4 meterColour)
{
this.circleSize = circleSize;
@@ -46,8 +51,11 @@ namespace osu.Game.Overlays.Volume
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OsuColour colours, AudioManager audio)
{
+ sample = audio.Samples.Get(@"UI/notch-tick");
+ sampleLastPlaybackTime = Time.Current;
+
Color4 backgroundColour = colours.Gray1;
CircularProgress bgProgress;
@@ -178,22 +186,12 @@ namespace osu.Game.Overlays.Volume
}
};
- Bindable.ValueChanged += volume =>
- {
- this.TransformTo("DisplayVolume",
- volume.NewValue,
- 400,
- Easing.OutQuint);
- };
+ Bindable.BindValueChanged(volume => { this.TransformTo(nameof(DisplayVolume), volume.NewValue, 400, Easing.OutQuint); }, true);
bgProgress.Current.Value = 0.75f;
}
- protected override void LoadComplete()
- {
- base.LoadComplete();
- Bindable.TriggerChange();
- }
+ private int displayVolumeInt;
private double displayVolume;
@@ -202,8 +200,16 @@ namespace osu.Game.Overlays.Volume
get => displayVolume;
set
{
+ if (value == displayVolume)
+ return;
+
displayVolume = value;
+ int intValue = (int)Math.Round(displayVolume * 100);
+ bool intVolumeChanged = intValue != displayVolumeInt;
+
+ displayVolumeInt = intValue;
+
if (displayVolume >= 0.995f)
{
text.Text = "MAX";
@@ -212,14 +218,36 @@ namespace osu.Game.Overlays.Volume
else
{
maxGlow.EffectColour = Color4.Transparent;
- text.Text = Math.Round(displayVolume * 100).ToString(CultureInfo.CurrentCulture);
+ text.Text = displayVolumeInt.ToString(CultureInfo.CurrentCulture);
}
volumeCircle.Current.Value = displayVolume * 0.75f;
volumeCircleGlow.Current.Value = displayVolume * 0.75f;
+
+ if (intVolumeChanged && IsLoaded)
+ Scheduler.AddOnce(playTickSound);
}
}
+ private void playTickSound()
+ {
+ const int tick_debounce_time = 30;
+
+ if (Time.Current - sampleLastPlaybackTime <= tick_debounce_time)
+ return;
+
+ var channel = sample.GetChannel();
+
+ channel.Frequency.Value = 0.99f + RNG.NextDouble(0.02f) + displayVolume * 0.1f;
+
+ // intentionally pitched down, even when hitting max.
+ if (displayVolumeInt == 0 || displayVolumeInt == 100)
+ channel.Frequency.Value -= 0.5f;
+
+ channel.Play();
+ sampleLastPlaybackTime = Time.Current;
+ }
+
public double Volume
{
get => Bindable.Value;
diff --git a/osu.Game/Overlays/Wiki/Markdown/WikiMarkdownImageBlock.cs b/osu.Game/Overlays/Wiki/Markdown/WikiMarkdownImageBlock.cs
index 179762103a..1a4f6087c7 100644
--- a/osu.Game/Overlays/Wiki/Markdown/WikiMarkdownImageBlock.cs
+++ b/osu.Game/Overlays/Wiki/Markdown/WikiMarkdownImageBlock.cs
@@ -6,6 +6,7 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Containers.Markdown;
+using osu.Framework.Graphics.Sprites;
using osuTK;
namespace osu.Game.Overlays.Wiki.Markdown
@@ -32,11 +33,7 @@ namespace osu.Game.Overlays.Wiki.Markdown
{
Children = new Drawable[]
{
- new WikiMarkdownImage(linkInline)
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- },
+ new BlockMarkdownImage(linkInline),
parentTextComponent.CreateSpriteText().With(t =>
{
t.Text = linkInline.Title;
@@ -45,5 +42,50 @@ namespace osu.Game.Overlays.Wiki.Markdown
}),
};
}
+
+ private class BlockMarkdownImage : WikiMarkdownImage
+ {
+ public BlockMarkdownImage(LinkInline linkInline)
+ : base(linkInline)
+ {
+ AutoSizeAxes = Axes.Y;
+ RelativeSizeAxes = Axes.X;
+ }
+
+ protected override ImageContainer CreateImageContainer(string url) => new BlockImageContainer(url);
+
+ private class BlockImageContainer : ImageContainer
+ {
+ public BlockImageContainer(string url)
+ : base(url)
+ {
+ AutoSizeAxes = Axes.Y;
+ RelativeSizeAxes = Axes.X;
+ }
+
+ protected override Sprite CreateImageSprite() => new ImageSprite();
+
+ private class ImageSprite : Sprite
+ {
+ public ImageSprite()
+ {
+ Anchor = Anchor.TopCentre;
+ Origin = Anchor.TopCentre;
+ }
+
+ protected override void Update()
+ {
+ base.Update();
+
+ if (Width > Parent.DrawWidth)
+ {
+ float ratio = Height / Width;
+ Width = Parent.DrawWidth;
+ Height = ratio * Width;
+ }
+ }
+ }
+ }
+ }
}
}
diff --git a/osu.Game/Screens/Menu/Disclaimer.cs b/osu.Game/Screens/Menu/Disclaimer.cs
index 72eb9c7c0c..b0a2fad813 100644
--- a/osu.Game/Screens/Menu/Disclaimer.cs
+++ b/osu.Game/Screens/Menu/Disclaimer.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System.Collections.Generic;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
@@ -36,6 +37,8 @@ namespace osu.Game.Screens.Menu
private readonly Bindable currentUser = new Bindable();
private FillFlowContainer fill;
+ private readonly List expendableText = new List();
+
public Disclaimer(OsuScreen nextScreen = null)
{
this.nextScreen = nextScreen;
@@ -54,7 +57,7 @@ namespace osu.Game.Screens.Menu
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Icon = FontAwesome.Solid.Flask,
+ Icon = OsuIcon.Logo,
Size = new Vector2(icon_size),
Y = icon_y,
},
@@ -70,37 +73,55 @@ namespace osu.Game.Screens.Menu
{
textFlow = new LinkFlowContainer
{
- RelativeSizeAxes = Axes.X,
+ Width = 680,
AutoSizeAxes = Axes.Y,
TextAnchor = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
Spacing = new Vector2(0, 2),
- LayoutDuration = 2000,
- LayoutEasing = Easing.OutQuint
- },
- supportFlow = new LinkFlowContainer
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- TextAnchor = Anchor.TopCentre,
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Alpha = 0,
- Spacing = new Vector2(0, 2),
},
}
- }
+ },
+ supportFlow = new LinkFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ TextAnchor = Anchor.BottomCentre,
+ Anchor = Anchor.BottomCentre,
+ Origin = Anchor.BottomCentre,
+ Padding = new MarginPadding(20),
+ Alpha = 0,
+ Spacing = new Vector2(0, 2),
+ },
};
- textFlow.AddText("This project is an ongoing ", t => t.Font = t.Font.With(Typeface.Torus, 30, FontWeight.Light));
- textFlow.AddText("work in progress", t => t.Font = t.Font.With(Typeface.Torus, 30, FontWeight.SemiBold));
+ textFlow.AddText("this is osu!", t => t.Font = t.Font.With(Typeface.Torus, 30, FontWeight.Regular));
+
+ expendableText.AddRange(textFlow.AddText("lazer", t =>
+ {
+ t.Font = t.Font.With(Typeface.Torus, 30, FontWeight.Regular);
+ t.Colour = colours.PinkLight;
+ }));
+
+ static void formatRegular(SpriteText t) => t.Font = OsuFont.GetFont(size: 20, weight: FontWeight.Regular);
+ static void formatSemiBold(SpriteText t) => t.Font = OsuFont.GetFont(size: 20, weight: FontWeight.SemiBold);
textFlow.NewParagraph();
- static void format(SpriteText t) => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);
+ textFlow.AddText("the next ", formatRegular);
+ textFlow.AddText("major update", t =>
+ {
+ t.Font = t.Font.With(Typeface.Torus, 20, FontWeight.SemiBold);
+ t.Colour = colours.Pink;
+ });
+ expendableText.AddRange(textFlow.AddText(" coming to osu!", formatRegular));
+ textFlow.AddText(".", formatRegular);
- textFlow.AddParagraph(getRandomTip(), t => t.Font = t.Font.With(Typeface.Torus, 20, FontWeight.SemiBold));
+ textFlow.NewParagraph();
+ textFlow.NewParagraph();
+
+ textFlow.AddParagraph("today's tip:", formatSemiBold);
+ textFlow.AddParagraph(getRandomTip(), formatRegular);
textFlow.NewParagraph();
textFlow.NewParagraph();
@@ -116,19 +137,19 @@ namespace osu.Game.Screens.Menu
if (e.NewValue.IsSupporter)
{
- supportFlow.AddText("Eternal thanks to you for supporting osu!", format);
+ supportFlow.AddText("Eternal thanks to you for supporting osu!", formatSemiBold);
}
else
{
- supportFlow.AddText("Consider becoming an ", format);
- supportFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", creationParameters: format);
- supportFlow.AddText(" to help support the game", format);
+ supportFlow.AddText("Consider becoming an ", formatSemiBold);
+ supportFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", formatSemiBold);
+ supportFlow.AddText(" to help support osu!'s development", formatSemiBold);
}
heart = supportFlow.AddIcon(FontAwesome.Solid.Heart, t =>
{
t.Padding = new MarginPadding { Left = 5, Top = 3 };
- t.Font = t.Font.With(size: 12);
+ t.Font = t.Font.With(size: 20);
t.Origin = Anchor.Centre;
t.Colour = colours.Pink;
}).First();
@@ -169,7 +190,15 @@ namespace osu.Game.Screens.Menu
.MoveToY(icon_y, 160, Easing.InQuart)
.FadeColour(Color4.White, 160);
- fill.Delay(520 + 160).MoveToOffset(new Vector2(0, 15), 160, Easing.OutQuart);
+ using (BeginDelayedSequence(520 + 160))
+ {
+ fill.MoveToOffset(new Vector2(0, 15), 160, Easing.OutQuart);
+ Schedule(() => expendableText.ForEach(t =>
+ {
+ t.FadeOut(100);
+ t.ScaleTo(new Vector2(0, 1), 100, Easing.OutQuart);
+ }));
+ }
}
supportFlow.FadeOut().Delay(2000).FadeIn(500);
diff --git a/osu.Game/Screens/Select/BeatmapDetails.cs b/osu.Game/Screens/Select/BeatmapDetails.cs
index 26da4279f0..973f54c038 100644
--- a/osu.Game/Screens/Select/BeatmapDetails.cs
+++ b/osu.Game/Screens/Select/BeatmapDetails.cs
@@ -1,24 +1,25 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using osuTK;
-using osuTK.Graphics;
+using System.Linq;
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Game.Graphics.Sprites;
-using System.Linq;
-using osu.Game.Online.API;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Extensions.Color4Extensions;
-using osu.Game.Screens.Select.Details;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
+using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
-using osu.Game.Online.API.Requests;
-using osu.Game.Rulesets;
using osu.Game.Online;
+using osu.Game.Online.API;
+using osu.Game.Online.API.Requests;
+using osu.Game.Overlays.BeatmapSet;
+using osu.Game.Rulesets;
+using osu.Game.Screens.Select.Details;
+using osuTK;
+using osuTK.Graphics;
namespace osu.Game.Screens.Select
{
@@ -128,13 +129,11 @@ namespace osu.Game.Screens.Select
AutoSizeAxes = Axes.Y,
LayoutDuration = transition_duration,
LayoutEasing = Easing.OutQuad,
- Spacing = new Vector2(spacing * 2),
- Margin = new MarginPadding { Top = spacing * 2 },
Children = new[]
{
- description = new MetadataSection("Description"),
- source = new MetadataSection("Source"),
- tags = new MetadataSection("Tags"),
+ description = new MetadataSection(MetadataType.Description),
+ source = new MetadataSection(MetadataType.Source),
+ tags = new MetadataSection(MetadataType.Tags),
},
},
},
@@ -290,73 +289,5 @@ namespace osu.Game.Screens.Select
};
}
}
-
- private class MetadataSection : Container
- {
- private readonly FillFlowContainer textContainer;
- private TextFlowContainer textFlow;
-
- public MetadataSection(string title)
- {
- Alpha = 0;
- RelativeSizeAxes = Axes.X;
- AutoSizeAxes = Axes.Y;
-
- InternalChild = textContainer = new FillFlowContainer
- {
- Alpha = 0,
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Spacing = new Vector2(spacing / 2),
- Children = new Drawable[]
- {
- new Container
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Child = new OsuSpriteText
- {
- Text = title,
- Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 14),
- },
- },
- },
- };
- }
-
- public string Text
- {
- set
- {
- if (string.IsNullOrEmpty(value))
- {
- this.FadeOut(transition_duration);
- return;
- }
-
- this.FadeIn(transition_duration);
-
- setTextAsync(value);
- }
- }
-
- private void setTextAsync(string text)
- {
- LoadComponentAsync(new OsuTextFlowContainer(s => s.Font = s.Font.With(size: 14))
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Colour = Color4.White.Opacity(0.75f),
- Text = text
- }, loaded =>
- {
- textFlow?.Expire();
- textContainer.Add(textFlow = loaded);
-
- // fade in if we haven't yet.
- textContainer.FadeIn(transition_duration);
- });
- }
- }
}
}
diff --git a/osu.Game/Skinning/Editor/SkinSelectionHandler.cs b/osu.Game/Skinning/Editor/SkinSelectionHandler.cs
index 7a35c8600d..17eb88226d 100644
--- a/osu.Game/Skinning/Editor/SkinSelectionHandler.cs
+++ b/osu.Game/Skinning/Editor/SkinSelectionHandler.cs
@@ -95,8 +95,8 @@ namespace osu.Game.Skinning.Editor
// scale adjust applied to each individual item should match that of the quad itself.
var scaledDelta = new Vector2(
- adjustedRect.Width / selectionRect.Width,
- adjustedRect.Height / selectionRect.Height
+ MathF.Max(adjustedRect.Width / selectionRect.Width, 0),
+ MathF.Max(adjustedRect.Height / selectionRect.Height, 0)
);
foreach (var b in SelectedBlueprints)
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index c44857a77d..357aa89329 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -36,8 +36,8 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 4772d700da..e339e49187 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,8 +70,8 @@
-
-
+
+
@@ -93,7 +93,7 @@
-
+