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); }
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."); }
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(); }
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); } } } }
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); }); }
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); }
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); } } } }
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); }
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); }
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; }
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); }