2019-01-24 08:43:03 +00:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-04-13 09:19:50 +00:00
using osu.Game.Online.Chat ;
using System ;
using System.Linq ;
using osu.Framework.Allocation ;
using osu.Framework.Graphics.Sprites ;
using System.Collections.Generic ;
2018-12-26 09:05:12 +00:00
using osu.Framework.Graphics ;
2019-04-05 05:15:36 +00:00
using osu.Game.Users ;
2018-04-13 09:19:50 +00:00
namespace osu.Game.Graphics.Containers
{
public class LinkFlowContainer : OsuTextFlowContainer
{
public LinkFlowContainer ( Action < SpriteText > defaultCreationParameters = null )
: base ( defaultCreationParameters )
{
}
2019-11-27 15:13:44 +00:00
[Resolved(CanBeNull = true)]
private OsuGame game { get ; set ; }
2018-04-13 09:19:50 +00:00
public void AddLinks ( string text , List < Link > links )
{
if ( string . IsNullOrEmpty ( text ) | | links = = null )
return ;
if ( links . Count = = 0 )
{
AddText ( text ) ;
return ;
}
int previousLinkEnd = 0 ;
2019-04-01 03:16:05 +00:00
2018-04-13 09:19:50 +00:00
foreach ( var link in links )
{
2019-12-14 12:54:22 +00:00
AddText ( text [ previousLinkEnd . . link . Index ] ) ;
2021-02-12 06:18:16 +00:00
string displayText = text . Substring ( link . Index , link . Length ) ;
string linkArgument = link . Argument ? ? link . Url ;
string tooltip = displayText = = link . Url ? null : link . Url ;
AddLink ( displayText , link . Action , linkArgument , tooltip ) ;
2018-04-13 09:19:50 +00:00
previousLinkEnd = link . Index + link . Length ;
}
AddText ( text . Substring ( previousLinkEnd ) ) ;
}
2019-11-01 02:40:51 +00:00
public void AddLink ( string text , string url , Action < SpriteText > creationParameters = null ) = >
createLink ( AddText ( text , creationParameters ) , new LinkDetails ( LinkAction . External , url ) , url ) ;
2018-12-26 09:05:12 +00:00
2019-11-01 02:40:51 +00:00
public void AddLink ( string text , Action action , string tooltipText = null , Action < SpriteText > creationParameters = null )
= > createLink ( AddText ( text , creationParameters ) , new LinkDetails ( LinkAction . Custom , null ) , tooltipText , action ) ;
2018-12-26 09:05:12 +00:00
2019-11-01 02:40:51 +00:00
public void AddLink ( string text , LinkAction action , string argument , string tooltipText = null , Action < SpriteText > creationParameters = null )
2021-02-12 06:18:16 +00:00
= > createLink ( AddText ( text , creationParameters ) , new LinkDetails ( action , argument ) , tooltipText ) ;
2019-11-01 02:40:51 +00:00
public void AddLink ( IEnumerable < SpriteText > text , LinkAction action = LinkAction . External , string linkArgument = null , string tooltipText = null )
2018-12-26 09:05:12 +00:00
{
foreach ( var t in text )
AddArbitraryDrawable ( t ) ;
2019-11-01 02:40:51 +00:00
createLink ( text , new LinkDetails ( action , linkArgument ) , tooltipText ) ;
2018-12-26 09:05:12 +00:00
}
2019-11-01 02:40:51 +00:00
public void AddUserLink ( User user , Action < SpriteText > creationParameters = null )
2020-01-14 19:26:54 +00:00
= > createLink ( AddText ( user . Username , creationParameters ) , new LinkDetails ( LinkAction . OpenUserProfile , user . Id . ToString ( ) ) , "view profile" ) ;
2019-04-05 05:15:36 +00:00
2019-11-01 02:40:51 +00:00
private void createLink ( IEnumerable < Drawable > drawables , LinkDetails link , string tooltipText , Action action = null )
2018-04-13 09:19:50 +00:00
{
2018-12-26 09:05:12 +00:00
AddInternal ( new DrawableLinkCompiler ( drawables . OfType < SpriteText > ( ) . ToList ( ) )
2018-04-13 09:19:50 +00:00
{
2019-01-08 09:58:44 +00:00
RelativeSizeAxes = Axes . Both ,
2019-11-01 02:40:51 +00:00
TooltipText = tooltipText ,
Action = ( ) = >
2018-04-13 09:19:50 +00:00
{
2019-11-01 02:40:51 +00:00
if ( action ! = null )
action ( ) ;
else
2019-11-27 15:13:44 +00:00
game ? . HandleLink ( link ) ;
2019-11-01 02:40:51 +00:00
} ,
2018-04-13 09:19:50 +00:00
} ) ;
}
2019-01-08 09:58:44 +00:00
2019-01-10 05:55:36 +00:00
// We want the compilers to always be visible no matter where they are, so RelativeSizeAxes is used.
// However due to https://github.com/ppy/osu-framework/issues/2073, it's possible for the compilers to be relative size in the flow's auto-size axes - an unsupported operation.
// Since the compilers don't display any content and don't affect the layout, it's simplest to exclude them from the flow.
2019-01-08 09:58:44 +00:00
public override IEnumerable < Drawable > FlowingChildren = > base . FlowingChildren . Where ( c = > ! ( c is DrawableLinkCompiler ) ) ;
2018-04-13 09:19:50 +00:00
}
}