Exemple #1
0
        private void load(OsuColour colours)
        {
            Children = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.fa_warning,
                    Size   = new Vector2(30),
                    RelativePositionAxes = Axes.Both,
                    Y = icon_y,
                },
                textFlow = new LinkFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Padding          = new MarginPadding(50),
                    TextAnchor       = Anchor.TopCentre,
                    Anchor           = Anchor.Centre,
                    Origin           = Anchor.Centre,
                    Spacing          = new Vector2(0, 2),
                }
            };

            textFlow.AddText("This is an ", t =>
            {
                t.TextSize = 30;
                t.Font     = @"Exo2.0-Light";
            });
            textFlow.AddText("early development build", t =>
            {
                t.TextSize = 30;
                t.Font     = @"Exo2.0-SemiBold";
            });

            textFlow.AddParagraph("Don't expect everything to work perfectly.");
            textFlow.AddParagraph("");
            textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.");
            textFlow.AddParagraph("");

            textFlow.AddText("Visit ");
            textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy");
            textFlow.AddText(" if you want to help out or follow progress!");

            iconColour = colours.Yellow;
        }
Exemple #2
0
        private void load(OsuColour colours)
        {
            LinkFlowContainer text;

            InternalChildren = new Drawable[]
            {
                new Container
                {
                    RelativeSizeAxes = Axes.Both,
                    Masking          = true,
                    CornerRadius     = 10,
                    Child            = new Box
                    {
                        RelativeSizeAxes = Axes.Both,
                        Colour           = colours.GreyVioletDarker
                    },
                },
                text = new LinkFlowContainer(t =>
                {
                    t.Colour = colours.PinkLighter;
                    t.Font   = OsuFont.Default.With(size: 14);
                })
                {
                    Padding          = new MarginPadding(20),
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                }
            };

            text.AddParagraph("Got feedback?", t =>
            {
                t.Colour  = Color4.White;
                t.Font    = OsuFont.Default.With(italics: true, size: 20);
                t.Padding = new MarginPadding {
                    Bottom = 20
                };
            });

            text.AddParagraph("We would love to hear what you think of this update! ");
            text.AddIcon(FontAwesome.Regular.GrinHearts);

            text.AddParagraph("Please visit the ");
            text.AddLink("web version", $"{build.Url}#comments");
            text.AddText(" of this changelog to leave any comments.");
        }
Exemple #3
0
        private void load(OsuColour colours, IAPIProvider api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.Solid.ExclamationTriangle,
                    Size   = new Vector2(icon_size),
                    Y      = icon_y,
                },
                new FillFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Direction        = FillDirection.Vertical,
                    Y        = icon_y + icon_size,
                    Anchor   = Anchor.Centre,
                    Origin   = Anchor.TopCentre,
                    Children = new Drawable[]
                    {
                        textFlow = new LinkFlowContainer
                        {
                            RelativeSizeAxes = Axes.X,
                            AutoSizeAxes     = Axes.Y,
                            TextAnchor       = Anchor.TopCentre,
                            Anchor           = Anchor.TopCentre,
                            Origin           = Anchor.TopCentre,
                            Spacing          = new Vector2(0, 2),
                        },
                        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),
                        },
                    }
                }
            };

            textFlow.AddText("This is an ", t => t.Font             = t.Font.With(Typeface.Exo, 30, FontWeight.Light));
            textFlow.AddText("early development build", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.SemiBold));

            textFlow.AddParagraph("Things may not work as expected", t => t.Font = t.Font.With(size: 20));
            textFlow.NewParagraph();
Exemple #4
0
        private void updateText()
        {
            // TODO: Refresh this text when new beatmaps are imported. Right now it won't get up-to-date suggestions.

            // Bounce should play every time the filter criteria is updated.
            this.ScaleTo(0.9f)
            .ScaleTo(1f, 1000, Easing.OutElastic);

            textFlow.Clear();

            if (beatmaps.QueryBeatmapSet(s => !s.Protected && !s.DeletePending) == null)
            {
                textFlow.AddParagraph("No beatmaps found!");
                textFlow.AddParagraph(string.Empty);

                textFlow.AddParagraph("Consider using the \"");
                textFlow.AddLink(FirstRunSetupOverlayStrings.FirstRunSetupTitle, () => firstRunSetupOverlay?.Show());
                textFlow.AddText("\" to download or import some beatmaps!");
            }
            else
            {
                textFlow.AddParagraph("No beatmaps match your filter criteria!");
                textFlow.AddParagraph(string.Empty);

                if (string.IsNullOrEmpty(filter?.SearchText))
                {
                    // TODO: Add realm queries to hint at which ruleset results are available in (and allow clicking to switch).
                    // TODO: Make this message more certain by ensuring the osu! beatmaps exist before suggesting.
                    if (filter?.Ruleset.OnlineID > 0 && !filter.AllowConvertedBeatmaps)
                    {
                        textFlow.AddParagraph("Beatmaps may be available by ");
                        textFlow.AddLink("enabling automatic conversion", () => config.SetValue(OsuSetting.ShowConvertedBeatmaps, true));
                        textFlow.AddText("!");
                    }
                }
                else
                {
                    textFlow.AddParagraph("You can try ");
                    textFlow.AddLink("searching online", LinkAction.SearchBeatmapSet, filter.SearchText);
                    textFlow.AddText(" for this query.");
                }
            }

            // TODO: add clickable link to reset criteria.
        }
Exemple #5
0
        private void load(OsuColour colours)
        {
            LinkFlowContainer text;

            InternalChildren = new Drawable[]
            {
                new Container
                {
                    RelativeSizeAxes = Axes.Both,
                    Masking          = true,
                    CornerRadius     = 10,
                    Child            = new Box
                    {
                        RelativeSizeAxes = Axes.Both,
                        Colour           = colours.GreyVioletDarker
                    },
                },
                text = new LinkFlowContainer(t =>
                {
                    t.Colour = colours.PinkLighter;
                    t.Font   = OsuFont.Default.With(size: 14);
                })
                {
                    Padding          = new MarginPadding(20),
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                }
            };

            text.AddParagraph("反馈问题?", t =>
            {
                t.Colour  = Color4.White;
                t.Font    = OsuFont.Default.With(italics: true, size: 24);
                t.Padding = new MarginPadding {
                    Bottom = 20
                };
            });

            text.AddParagraph("我们想知道你如何看待这次更新! ", t =>
            {
                t.Font = OsuFont.Default.With(size: 20);
            });
            text.AddIcon(FontAwesome.Regular.GrinHearts);

            text.AddParagraph("请访问", t =>
            {
                t.Font = OsuFont.Default.With(size: 20);
            });
            text.AddLink("网页版", $"{build.Url}#comments", t =>
            {
                t.Font = OsuFont.Default.With(size: 20);
            });
            text.AddText("的更改日志来留言.", t =>
            {
                t.Font = OsuFont.Default.With(size: 20);
            });

            text.AddParagraph("另外,你还可以通过访问", t =>
            {
                t.Font = OsuFont.Default.With(size: 17);
            });
            text.AddLink("这个链接", "https://github.com/ppy/osu/graphs/contributors", t =>
            {
                t.Font = OsuFont.Default.With(size: 17);
            });
            text.AddParagraph("和", t =>
            {
                t.Font = OsuFont.Default.With(size: 17);
            });
            text.AddLink("这个链接", "https://github.com/matrix-feather/osu/graphs/contributors", t =>
            {
                t.Font = OsuFont.Default.With(size: 17);
            });
            text.AddText("来查看迄今为止所有参与过osu!lazer以及中文版osu!lazer开发的人员!感谢他们的辛勤付出!", t =>
            {
                t.Font = OsuFont.Default.With(size: 17);
            });
        }
Exemple #6
0
        private void load(OsuColour colours, APIAccess api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.fa_warning,
                    Size   = new Vector2(30),
                    Y      = icon_y,
                },
                textFlow = new LinkFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Padding          = new MarginPadding(50),
                    TextAnchor       = Anchor.TopCentre,
                    Y       = -110,
                    Anchor  = Anchor.Centre,
                    Origin  = Anchor.TopCentre,
                    Spacing = new Vector2(0, 2),
                }
            };

            textFlow.AddText("This is an ", t => t.Font             = t.Font.With(Typeface.Exo, 30, FontWeight.Light));
            textFlow.AddText("early development build", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.SemiBold));

            textFlow.AddParagraph("Things may not work as expected", t => t.Font = t.Font.With(size: 20));
            textFlow.NewParagraph();

            Action <SpriteText> format = t => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);

            textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.", format);
            textFlow.NewParagraph();

            textFlow.AddText("Visit ", format);
            textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy", creationParameters: format);
            textFlow.AddText(" to help out or follow progress!", format);

            textFlow.NewParagraph();
            textFlow.NewParagraph();
            textFlow.NewParagraph();

            supporterDrawables.AddRange(textFlow.AddText("Consider becoming an ", format));
            supporterDrawables.AddRange(textFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", creationParameters: format));
            supporterDrawables.AddRange(textFlow.AddText(" to help support the game", format));

            supporterDrawables.Add(heart = textFlow.AddIcon(FontAwesome.fa_heart, t =>
            {
                t.Padding = new MarginPadding {
                    Left = 5
                };
                t.Font   = t.Font.With(size: 12);
                t.Colour = colours.Pink;
                t.Origin = Anchor.Centre;
            }).First());

            iconColour = colours.Yellow;

            currentUser.BindTo(api.LocalUser);
            currentUser.BindValueChanged(e =>
            {
                if (e.NewValue.IsSupporter)
                {
                    supporterDrawables.ForEach(d => d.FadeOut(500, Easing.OutQuint).Expire());
                }
            }, true);
        }
Exemple #7
0
        private void load(OsuColour colours, IAPIProvider api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.Solid.ExclamationTriangle,
                    Size   = new Vector2(icon_size),
                    Y      = icon_y,
                },
                new FillFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Direction        = FillDirection.Vertical,
                    Y        = icon_y + icon_size,
                    Anchor   = Anchor.Centre,
                    Origin   = Anchor.TopCentre,
                    Children = new Drawable[]
                    {
                        textFlow = new LinkFlowContainer
                        {
                            RelativeSizeAxes = Axes.X,
                            AutoSizeAxes     = Axes.Y,
                            TextAnchor       = Anchor.TopCentre,
                            Anchor           = Anchor.TopCentre,
                            Origin           = Anchor.TopCentre,
                            Spacing          = new Vector2(0, 2),
                        },
                        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),
                        },
                    }
                }
            };

            textFlow.AddText("This is an ", t => t.Font             = t.Font.With(Typeface.Exo, 30, FontWeight.Light));
            textFlow.AddText("early development build", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.SemiBold));

            textFlow.AddParagraph("Things may not work as expected", t => t.Font = t.Font.With(size: 20));
            textFlow.NewParagraph();

            Action <SpriteText> format = t => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);

            textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.", format);
            textFlow.NewParagraph();

            textFlow.AddText("Visit ", format);
            textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy", creationParameters: format);
            textFlow.AddText(" to help out or follow progress!", format);

            textFlow.NewParagraph();
            textFlow.NewParagraph();
            textFlow.NewParagraph();

            iconColour = colours.Yellow;

            currentUser.BindTo(api.LocalUser);
            currentUser.BindValueChanged(e =>
            {
                supportFlow.Children.ForEach(d => d.FadeOut().Expire());

                if (e.NewValue.IsSupporter)
                {
                    supportFlow.AddText("Thank you for supporting osu!", format);
                }
                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);
                }

                heart = supportFlow.AddIcon(FontAwesome.Solid.Heart, t =>
                {
                    t.Padding = new MarginPadding {
                        Left = 5
                    };
                    t.Font   = t.Font.With(size: 12);
                    t.Origin = Anchor.Centre;
                    t.Colour = colours.Pink;
                }).First();

                if (IsLoaded)
                {
                    animateHeart();
                }

                if (supportFlow.IsPresent)
                {
                    supportFlow.FadeInFromZero(500);
                }
            }, true);
        }
Exemple #8
0
        private void load(OsuColour colours, IAPIProvider api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.Solid.ExclamationTriangle,
                    Size   = new Vector2(icon_size),
                    Y      = icon_y,
                },
                new FillFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Direction        = FillDirection.Vertical,
                    Y        = icon_y + icon_size,
                    Anchor   = Anchor.Centre,
                    Origin   = Anchor.TopCentre,
                    Children = new Drawable[]
                    {
                        textFlow = new LinkFlowContainer
                        {
                            RelativeSizeAxes = Axes.X,
                            AutoSizeAxes     = Axes.Y,
                            TextAnchor       = Anchor.TopCentre,
                            Anchor           = Anchor.TopCentre,
                            Origin           = Anchor.TopCentre,
                            Spacing          = new Vector2(0, 2),
                        },
                        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),
                        },
                    }
                }
            };

            textFlow.AddText("这是一个 ", t => t.Font     = t.Font.With(Typeface.Exo, 30, FontWeight.Light));
            textFlow.AddText("非常早期的构建版本", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.SemiBold));

            textFlow.AddParagraph("一些事情可能不会按预期工作", t => t.Font = t.Font.With(size: 20));
            textFlow.NewParagraph();

            Action <SpriteText> format = t => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);

            textFlow.AddParagraph("欢迎来到github的issues页进行反馈", format);
            textFlow.NewParagraph();

            textFlow.AddText("访问 ", format);
            textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy", creationParameters: format);
            textFlow.AddText("来一起帮助开发或获取最新进度!", format);

            textFlow.NewParagraph();
            textFlow.NewParagraph();
            textFlow.NewParagraph();

            iconColour = colours.Yellow;

            currentUser.BindTo(api.LocalUser);
            currentUser.BindValueChanged(e =>
            {
                supportFlow.Children.ForEach(d => d.FadeOut().Expire());

                if (e.NewValue.IsSupporter)
                {
                    supportFlow.AddText("感谢支持osu!", format);
                }
                else
                {
                    supportFlow.AddText("考虑成为一名 ", format);
                    supportFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", creationParameters: format);
                    supportFlow.AddText("来帮助我们维护这个游戏", format);
                }

                heart = supportFlow.AddIcon(FontAwesome.Solid.Heart, t =>
                {
                    t.Padding = new MarginPadding {
                        Left = 5
                    };
                    t.Font   = t.Font.With(size: 12);
                    t.Origin = Anchor.Centre;
                    t.Colour = colours.Pink;
                }).First();

                if (IsLoaded)
                {
                    animateHeart();
                }

                if (supportFlow.IsPresent)
                {
                    supportFlow.FadeInFromZero(500);
                }
            }, true);
        }
Exemple #9
0
        private void load(OsuColour colours)
        {
            Children = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.fa_warning,
                    Size   = new Vector2(30),
                    Y      = icon_y,
                },
                textFlow = new LinkFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Padding          = new MarginPadding(50),
                    TextAnchor       = Anchor.TopCentre,
                    Y       = -110,
                    Anchor  = Anchor.Centre,
                    Origin  = Anchor.TopCentre,
                    Spacing = new Vector2(0, 2),
                }
            };

            textFlow.AddText("This is an ", t =>
            {
                t.TextSize = 30;
                t.Font     = @"Exo2.0-Light";
            });
            textFlow.AddText("early development build", t =>
            {
                t.TextSize = 30;
                t.Font     = @"Exo2.0-SemiBold";
            });

            textFlow.AddParagraph("Things may not work as expected", t => t.TextSize = 20);
            textFlow.NewParagraph();

            Action <SpriteText> format = t =>
            {
                t.TextSize = 15;
                t.Font     = @"Exo2.0-SemiBold";
            };

            textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.", format);
            textFlow.NewParagraph();

            textFlow.AddText("Visit ", format);
            textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy", creationParameters: format);
            textFlow.AddText(" to help out or follow progress!", format);

            textFlow.NewParagraph();
            textFlow.NewParagraph();
            textFlow.NewParagraph();

            supporterDrawables.AddRange(textFlow.AddText("Consider becoming an ", format));
            supporterDrawables.AddRange(textFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", creationParameters: format));
            supporterDrawables.AddRange(textFlow.AddText(" to help support the game", format));

            supporterDrawables.Add(heart = textFlow.AddIcon(FontAwesome.fa_heart, t =>
            {
                t.Padding = new MarginPadding {
                    Left = 5
                };
                t.TextSize = 12;
                t.Colour   = colours.Pink;
                t.Origin   = Anchor.Centre;
            }).First());

            iconColour = colours.Yellow;
        }
Exemple #10
0
        private void load(OsuColour colours, IAPIProvider api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.Solid.ExclamationTriangle,
                    Size   = new Vector2(icon_size),
                    Y      = icon_y,
                },
                new FillFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Direction        = FillDirection.Vertical,
                    Y        = icon_y + icon_size,
                    Anchor   = Anchor.Centre,
                    Origin   = Anchor.TopCentre,
                    Children = new Drawable[]
                    {
                        textFlow = new LinkFlowContainer
                        {
                            RelativeSizeAxes = Axes.X,
                            AutoSizeAxes     = Axes.Y,
                            TextAnchor       = Anchor.TopCentre,
                            Anchor           = Anchor.TopCentre,
                            Origin           = Anchor.TopCentre,
                            Spacing          = new Vector2(0, 2),
                        },
                        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),
                        },
                    }
                }
            };

            textFlow.AddText("This is ", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.Light));
            textFlow.AddText("Powerlated's OSU CHEAT", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.SemiBold));

            textFlow.AddParagraph("Things may not work as expected", t => t.Font = t.Font.With(size: 20));
            textFlow.NewParagraph();

            Action <SpriteText> format = t => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);

            textFlow.AddParagraph("Don't ask.", format);
            textFlow.NewParagraph();

            textFlow.NewParagraph();
            textFlow.NewParagraph();
            textFlow.NewParagraph();

            iconColour = colours.Yellow;

            currentUser.BindTo(api.LocalUser);
            currentUser.BindValueChanged(e =>
            {
                supportFlow.Children.ForEach(d => d.FadeOut().Expire());

                if (e.NewValue.IsSupporter)
                {
                    supportFlow.AddText("Thank you for supporting osu!", format);
                }
                else
                {
                    supportFlow.AddText("Consider sucking on ", format);
                    supportFlow.AddLink("my!c**k", "https://pornhub.com", creationParameters: format);
                    supportFlow.AddText(" to make me nut", format);
                }

                heart = supportFlow.AddIcon(FontAwesome.Solid.Heart, t =>
                {
                    t.Padding = new MarginPadding {
                        Left = 5
                    };
                    t.Font   = t.Font.With(size: 12);
                    t.Origin = Anchor.Centre;
                    t.Colour = colours.Pink;
                }).First();

                if (IsLoaded)
                {
                    animateHeart();
                }

                if (supportFlow.IsPresent)
                {
                    supportFlow.FadeInFromZero(500);
                }
            }, true);
        }
Exemple #11
0
        public LatencyCertifierScreen()
        {
            InternalChildren = new Drawable[]
            {
                new Box
                {
                    Colour           = overlayColourProvider.Background6,
                    RelativeSizeAxes = Axes.Both,
                },
                mainArea = new Container <LatencyArea>
                {
                    RelativeSizeAxes = Axes.Both,
                },
                // Make sure the edge between the two comparisons can't be used to ascertain latency.
                new Box
                {
                    Name             = "separator",
                    Colour           = ColourInfo.GradientHorizontal(overlayColourProvider.Background6, overlayColourProvider.Background6.Opacity(0)),
                    Width            = 100,
                    RelativeSizeAxes = Axes.Y,
                    Anchor           = Anchor.TopCentre,
                    Origin           = Anchor.TopLeft,
                },
                new Box
                {
                    Name             = "separator",
                    Colour           = ColourInfo.GradientHorizontal(overlayColourProvider.Background6.Opacity(0), overlayColourProvider.Background6),
                    Width            = 100,
                    RelativeSizeAxes = Axes.Y,
                    Anchor           = Anchor.TopCentre,
                    Origin           = Anchor.TopRight,
                },
                settings = new FillFlowContainer
                {
                    Name         = "Settings",
                    AutoSizeAxes = Axes.Y,
                    Width        = 800,
                    Padding      = new MarginPadding(10),
                    Spacing      = new Vector2(2),
                    Direction    = FillDirection.Vertical,
                    Anchor       = Anchor.BottomCentre,
                    Origin       = Anchor.BottomCentre,
                    Children     = new Drawable[]
                    {
                        explanatoryText = new LinkFlowContainer(cp => cp.Font = OsuFont.Default.With(size: 20))
                        {
                            AutoSizeAxes     = Axes.Y,
                            RelativeSizeAxes = Axes.X,
                            Anchor           = Anchor.TopCentre,
                            Origin           = Anchor.TopCentre,
                            TextAnchor       = Anchor.TopCentre,
                        },
                        new SettingsSlider <double>
                        {
                            Anchor           = Anchor.TopCentre,
                            Origin           = Anchor.TopCentre,
                            RelativeSizeAxes = Axes.None,
                            Width            = 400,
                            LabelText        = "bpm",
                            Current          = SampleBPM
                        },
                        new SettingsSlider <float>
                        {
                            Anchor           = Anchor.TopCentre,
                            Origin           = Anchor.TopCentre,
                            RelativeSizeAxes = Axes.None,
                            Width            = 400,
                            LabelText        = "visual spacing",
                            Current          = SampleVisualSpacing
                        },
                        new SettingsSlider <double>
                        {
                            Anchor           = Anchor.TopCentre,
                            Origin           = Anchor.TopCentre,
                            RelativeSizeAxes = Axes.None,
                            Width            = 400,
                            LabelText        = "approach rate",
                            Current          = SampleApproachRate
                        },
                    },
                },
                resultsArea = new Container
                {
                    RelativeSizeAxes = Axes.Both,
                },
                statusText = new OsuTextFlowContainer(cp => cp.Font = OsuFont.Default.With(size: 40))
                {
                    Anchor           = Anchor.TopCentre,
                    Origin           = Anchor.TopCentre,
                    TextAnchor       = Anchor.TopCentre,
                    Y                = 150,
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                },
            };

            explanatoryText.AddParagraph(@"Welcome to the latency certifier!");
            explanatoryText.AddParagraph(@"Do whatever you need to try and perceive the difference in latency, then choose your best side. Read more about the methodology ");
            explanatoryText.AddLink("here", "https://github.com/ppy/osu/wiki/Latency-and-unlimited-frame-rates#methodology");
            explanatoryText.AddParagraph(@"Use the arrow keys or Z/X/F/J to control the display.");
            explanatoryText.AddParagraph(@"Tab key to change focus. Space to change display mode");
        }