diff --git a/osu.Game.Tests/Visual/TestCaseBeatmapSetOverlay.cs b/osu.Game.Tests/Visual/TestCaseBeatmapSetOverlay.cs
index d9aedb7a5f..6605c61026 100644
--- a/osu.Game.Tests/Visual/TestCaseBeatmapSetOverlay.cs
+++ b/osu.Game.Tests/Visual/TestCaseBeatmapSetOverlay.cs
@@ -52,6 +52,7 @@ namespace osu.Game.Tests.Visual
FavouriteCount = 356,
Submitted = new DateTime(2016, 2, 10),
Ranked = new DateTime(2016, 6, 19),
+ Status = BeatmapSetOnlineStatus.Ranked,
BPM = 236,
HasVideo = true,
Covers = new BeatmapSetOnlineCovers
@@ -222,6 +223,7 @@ namespace osu.Game.Tests.Visual
FavouriteCount = 58,
Submitted = new DateTime(2016, 6, 11),
Ranked = new DateTime(2016, 7, 12),
+ Status = BeatmapSetOnlineStatus.Pending,
BPM = 160,
HasVideo = false,
Covers = new BeatmapSetOnlineCovers
diff --git a/osu.Game/Beatmaps/BeatmapSetOnlineInfo.cs b/osu.Game/Beatmaps/BeatmapSetOnlineInfo.cs
index be3107c7b9..f7221a6ac3 100644
--- a/osu.Game/Beatmaps/BeatmapSetOnlineInfo.cs
+++ b/osu.Game/Beatmaps/BeatmapSetOnlineInfo.cs
@@ -26,6 +26,11 @@ namespace osu.Game.Beatmaps
///
public DateTimeOffset? LastUpdated { get; set; }
+ ///
+ /// The status of this beatmap set.
+ ///
+ public BeatmapSetOnlineStatus Status { get; set; }
+
///
/// Whether or not this beatmap set has a background video.
///
diff --git a/osu.Game/Beatmaps/BeatmapSetOnlineStatus.cs b/osu.Game/Beatmaps/BeatmapSetOnlineStatus.cs
new file mode 100644
index 0000000000..c7f767d3b2
--- /dev/null
+++ b/osu.Game/Beatmaps/BeatmapSetOnlineStatus.cs
@@ -0,0 +1,17 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+namespace osu.Game.Beatmaps
+{
+ public enum BeatmapSetOnlineStatus
+ {
+ None = -3,
+ Graveyard = -2,
+ WIP = -1,
+ Pending = 0,
+ Ranked = 1,
+ Approved = 2,
+ Qualified = 3,
+ Loved = 4,
+ }
+}
diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetOnlineStatusPill.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetOnlineStatusPill.cs
new file mode 100644
index 0000000000..8ea7a538f9
--- /dev/null
+++ b/osu.Game/Beatmaps/Drawables/BeatmapSetOnlineStatusPill.cs
@@ -0,0 +1,54 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics.Sprites;
+using OpenTK.Graphics;
+
+namespace osu.Game.Beatmaps.Drawables
+{
+ public class BeatmapSetOnlineStatusPill : CircularContainer
+ {
+ private readonly OsuSpriteText statusText;
+
+ private BeatmapSetOnlineStatus status = BeatmapSetOnlineStatus.None;
+ public BeatmapSetOnlineStatus Status
+ {
+ get { return status; }
+ set
+ {
+ if (value == status) return;
+ status = value;
+
+ statusText.Text = Enum.GetName(typeof(BeatmapSetOnlineStatus), Status)?.ToUpper();
+ }
+ }
+
+ public BeatmapSetOnlineStatusPill(float textSize, MarginPadding textPadding)
+ {
+ AutoSizeAxes = Axes.Both;
+ Masking = true;
+
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = Color4.Black,
+ Alpha = 0.5f,
+ },
+ statusText = new OsuSpriteText
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Font = @"Exo2.0-Bold",
+ TextSize = textSize,
+ Padding = textPadding,
+ },
+ };
+ }
+ }
+}
diff --git a/osu.Game/Online/API/Requests/APIResponseBeatmapSet.cs b/osu.Game/Online/API/Requests/APIResponseBeatmapSet.cs
index 8f011b4df7..28376a1b4f 100644
--- a/osu.Game/Online/API/Requests/APIResponseBeatmapSet.cs
+++ b/osu.Game/Online/API/Requests/APIResponseBeatmapSet.cs
@@ -30,6 +30,9 @@ namespace osu.Game.Online.API.Requests
[JsonProperty(@"video")]
private bool hasVideo { get; set; }
+ [JsonProperty(@"status")]
+ private BeatmapSetOnlineStatus status { get; set; }
+
[JsonProperty(@"submitted_date")]
private DateTimeOffset submitted { get; set; }
@@ -60,6 +63,7 @@ namespace osu.Game.Online.API.Requests
PlayCount = playCount,
FavouriteCount = favouriteCount,
BPM = bpm,
+ Status = status,
HasVideo = hasVideo,
Submitted = submitted,
Ranked = ranked,
diff --git a/osu.Game/Overlays/BeatmapSet/Header.cs b/osu.Game/Overlays/BeatmapSet/Header.cs
index 3ce0dfee31..b9a35ec1f0 100644
--- a/osu.Game/Overlays/BeatmapSet/Header.cs
+++ b/osu.Game/Overlays/BeatmapSet/Header.cs
@@ -30,6 +30,7 @@ namespace osu.Game.Overlays.BeatmapSet
private readonly FillFlowContainer videoButtons;
private readonly AuthorInfo author;
private readonly Container downloadButtonsContainer;
+ private readonly BeatmapSetOnlineStatusPill onlineStatusPill;
public Details Details;
private BeatmapManager beatmaps;
@@ -50,6 +51,7 @@ namespace osu.Game.Overlays.BeatmapSet
Picker.BeatmapSet = author.BeatmapSet = Details.BeatmapSet = BeatmapSet;
title.Text = BeatmapSet.Metadata.Title;
artist.Text = BeatmapSet.Metadata.Artist;
+ onlineStatusPill.Status = BeatmapSet.OnlineInfo.Status;
downloadButtonsContainer.FadeIn();
noVideoButtons.FadeTo(BeatmapSet.OnlineInfo.HasVideo ? 0 : 1, transition_duration);
@@ -204,11 +206,23 @@ namespace osu.Game.Overlays.BeatmapSet
},
},
},
- Details = new Details
+ new FillFlowContainer
{
Anchor = Anchor.BottomRight,
Origin = Anchor.BottomRight,
+ AutoSizeAxes = Axes.Both,
Margin = new MarginPadding { Right = BeatmapSetOverlay.X_PADDING },
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(10),
+ Children = new Drawable[]
+ {
+ onlineStatusPill = new BeatmapSetOnlineStatusPill(14, new MarginPadding { Horizontal = 25, Vertical = 8 })
+ {
+ Anchor = Anchor.TopRight,
+ Origin = Anchor.TopRight,
+ },
+ Details = new Details(),
+ },
},
},
},
diff --git a/osu.Game/Overlays/Direct/DirectGridPanel.cs b/osu.Game/Overlays/Direct/DirectGridPanel.cs
index 2cc51f9e4c..d893c027c7 100644
--- a/osu.Game/Overlays/Direct/DirectGridPanel.cs
+++ b/osu.Game/Overlays/Direct/DirectGridPanel.cs
@@ -11,7 +11,9 @@ using osu.Framework.Localisation;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Framework.Graphics.Shapes;
+using osu.Framework.Input;
using osu.Game.Beatmaps;
+using osu.Game.Beatmaps.Drawables;
namespace osu.Game.Overlays.Direct
{
@@ -20,7 +22,7 @@ namespace osu.Game.Overlays.Direct
private const float horizontal_padding = 10;
private const float vertical_padding = 5;
- private FillFlowContainer bottomPanel;
+ private FillFlowContainer bottomPanel, statusContainer;
private PlayButton playButton;
private Box progressBar;
@@ -199,7 +201,37 @@ namespace osu.Game.Overlays.Direct
Size = new Vector2(30),
Alpha = 0,
},
+ statusContainer = new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Margin = new MarginPadding { Top = 5, Left = 5 },
+ Spacing = new Vector2(5),
+ },
});
+
+ if (SetInfo.OnlineInfo?.HasVideo ?? false)
+ {
+ statusContainer.Add(new IconPill(FontAwesome.fa_film));
+ }
+
+ statusContainer.Add(new BeatmapSetOnlineStatusPill(12, new MarginPadding { Horizontal = 10, Vertical = 5 })
+ {
+ Status = SetInfo.OnlineInfo?.Status ?? BeatmapSetOnlineStatus.None,
+ });
+ }
+
+ protected override bool OnHover(InputState state)
+ {
+ statusContainer.FadeOut(120, Easing.InOutQuint);
+
+ return base.OnHover(state);
+ }
+
+ protected override void OnHoverLost(InputState state)
+ {
+ base.OnHoverLost(state);
+
+ statusContainer.FadeIn(120, Easing.InOutQuint);
}
}
}
diff --git a/osu.Game/Overlays/Direct/IconPill.cs b/osu.Game/Overlays/Direct/IconPill.cs
new file mode 100644
index 0000000000..33b67bdf13
--- /dev/null
+++ b/osu.Game/Overlays/Direct/IconPill.cs
@@ -0,0 +1,43 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics;
+using OpenTK;
+using OpenTK.Graphics;
+
+namespace osu.Game.Overlays.Direct
+{
+ public class IconPill : CircularContainer
+ {
+ public IconPill(FontAwesome icon)
+ {
+ AutoSizeAxes = Axes.Both;
+ Masking = true;
+
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = Color4.Black,
+ Alpha = 0.5f,
+ },
+ new Container
+ {
+ AutoSizeAxes = Axes.Both,
+ Margin = new MarginPadding(5),
+ Child = new SpriteIcon
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Icon = icon,
+ Size = new Vector2(12),
+ },
+ },
+ };
+ }
+ }
+}