2019-12-28 09:57:41 +08: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.
2022-06-17 15:37:17 +08:00
#nullable disable
2020-01-21 11:03:48 +08:00
using JetBrains.Annotations ;
2020-01-16 03:41:22 +08:00
using osu.Framework.Allocation ;
2020-02-04 01:20:35 +08:00
using osu.Framework.Bindables ;
2020-10-28 16:19:01 +08:00
using osu.Framework.Extensions ;
2022-06-22 09:31:09 +08:00
using osu.Framework.Extensions.LocalisationExtensions ;
2020-01-03 14:01:42 +08:00
using osu.Framework.Graphics ;
using osu.Framework.Graphics.Containers ;
2020-01-21 11:00:12 +08:00
using osu.Framework.Graphics.Shapes ;
2019-12-31 23:12:03 +08:00
using osu.Framework.Graphics.UserInterface ;
2020-01-03 14:01:42 +08:00
using osu.Game.Graphics ;
2020-01-21 11:00:12 +08:00
using osu.Game.Graphics.UserInterface ;
2019-12-31 23:12:03 +08:00
2019-12-28 09:57:41 +08:00
namespace osu.Game.Overlays
{
2020-01-21 11:00:12 +08:00
/// <summary>
2020-01-24 15:24:44 +08:00
/// An overlay header which contains a <see cref="OsuTabControl{T}"/>.
2020-01-21 11:00:12 +08:00
/// </summary>
2020-01-24 15:24:44 +08:00
/// <typeparam name="T">The type of item to be represented by tabs.</typeparam>
2020-02-04 05:43:04 +08:00
public abstract partial class TabControlOverlayHeader < T > : OverlayHeader , IHasCurrentValue < T >
2019-12-28 09:57:41 +08:00
{
2022-12-31 01:44:03 +08:00
protected OsuTabControl < T > TabControl { get ; }
protected Container TabControlContainer { get ; }
2019-12-31 23:12:03 +08:00
2020-03-26 22:43:48 +08:00
private readonly Box controlBackground ;
2020-02-04 05:43:04 +08:00
private readonly BindableWithCurrent < T > current = new BindableWithCurrent < T > ( ) ;
public Bindable < T > Current
{
get = > current . Current ;
set = > current . Current = value ;
}
2020-07-22 01:02:22 +08:00
protected new float ContentSidePadding
{
get = > base . ContentSidePadding ;
set
{
base . ContentSidePadding = value ;
2022-12-31 01:44:03 +08:00
TabControlContainer . Padding = new MarginPadding { Horizontal = value } ;
2020-07-22 01:02:22 +08:00
}
}
2020-01-26 21:35:07 +08:00
protected TabControlOverlayHeader ( )
2020-01-16 03:41:22 +08:00
{
2020-01-21 11:00:12 +08:00
HeaderInfo . Add ( new Container
{
RelativeSizeAxes = Axes . X ,
AutoSizeAxes = Axes . Y ,
Children = new Drawable [ ]
{
controlBackground = new Box
{
RelativeSizeAxes = Axes . Both ,
} ,
2022-12-31 01:44:03 +08:00
TabControlContainer = new Container
2020-02-04 01:20:35 +08:00
{
2020-07-22 01:02:22 +08:00
RelativeSizeAxes = Axes . X ,
AutoSizeAxes = Axes . Y ,
Padding = new MarginPadding { Horizontal = ContentSidePadding } ,
2023-01-14 04:50:12 +08:00
Children = new [ ]
2020-07-22 01:02:22 +08:00
{
2023-01-14 04:50:12 +08:00
TabControl = CreateTabControl ( ) . With ( control = >
{
control . Current = Current ;
} ) ,
CreateTabControlContent ( ) . With ( content = >
{
content . Anchor = Anchor . CentreRight ;
content . Origin = Anchor . CentreRight ;
} ) ,
}
2020-07-22 01:02:22 +08:00
}
2020-01-21 11:00:12 +08:00
}
} ) ;
2020-01-16 03:41:22 +08:00
}
[BackgroundDependencyLoader]
2020-01-24 17:33:34 +08:00
private void load ( OverlayColourProvider colourProvider )
2020-01-16 03:41:22 +08:00
{
2020-01-26 21:35:07 +08:00
controlBackground . Colour = colourProvider . Dark4 ;
2020-01-16 03:41:22 +08:00
}
2020-01-21 11:03:48 +08:00
[NotNull]
2020-01-21 11:00:12 +08:00
protected virtual OsuTabControl < T > CreateTabControl ( ) = > new OverlayHeaderTabControl ( ) ;
2023-01-14 04:50:12 +08:00
/// <summary>
/// Creates a <see cref="Drawable"/> on the opposite side of the <see cref="OsuTabControl{T}"/>. Used mostly to create <see cref="OverlayRulesetSelector"/>.
/// </summary>
[NotNull]
protected virtual Drawable CreateTabControlContent ( ) = > Empty ( ) ;
2020-01-08 05:41:52 +08:00
public partial class OverlayHeaderTabControl : OverlayTabControl < T >
2020-01-03 14:01:42 +08:00
{
2020-03-26 22:43:48 +08:00
private const float bar_height = 1 ;
2020-01-03 14:01:42 +08:00
public OverlayHeaderTabControl ( )
{
RelativeSizeAxes = Axes . None ;
AutoSizeAxes = Axes . X ;
Anchor = Anchor . BottomLeft ;
Origin = Anchor . BottomLeft ;
2020-03-26 22:43:48 +08:00
Height = 47 ;
BarHeight = bar_height ;
2020-01-03 14:01:42 +08:00
}
2020-01-21 11:00:12 +08:00
protected override TabItem < T > CreateTabItem ( T value ) = > new OverlayHeaderTabItem ( value ) ;
2020-01-03 14:01:42 +08:00
protected override TabFillFlowContainer CreateTabFlow ( ) = > new TabFillFlowContainer
{
RelativeSizeAxes = Axes . Y ,
AutoSizeAxes = Axes . X ,
Direction = FillDirection . Horizontal ,
} ;
private partial class OverlayHeaderTabItem : OverlayTabItem
{
2020-01-08 05:41:52 +08:00
public OverlayHeaderTabItem ( T value )
2020-01-03 14:01:42 +08:00
: base ( value )
{
2022-07-01 16:30:51 +08:00
Text . Text = value . GetLocalisableDescription ( ) . ToLower ( ) ;
2020-01-03 14:01:42 +08:00
Text . Font = OsuFont . GetFont ( size : 14 ) ;
2020-03-26 22:43:48 +08:00
Text . Margin = new MarginPadding { Vertical = 16.5f } ; // 15px padding + 1.5px line-height difference compensation
Bar . Margin = new MarginPadding { Bottom = bar_height } ;
2020-01-03 14:01:42 +08:00
}
}
}
2019-12-28 09:57:41 +08:00
}
}