diff --git a/Gemfile.lock b/Gemfile.lock
index bf971d2c22..a4b49af7e4 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -6,35 +6,36 @@ GEM
public_suffix (>= 2.0.2, < 5.0)
atomos (0.1.3)
aws-eventstream (1.1.0)
- aws-partitions (1.329.0)
- aws-sdk-core (3.99.2)
+ aws-partitions (1.354.0)
+ aws-sdk-core (3.104.3)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
- aws-sdk-kms (1.34.1)
+ aws-sdk-kms (1.36.0)
aws-sdk-core (~> 3, >= 3.99.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.68.1)
- aws-sdk-core (~> 3, >= 3.99.0)
+ aws-sdk-s3 (1.78.0)
+ aws-sdk-core (~> 3, >= 3.104.3)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.1)
- aws-sigv4 (1.1.4)
- aws-eventstream (~> 1.0, >= 1.0.2)
+ aws-sigv4 (1.2.1)
+ aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.3)
claide (1.0.3)
colored (1.2)
colored2 (3.1.2)
commander-fastlane (4.4.6)
highline (~> 1.7.2)
- declarative (0.0.10)
+ declarative (0.0.20)
declarative-option (0.1.0)
- digest-crc (0.5.1)
+ digest-crc (0.6.1)
+ rake (~> 13.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
- dotenv (2.7.5)
- emoji_regex (1.0.1)
- excon (0.74.0)
+ dotenv (2.7.6)
+ emoji_regex (3.0.0)
+ excon (0.76.0)
faraday (1.0.1)
multipart-post (>= 1.2, < 3)
faraday-cookie_jar (0.0.6)
@@ -42,34 +43,32 @@ GEM
http-cookie (~> 1.0.0)
faraday_middleware (1.0.0)
faraday (~> 1.0)
- fastimage (2.1.7)
- fastlane (2.149.1)
+ fastimage (2.2.0)
+ fastlane (2.156.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.3, < 3.0.0)
aws-sdk-s3 (~> 1.0)
- babosa (>= 1.0.2, < 2.0.0)
+ babosa (>= 1.0.3, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
colored
commander-fastlane (>= 4.4.6, < 5.0.0)
dotenv (>= 2.1.1, < 3.0.0)
- emoji_regex (>= 0.1, < 2.0)
+ emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
- faraday (>= 0.17, < 2.0)
+ faraday (~> 1.0)
faraday-cookie_jar (~> 0.0.6)
- faraday_middleware (>= 0.13.1, < 2.0)
+ faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-api-client (>= 0.37.0, < 0.39.0)
google-cloud-storage (>= 1.15.0, < 2.0.0)
highline (>= 1.7.2, < 2.0.0)
json (< 3.0.0)
- jwt (~> 2.1.0)
+ jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
- multi_xml (~> 0.5)
multipart-post (~> 2.0.0)
plist (>= 3.1.0, < 4.0.0)
- public_suffix (~> 2.0.0)
- rubyzip (>= 1.3.0, < 2.0.0)
+ rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.3)
simctl (~> 1.6.3)
slack-notifier (>= 2.0.0, < 3.0.0)
@@ -97,17 +96,17 @@ GEM
google-cloud-core (1.5.0)
google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0)
- google-cloud-env (1.3.2)
+ google-cloud-env (1.3.3)
faraday (>= 0.17.3, < 2.0)
google-cloud-errors (1.0.1)
- google-cloud-storage (1.26.2)
+ google-cloud-storage (1.27.0)
addressable (~> 2.5)
digest-crc (~> 0.4)
google-api-client (~> 0.33)
google-cloud-core (~> 1.2)
googleauth (~> 0.9)
mini_mime (~> 1.0)
- googleauth (0.12.0)
+ googleauth (0.13.1)
faraday (>= 0.17.3, < 2.0)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
@@ -119,29 +118,29 @@ GEM
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.4.0)
- json (2.3.0)
- jwt (2.1.0)
+ json (2.3.1)
+ jwt (2.2.1)
memoist (0.16.2)
mini_magick (4.10.1)
mini_mime (1.0.2)
mini_portile2 (2.4.0)
- multi_json (1.14.1)
- multi_xml (0.6.0)
+ multi_json (1.15.0)
multipart-post (2.0.0)
- nanaimo (0.2.6)
+ nanaimo (0.3.0)
naturally (2.2.0)
- nokogiri (1.10.7)
+ nokogiri (1.10.10)
mini_portile2 (~> 2.4.0)
- os (1.1.0)
+ os (1.1.1)
plist (3.5.0)
- public_suffix (2.0.5)
+ public_suffix (4.0.5)
+ rake (13.0.1)
representable (3.0.4)
declarative (< 0.1.0)
declarative-option (< 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rouge (2.0.7)
- rubyzip (1.3.0)
+ rubyzip (2.3.0)
security (0.1.3)
signet (0.14.0)
addressable (~> 2.3)
@@ -160,7 +159,7 @@ GEM
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
tty-cursor (0.7.1)
- tty-screen (0.8.0)
+ tty-screen (0.8.1)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
uber (0.1.0)
@@ -169,12 +168,12 @@ GEM
unf_ext (0.0.7.7)
unicode-display_width (1.7.0)
word_wrap (1.0.0)
- xcodeproj (1.16.0)
+ xcodeproj (1.18.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
- nanaimo (~> 0.2.6)
+ nanaimo (~> 0.3.0)
xcpretty (0.3.0)
rouge (~> 2.0.7)
xcpretty-travis-formatter (1.0.0)
diff --git a/osu.Android.props b/osu.Android.props
index a384ad4c34..241b836aac 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -51,7 +51,7 @@
-
-
+
+
diff --git a/osu.Game.Tests/Visual/Online/TestSceneHomeNewsPanel.cs b/osu.Game.Tests/Visual/Online/TestSceneHomeNewsPanel.cs
new file mode 100644
index 0000000000..a1251ca793
--- /dev/null
+++ b/osu.Game.Tests/Visual/Online/TestSceneHomeNewsPanel.cs
@@ -0,0 +1,61 @@
+// 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.Graphics.Containers;
+using osu.Framework.Graphics;
+using osu.Game.Online.API.Requests.Responses;
+using osu.Framework.Allocation;
+using osu.Game.Overlays;
+using System;
+using osu.Game.Overlays.Dashboard.Home.News;
+using osuTK;
+using System.Collections.Generic;
+
+namespace osu.Game.Tests.Visual.Online
+{
+ public class TestSceneHomeNewsPanel : OsuTestScene
+ {
+ [Cached]
+ private readonly OverlayColourProvider overlayColour = new OverlayColourProvider(OverlayColourScheme.Purple);
+
+ public TestSceneHomeNewsPanel()
+ {
+ Add(new FillFlowContainer
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ AutoSizeAxes = Axes.Y,
+ Width = 500,
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(0, 5),
+ Children = new Drawable[]
+ {
+ new FeaturedNewsItemPanel(new APINewsPost
+ {
+ Title = "This post has an image which starts with \"/\" and has many authors!",
+ Preview = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ FirstImage = "/help/wiki/shared/news/banners/monthly-beatmapping-contest.png",
+ PublishedAt = DateTimeOffset.Now,
+ Slug = "2020-07-16-summer-theme-park-2020-voting-open"
+ }),
+ new NewsItemGroupPanel(new List
+ {
+ new APINewsPost
+ {
+ Title = "Title 1",
+ Slug = "2020-07-16-summer-theme-park-2020-voting-open",
+ PublishedAt = DateTimeOffset.Now,
+ },
+ new APINewsPost
+ {
+ Title = "Title of this post is Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ Slug = "2020-07-16-summer-theme-park-2020-voting-open",
+ PublishedAt = DateTimeOffset.Now,
+ }
+ }),
+ new ShowMoreNewsPanel()
+ }
+ });
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Dashboard/Home/HomePanel.cs b/osu.Game/Overlays/Dashboard/Home/HomePanel.cs
new file mode 100644
index 0000000000..ce053cd4ec
--- /dev/null
+++ b/osu.Game/Overlays/Dashboard/Home/HomePanel.cs
@@ -0,0 +1,55 @@
+// 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.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Effects;
+using osu.Framework.Graphics.Shapes;
+using osuTK;
+using osuTK.Graphics;
+
+namespace osu.Game.Overlays.Dashboard.Home
+{
+ public class HomePanel : Container
+ {
+ protected override Container Content => content;
+
+ private readonly Container content;
+ private readonly Box background;
+
+ public HomePanel()
+ {
+ RelativeSizeAxes = Axes.X;
+ AutoSizeAxes = Axes.Y;
+ Masking = true;
+ EdgeEffect = new EdgeEffectParameters
+ {
+ Colour = Color4.Black.Opacity(0.25f),
+ Type = EdgeEffectType.Shadow,
+ Radius = 3,
+ Offset = new Vector2(0, 1)
+ };
+
+ AddRangeInternal(new Drawable[]
+ {
+ background = new Box
+ {
+ RelativeSizeAxes = Axes.Both
+ },
+ content = new Container
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y
+ }
+ });
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ background.Colour = colourProvider.Background4;
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Dashboard/Home/News/FeaturedNewsItemPanel.cs b/osu.Game/Overlays/Dashboard/Home/News/FeaturedNewsItemPanel.cs
new file mode 100644
index 0000000000..ee88469e2f
--- /dev/null
+++ b/osu.Game/Overlays/Dashboard/Home/News/FeaturedNewsItemPanel.cs
@@ -0,0 +1,195 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using osu.Framework.Allocation;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Cursor;
+using osu.Framework.Graphics.Shapes;
+using osu.Framework.Platform;
+using osu.Game.Graphics;
+using osu.Game.Graphics.Containers;
+using osu.Game.Graphics.Sprites;
+using osu.Game.Online.API.Requests.Responses;
+using osu.Game.Overlays.News;
+using osuTK;
+using osuTK.Graphics;
+
+namespace osu.Game.Overlays.Dashboard.Home.News
+{
+ public class FeaturedNewsItemPanel : HomePanel
+ {
+ private readonly APINewsPost post;
+
+ public FeaturedNewsItemPanel(APINewsPost post)
+ {
+ this.post = post;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ Children = new Drawable[]
+ {
+ new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ new ClickableNewsBackground(post),
+ new GridContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ RowDimensions = new[]
+ {
+ new Dimension(GridSizeMode.AutoSize)
+ },
+ ColumnDimensions = new[]
+ {
+ new Dimension(GridSizeMode.Absolute, size: 60),
+ new Dimension(GridSizeMode.Absolute, size: 20),
+ new Dimension()
+ },
+ Content = new[]
+ {
+ new Drawable[]
+ {
+ new Date(post.PublishedAt),
+ new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Padding = new MarginPadding { Vertical = 10 },
+ Child = new Box
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopRight,
+ Width = 1,
+ RelativeSizeAxes = Axes.Y,
+ Colour = colourProvider.Light1
+ }
+ },
+ new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Margin = new MarginPadding { Top = 5, Bottom = 10 },
+ Padding = new MarginPadding { Right = 10 },
+ Spacing = new Vector2(0, 10),
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ new NewsTitleLink(post),
+ new TextFlowContainer(f =>
+ {
+ f.Font = OsuFont.GetFont(size: 12, weight: FontWeight.Regular);
+ })
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Text = post.Preview
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+ }
+
+ private class ClickableNewsBackground : OsuHoverContainer
+ {
+ private readonly APINewsPost post;
+
+ public ClickableNewsBackground(APINewsPost post)
+ {
+ this.post = post;
+
+ RelativeSizeAxes = Axes.X;
+ Height = 130;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(GameHost host)
+ {
+ NewsPostBackground bg;
+
+ Child = new DelayedLoadWrapper(bg = new NewsPostBackground(post.FirstImage)
+ {
+ RelativeSizeAxes = Axes.Both,
+ FillMode = FillMode.Fill,
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Alpha = 0
+ })
+ {
+ RelativeSizeAxes = Axes.Both
+ };
+
+ bg.OnLoadComplete += d => d.FadeIn(250, Easing.In);
+
+ TooltipText = "view in browser";
+ Action = () => host.OpenUrlExternally("https://osu.ppy.sh/home/news/" + post.Slug);
+
+ HoverColour = Color4.White;
+ }
+ }
+
+ private class Date : CompositeDrawable, IHasCustomTooltip
+ {
+ public ITooltip GetCustomTooltip() => new DateTooltip();
+
+ public object TooltipContent => date;
+
+ private readonly DateTimeOffset date;
+
+ public Date(DateTimeOffset date)
+ {
+ this.date = date;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ AutoSizeAxes = Axes.Both;
+ Anchor = Anchor.TopRight;
+ Origin = Anchor.TopRight;
+ Margin = new MarginPadding { Top = 10 };
+ InternalChild = new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Vertical,
+ Anchor = Anchor.TopRight,
+ Origin = Anchor.TopRight,
+ Children = new Drawable[]
+ {
+ new OsuSpriteText
+ {
+ Anchor = Anchor.TopRight,
+ Origin = Anchor.TopRight,
+ Font = OsuFont.GetFont(weight: FontWeight.Bold), // using Bold since there is no 800 weight alternative
+ Colour = colourProvider.Light1,
+ Text = $"{date:dd}"
+ },
+ new TextFlowContainer(f =>
+ {
+ f.Font = OsuFont.GetFont(size: 11, weight: FontWeight.Regular);
+ f.Colour = colourProvider.Light1;
+ })
+ {
+ Anchor = Anchor.TopRight,
+ Origin = Anchor.TopRight,
+ AutoSizeAxes = Axes.Both,
+ Text = $"{date:MMM yyyy}"
+ }
+ }
+ };
+ }
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Dashboard/Home/News/NewsGroupItem.cs b/osu.Game/Overlays/Dashboard/Home/News/NewsGroupItem.cs
new file mode 100644
index 0000000000..dc4f3f8c92
--- /dev/null
+++ b/osu.Game/Overlays/Dashboard/Home/News/NewsGroupItem.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 System;
+using osu.Framework.Allocation;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Cursor;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics;
+using osu.Game.Online.API.Requests.Responses;
+
+namespace osu.Game.Overlays.Dashboard.Home.News
+{
+ public class NewsGroupItem : CompositeDrawable
+ {
+ private readonly APINewsPost post;
+
+ public NewsGroupItem(APINewsPost post)
+ {
+ this.post = post;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ RelativeSizeAxes = Axes.X;
+ AutoSizeAxes = Axes.Y;
+ InternalChild = new GridContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ RowDimensions = new[]
+ {
+ new Dimension(GridSizeMode.AutoSize)
+ },
+ ColumnDimensions = new[]
+ {
+ new Dimension(GridSizeMode.Absolute, size: 60),
+ new Dimension(GridSizeMode.Absolute, size: 20),
+ new Dimension()
+ },
+ Content = new[]
+ {
+ new Drawable[]
+ {
+ new Date(post.PublishedAt),
+ new Box
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopRight,
+ Width = 1,
+ RelativeSizeAxes = Axes.Y,
+ Colour = colourProvider.Light1
+ },
+ new Container
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ Padding = new MarginPadding { Right = 10 },
+ Child = new NewsTitleLink(post)
+ }
+ }
+ }
+ };
+ }
+
+ private class Date : CompositeDrawable, IHasCustomTooltip
+ {
+ public ITooltip GetCustomTooltip() => new DateTooltip();
+
+ public object TooltipContent => date;
+
+ private readonly DateTimeOffset date;
+
+ public Date(DateTimeOffset date)
+ {
+ this.date = date;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ TextFlowContainer textFlow;
+
+ AutoSizeAxes = Axes.Both;
+ Anchor = Anchor.TopRight;
+ Origin = Anchor.TopRight;
+ InternalChild = textFlow = new TextFlowContainer(t =>
+ {
+ t.Colour = colourProvider.Light1;
+ })
+ {
+ Anchor = Anchor.TopRight,
+ Origin = Anchor.TopRight,
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Horizontal,
+ Margin = new MarginPadding { Vertical = 5 }
+ };
+
+ textFlow.AddText($"{date:dd}", t =>
+ {
+ t.Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold);
+ });
+
+ textFlow.AddText($"{date: MMM}", t =>
+ {
+ t.Font = OsuFont.GetFont(size: 14, weight: FontWeight.Regular);
+ });
+ }
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Dashboard/Home/News/NewsItemGroupPanel.cs b/osu.Game/Overlays/Dashboard/Home/News/NewsItemGroupPanel.cs
new file mode 100644
index 0000000000..c1d5a87ef5
--- /dev/null
+++ b/osu.Game/Overlays/Dashboard/Home/News/NewsItemGroupPanel.cs
@@ -0,0 +1,36 @@
+// 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.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Online.API.Requests.Responses;
+
+namespace osu.Game.Overlays.Dashboard.Home.News
+{
+ public class NewsItemGroupPanel : HomePanel
+ {
+ private readonly List posts;
+
+ public NewsItemGroupPanel(List posts)
+ {
+ this.posts = posts;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load()
+ {
+ Content.Padding = new MarginPadding { Vertical = 5 };
+
+ Child = new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Direction = FillDirection.Vertical,
+ Children = posts.Select(p => new NewsGroupItem(p)).ToArray()
+ };
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Dashboard/Home/News/NewsTitleLink.cs b/osu.Game/Overlays/Dashboard/Home/News/NewsTitleLink.cs
new file mode 100644
index 0000000000..d6a3a69fe0
--- /dev/null
+++ b/osu.Game/Overlays/Dashboard/Home/News/NewsTitleLink.cs
@@ -0,0 +1,45 @@
+// 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.Allocation;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Platform;
+using osu.Game.Graphics;
+using osu.Game.Graphics.Containers;
+using osu.Game.Online.API.Requests.Responses;
+
+namespace osu.Game.Overlays.Dashboard.Home.News
+{
+ public class NewsTitleLink : OsuHoverContainer
+ {
+ private readonly APINewsPost post;
+
+ public NewsTitleLink(APINewsPost post)
+ {
+ this.post = post;
+
+ RelativeSizeAxes = Axes.X;
+ AutoSizeAxes = Axes.Y;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(GameHost host, OverlayColourProvider colourProvider)
+ {
+ Child = new TextFlowContainer(t =>
+ {
+ t.Font = OsuFont.GetFont(weight: FontWeight.Bold);
+ })
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Text = post.Title
+ };
+
+ HoverColour = colourProvider.Light1;
+
+ TooltipText = "view in browser";
+ Action = () => host.OpenUrlExternally("https://osu.ppy.sh/home/news/" + post.Slug);
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Dashboard/Home/News/ShowMoreNewsPanel.cs b/osu.Game/Overlays/Dashboard/Home/News/ShowMoreNewsPanel.cs
new file mode 100644
index 0000000000..d25df6f189
--- /dev/null
+++ b/osu.Game/Overlays/Dashboard/Home/News/ShowMoreNewsPanel.cs
@@ -0,0 +1,51 @@
+// 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 osu.Framework.Allocation;
+using osu.Framework.Graphics;
+using osu.Game.Graphics.Containers;
+using osu.Game.Graphics.Sprites;
+using osuTK.Graphics;
+
+namespace osu.Game.Overlays.Dashboard.Home.News
+{
+ public class ShowMoreNewsPanel : OsuHoverContainer
+ {
+ protected override IEnumerable EffectTargets => new[] { text };
+
+ [Resolved(canBeNull: true)]
+ private NewsOverlay overlay { get; set; }
+
+ private OsuSpriteText text;
+
+ public ShowMoreNewsPanel()
+ {
+ RelativeSizeAxes = Axes.X;
+ AutoSizeAxes = Axes.Y;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ Child = new HomePanel
+ {
+ Child = text = new OsuSpriteText
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Margin = new MarginPadding { Vertical = 20 },
+ Text = "see more"
+ }
+ };
+
+ IdleColour = colourProvider.Light1;
+ HoverColour = Color4.White;
+
+ Action = () =>
+ {
+ overlay?.ShowFrontPage();
+ };
+ }
+ }
+}
diff --git a/osu.Game/Overlays/News/NewsCard.cs b/osu.Game/Overlays/News/NewsCard.cs
index 201c3ce826..599b45fa78 100644
--- a/osu.Game/Overlays/News/NewsCard.cs
+++ b/osu.Game/Overlays/News/NewsCard.cs
@@ -9,8 +9,6 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Graphics.Sprites;
-using osu.Framework.Graphics.Textures;
using osu.Framework.Input.Events;
using osu.Framework.Platform;
using osu.Game.Graphics;
@@ -48,7 +46,7 @@ namespace osu.Game.Overlays.News
Action = () => host.OpenUrlExternally("https://osu.ppy.sh/home/news/" + post.Slug);
}
- NewsBackground bg;
+ NewsPostBackground bg;
AddRange(new Drawable[]
{
background = new Box
@@ -70,7 +68,7 @@ namespace osu.Game.Overlays.News
CornerRadius = 6,
Children = new Drawable[]
{
- new DelayedLoadWrapper(bg = new NewsBackground(post.FirstImage)
+ new DelayedLoadWrapper(bg = new NewsPostBackground(post.FirstImage)
{
RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fill,
@@ -123,34 +121,6 @@ namespace osu.Game.Overlays.News
main.AddText(post.Author, t => t.Font = OsuFont.GetFont(size: 12, weight: FontWeight.SemiBold));
}
- [LongRunningLoad]
- private class NewsBackground : Sprite
- {
- private readonly string sourceUrl;
-
- public NewsBackground(string sourceUrl)
- {
- this.sourceUrl = sourceUrl;
- }
-
- [BackgroundDependencyLoader]
- private void load(LargeTextureStore store)
- {
- Texture = store.Get(createUrl(sourceUrl));
- }
-
- private string createUrl(string source)
- {
- if (string.IsNullOrEmpty(source))
- return "Headers/news";
-
- if (source.StartsWith('/'))
- return "https://osu.ppy.sh" + source;
-
- return source;
- }
- }
-
private class DateContainer : CircularContainer, IHasCustomTooltip
{
public ITooltip GetCustomTooltip() => new DateTooltip();
diff --git a/osu.Game/Overlays/News/NewsPostBackground.cs b/osu.Game/Overlays/News/NewsPostBackground.cs
new file mode 100644
index 0000000000..386ef7f669
--- /dev/null
+++ b/osu.Game/Overlays/News/NewsPostBackground.cs
@@ -0,0 +1,37 @@
+// 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.Allocation;
+using osu.Framework.Graphics.Sprites;
+using osu.Framework.Graphics.Textures;
+
+namespace osu.Game.Overlays.News
+{
+ [LongRunningLoad]
+ public class NewsPostBackground : Sprite
+ {
+ private readonly string sourceUrl;
+
+ public NewsPostBackground(string sourceUrl)
+ {
+ this.sourceUrl = sourceUrl;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(LargeTextureStore store)
+ {
+ Texture = store.Get(createUrl(sourceUrl));
+ }
+
+ private string createUrl(string source)
+ {
+ if (string.IsNullOrEmpty(source))
+ return "Headers/news";
+
+ if (source.StartsWith('/'))
+ return "https://osu.ppy.sh" + source;
+
+ return source;
+ }
+ }
+}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index b38ef38ec2..63267e1494 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -24,8 +24,8 @@
-
-
+
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 00ddd94d53..3500eb75dc 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,8 +70,8 @@
-
-
+
+
@@ -80,7 +80,7 @@
-
+