private void tryAddInfo(IconUsage icon, string content, string link = null)
        {
            if (string.IsNullOrEmpty(content))
            {
                return;
            }

            // newlines could be contained in API returned user content.
            content = content.Replace("\n", " ");

            bottomLinkContainer.AddIcon(icon, text =>
            {
                text.Font   = text.Font.With(size: 10);
                text.Colour = iconColour;
            });

            if (link != null)
            {
                bottomLinkContainer.AddLink(" " + content, link, creationParameters: embolden);
            }
            else
            {
                bottomLinkContainer.AddText(" " + content, embolden);
            }

            addSpacer(bottomLinkContainer);
        }
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 tryAddInfoRightLine(FontAwesome icon, string str, string url = null)
        {
            if (string.IsNullOrEmpty(str))
            {
                return;
            }

            infoTextRight.AddIcon(icon);
            if (url != null)
            {
                infoTextRight.AddLink(" " + str, url);
            }
            else
            {
                infoTextRight.AddText(" " + str);
            }

            infoTextRight.NewLine();
        }
Exemple #4
0
        public ChangelogBuild(APIChangelogBuild build)
        {
            Build = build;

            RelativeSizeAxes = Axes.X;
            AutoSizeAxes     = Axes.Y;
            Direction        = FillDirection.Vertical;
            Padding          = new MarginPadding {
                Horizontal = HORIZONTAL_PADDING
            };

            Children = new Drawable[]
            {
                CreateHeader(),
                ChangelogEntries = new FillFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Direction        = FillDirection.Vertical,
                },
            };

            foreach (var categoryEntries in build.ChangelogEntries.GroupBy(b => b.Category).OrderBy(c => c.Key))
            {
                ChangelogEntries.Add(new OsuSpriteText
                {
                    Text   = categoryEntries.Key,
                    Font   = OsuFont.GetFont(weight: FontWeight.Bold, size: 24),
                    Margin = new MarginPadding {
                        Top = 35, Bottom = 15
                    },
                });

                var fontLarge  = OsuFont.GetFont(size: 18);
                var fontMedium = OsuFont.GetFont(size: 14);
                var fontSmall  = OsuFont.GetFont(size: 12);

                foreach (APIChangelogEntry entry in categoryEntries)
                {
                    LinkFlowContainer title = new LinkFlowContainer
                    {
                        Direction        = FillDirection.Full,
                        RelativeSizeAxes = Axes.X,
                        AutoSizeAxes     = Axes.Y,
                        Margin           = new MarginPadding {
                            Vertical = 5
                        },
                    };

                    title.AddIcon(FontAwesome.Solid.Check, t =>
                    {
                        t.Font    = fontSmall;
                        t.Padding = new MarginPadding {
                            Left = -17, Right = 5
                        };
                    });

                    title.AddText(entry.Title, t => { t.Font = fontLarge; });

                    if (!string.IsNullOrEmpty(entry.Repository))
                    {
                        title.AddText(" (", t => t.Font = fontLarge);
                        title.AddLink($"{entry.Repository.Replace("ppy/", "")}#{entry.GithubPullRequestId}", entry.GithubUrl, Online.Chat.LinkAction.External,
                                      creationParameters: t => { t.Font = fontLarge; });
                        title.AddText(")", t => t.Font = fontLarge);
                    }

                    title.AddText(" by ", t => t.Font = fontMedium);

                    if (entry.GithubUser.UserId != null)
                    {
                        title.AddUserLink(new User
                        {
                            Username = entry.GithubUser.OsuUsername,
                            Id       = entry.GithubUser.UserId.Value
                        }, t => t.Font = fontMedium);
                    }
                    else if (entry.GithubUser.GithubUrl != null)
                    {
                        title.AddLink(entry.GithubUser.DisplayName, entry.GithubUser.GithubUrl, Online.Chat.LinkAction.External, null, null, t => t.Font = fontMedium);
                    }
                    else
                    {
                        title.AddText(entry.GithubUser.DisplayName, t => t.Font = fontSmall);
                    }

                    ChangelogEntries.Add(title);

                    if (!string.IsNullOrEmpty(entry.MessageHtml))
                    {
                        TextFlowContainer message = new TextFlowContainer
                        {
                            AutoSizeAxes     = Axes.Y,
                            RelativeSizeAxes = Axes.X,
                        };

                        // todo: use markdown parsing once API returns markdown
                        message.AddText(Regex.Replace(entry.MessageHtml, @"<(.|\n)*?>", string.Empty), t =>
                        {
                            t.Font   = fontSmall;
                            t.Colour = new Color4(235, 184, 254, 255);
                        });

                        ChangelogEntries.Add(message);
                    }
                }
            }
        }
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)
        {
            foreach (var categoryEntries in Build.ChangelogEntries.GroupBy(b => b.Category).OrderBy(c => c.Key))
            {
                ChangelogEntries.Add(new OsuSpriteText
                {
                    Text   = categoryEntries.Key,
                    Font   = OsuFont.GetFont(weight: FontWeight.Bold, size: 24),
                    Margin = new MarginPadding {
                        Top = 35, Bottom = 15
                    },
                });

                var fontLarge  = OsuFont.GetFont(size: 18);
                var fontMedium = OsuFont.GetFont(size: 14);
                var fontSmall  = OsuFont.GetFont(size: 12);

                foreach (APIChangelogEntry entry in categoryEntries)
                {
                    LinkFlowContainer title = new LinkFlowContainer
                    {
                        Direction        = FillDirection.Full,
                        RelativeSizeAxes = Axes.X,
                        AutoSizeAxes     = Axes.Y,
                        Margin           = new MarginPadding {
                            Vertical = 5
                        },
                    };

                    var entryColour = entry.Major ? colours.YellowLight : Color4.White;

                    title.AddIcon(entry.Type == ChangelogEntryType.Fix ? FontAwesome.Solid.Check : FontAwesome.Solid.Plus, t =>
                    {
                        t.Font    = fontSmall;
                        t.Colour  = entryColour;
                        t.Padding = new MarginPadding {
                            Left = -17, Right = 5
                        };
                    });

                    title.AddText(entry.Title, t =>
                    {
                        t.Font   = fontLarge;
                        t.Colour = entryColour;
                    });

                    if (!string.IsNullOrEmpty(entry.Repository))
                    {
                        title.AddText(" (", t =>
                        {
                            t.Font   = fontLarge;
                            t.Colour = entryColour;
                        });
                        title.AddLink($"{entry.Repository.Replace("ppy/", "")}#{entry.GithubPullRequestId}", entry.GithubUrl, Online.Chat.LinkAction.External,
                                      creationParameters: t =>
                        {
                            t.Font   = fontLarge;
                            t.Colour = entryColour;
                        });
                        title.AddText(")", t =>
                        {
                            t.Font   = fontLarge;
                            t.Colour = entryColour;
                        });
                    }

                    title.AddText(" by ", t =>
                    {
                        t.Font   = fontMedium;
                        t.Colour = entryColour;
                    });

                    if (entry.GithubUser.UserId != null)
                    {
                        title.AddUserLink(new User
                        {
                            Username = entry.GithubUser.OsuUsername,
                            Id       = entry.GithubUser.UserId.Value
                        }, t =>
                        {
                            t.Font   = fontMedium;
                            t.Colour = entryColour;
                        });
                    }
                    else if (entry.GithubUser.GithubUrl != null)
                    {
                        title.AddLink(entry.GithubUser.DisplayName, entry.GithubUser.GithubUrl, Online.Chat.LinkAction.External, null, null, t =>
                        {
                            t.Font   = fontMedium;
                            t.Colour = entryColour;
                        });
                    }
                    else
                    {
                        title.AddText(entry.GithubUser.DisplayName, t =>
                        {
                            t.Font   = fontSmall;
                            t.Colour = entryColour;
                        });
                    }

                    ChangelogEntries.Add(title);

                    if (!string.IsNullOrEmpty(entry.MessageHtml))
                    {
                        TextFlowContainer message = new TextFlowContainer
                        {
                            AutoSizeAxes     = Axes.Y,
                            RelativeSizeAxes = Axes.X,
                        };

                        // todo: use markdown parsing once API returns markdown
                        message.AddText(WebUtility.HtmlDecode(Regex.Replace(entry.MessageHtml, @"<(.|\n)*?>", string.Empty)), t =>
                        {
                            t.Font   = fontSmall;
                            t.Colour = new Color4(235, 184, 254, 255);
                        });

                        ChangelogEntries.Add(message);
                    }
                }
            }
        }
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("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 #9
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 #10
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 #11
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);
        }