diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneOverlayHeader.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneOverlayHeader.cs index b015007f69..814a9ebf10 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneOverlayHeader.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneOverlayHeader.cs @@ -22,7 +22,6 @@ namespace osu.Game.Tests.Visual.UserInterface public override IReadOnlyList RequiredTypes => new[] { typeof(OverlayHeader), - typeof(ControllableOverlayHeader<>), typeof(TabControlOverlayHeader<>), typeof(BreadcrumbControlOverlayHeader), typeof(TestNoControlHeader), @@ -139,9 +138,9 @@ namespace osu.Game.Tests.Visual.UserInterface public TestBreadcrumbControlHeader(OverlayColourScheme colourScheme) : base(colourScheme) { - BreadcrumbControl.AddItem("tab1"); - BreadcrumbControl.AddItem("tab2"); - BreadcrumbControl.Current.Value = "tab2"; + TabControl.AddItem("tab1"); + TabControl.AddItem("tab2"); + TabControl.Current.Value = "tab2"; } } diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs index 6a7998d5fb..ca18ab83a0 100644 --- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs +++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs @@ -17,6 +17,7 @@ using osu.Framework.Graphics.UserInterface; using osu.Framework.Input.Events; using osu.Framework.Utils; using osu.Game.Graphics.Sprites; +using osu.Framework.Extensions.IEnumerableExtensions; namespace osu.Game.Graphics.UserInterface { @@ -75,6 +76,7 @@ namespace osu.Game.Graphics.UserInterface dropdown.AccentColour = value; foreach (var i in TabContainer.Children.OfType()) i.AccentColour = value; + InternalChildren.OfType().ForEach(c => c.AccentColour = value); } } diff --git a/osu.Game/Overlays/BreadcrumbControlOverlayHeader.cs b/osu.Game/Overlays/BreadcrumbControlOverlayHeader.cs index 2456568252..bc9108929d 100644 --- a/osu.Game/Overlays/BreadcrumbControlOverlayHeader.cs +++ b/osu.Game/Overlays/BreadcrumbControlOverlayHeader.cs @@ -1,7 +1,6 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics; @@ -9,23 +8,15 @@ using osu.Game.Graphics.UserInterface; namespace osu.Game.Overlays { - public abstract class BreadcrumbControlOverlayHeader : ControllableOverlayHeader + public abstract class BreadcrumbControlOverlayHeader : TabControlOverlayHeader { - protected OverlayHeaderBreadcrumbControl BreadcrumbControl; - - protected override TabControl CreateTabControl() => BreadcrumbControl = new OverlayHeaderBreadcrumbControl(); + protected override OsuTabControl CreateTabControl() => new OverlayHeaderBreadcrumbControl(); protected BreadcrumbControlOverlayHeader(OverlayColourScheme colourScheme) : base(colourScheme) { } - [BackgroundDependencyLoader] - private void load(OsuColour colours) - { - BreadcrumbControl.AccentColour = colours.ForOverlayElement(ColourScheme, 1, 0.75f); - } - public class OverlayHeaderBreadcrumbControl : BreadcrumbControl { public OverlayHeaderBreadcrumbControl() diff --git a/osu.Game/Overlays/Changelog/ChangelogHeader.cs b/osu.Game/Overlays/Changelog/ChangelogHeader.cs index d5e0890b4d..484a800992 100644 --- a/osu.Game/Overlays/Changelog/ChangelogHeader.cs +++ b/osu.Game/Overlays/Changelog/ChangelogHeader.cs @@ -28,8 +28,8 @@ namespace osu.Game.Overlays.Changelog public ChangelogHeader() : base(OverlayColourScheme.Purple) { - BreadcrumbControl.AddItem(listing_string); - BreadcrumbControl.Current.ValueChanged += e => + TabControl.AddItem(listing_string); + TabControl.Current.ValueChanged += e => { if (e.NewValue == listing_string) ListingSelected?.Invoke(); @@ -49,12 +49,12 @@ namespace osu.Game.Overlays.Changelog private void showBuild(ValueChangedEvent e) { if (e.OldValue != null) - BreadcrumbControl.RemoveItem(e.OldValue.ToString()); + TabControl.RemoveItem(e.OldValue.ToString()); if (e.NewValue != null) { - BreadcrumbControl.AddItem(e.NewValue.ToString()); - BreadcrumbControl.Current.Value = e.NewValue.ToString(); + TabControl.AddItem(e.NewValue.ToString()); + TabControl.Current.Value = e.NewValue.ToString(); Streams.Current.Value = Streams.Items.FirstOrDefault(s => s.Name == e.NewValue.UpdateStream.Name); @@ -62,7 +62,7 @@ namespace osu.Game.Overlays.Changelog } else { - BreadcrumbControl.Current.Value = listing_string; + TabControl.Current.Value = listing_string; Streams.Current.Value = null; title.Version = null; } diff --git a/osu.Game/Overlays/ControllableOverlayHeader.cs b/osu.Game/Overlays/ControllableOverlayHeader.cs deleted file mode 100644 index de0431340f..0000000000 --- a/osu.Game/Overlays/ControllableOverlayHeader.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using osu.Framework.Allocation; -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Shapes; -using osu.Framework.Graphics.UserInterface; -using osu.Game.Graphics; -using osuTK.Graphics; - -namespace osu.Game.Overlays -{ - /// - /// which contains . - /// - /// The type of item to be represented by tabs in . - public abstract class ControllableOverlayHeader : OverlayHeader - { - private readonly Box controlBackground; - - protected ControllableOverlayHeader(OverlayColourScheme colourScheme) - : base(colourScheme) - { - HeaderInfo.Add(new Container - { - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, - Children = new Drawable[] - { - controlBackground = new Box - { - RelativeSizeAxes = Axes.Both, - Colour = Color4.Gray, - }, - CreateTabControl().With(control => control.Margin = new MarginPadding { Left = UserProfileOverlay.CONTENT_X_MARGIN }) - } - }); - } - - [BackgroundDependencyLoader] - private void load(OsuColour colours) - { - controlBackground.Colour = colours.ForOverlayElement(ColourScheme, 0.2f, 0.2f); - } - - protected abstract TabControl CreateTabControl(); - } -} diff --git a/osu.Game/Overlays/News/NewsHeader.cs b/osu.Game/Overlays/News/NewsHeader.cs index 03dc64b3bd..7d9fce11f1 100644 --- a/osu.Game/Overlays/News/NewsHeader.cs +++ b/osu.Game/Overlays/News/NewsHeader.cs @@ -25,9 +25,9 @@ namespace osu.Game.Overlays.News public NewsHeader() : base(OverlayColourScheme.Purple) { - BreadcrumbControl.AddItem(front_page_string); + TabControl.AddItem(front_page_string); - BreadcrumbControl.Current.ValueChanged += e => + TabControl.Current.ValueChanged += e => { if (e.NewValue == front_page_string) ShowFrontPage?.Invoke(); @@ -39,18 +39,18 @@ namespace osu.Game.Overlays.News private void showPost(ValueChangedEvent e) { if (e.OldValue != null) - BreadcrumbControl.RemoveItem(e.OldValue); + TabControl.RemoveItem(e.OldValue); if (e.NewValue != null) { - BreadcrumbControl.AddItem(e.NewValue); - BreadcrumbControl.Current.Value = e.NewValue; + TabControl.AddItem(e.NewValue); + TabControl.Current.Value = e.NewValue; title.IsReadingPost = true; } else { - BreadcrumbControl.Current.Value = front_page_string; + TabControl.Current.Value = front_page_string; title.IsReadingPost = false; } } diff --git a/osu.Game/Overlays/OverlayTabControl.cs b/osu.Game/Overlays/OverlayTabControl.cs index 000cc4b113..a58ac87a11 100644 --- a/osu.Game/Overlays/OverlayTabControl.cs +++ b/osu.Game/Overlays/OverlayTabControl.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input.Events; @@ -15,13 +16,7 @@ namespace osu.Game.Overlays { public abstract class OverlayTabControl : OsuTabControl { - private readonly Box bar; - - public new Color4 AccentColour - { - get => base.AccentColour; - set => base.AccentColour = bar.Colour = value; - } + private readonly Bar bar; protected float BarHeight { @@ -33,7 +28,7 @@ namespace osu.Game.Overlays TabContainer.Masking = false; TabContainer.Spacing = new Vector2(15, 0); - AddInternal(bar = new Box + AddInternal(bar = new Bar { RelativeSizeAxes = Axes.X, Height = 2, @@ -143,5 +138,24 @@ namespace osu.Game.Overlays Text.FadeColour(AccentColour, 120, Easing.InQuad); } } + + private class Bar : CompositeDrawable, IHasAccentColour + { + public Color4 AccentColour + { + get => background.Colour; + set => background.Colour = value; + } + + private readonly Box background; + + public Bar() + { + AddInternal(background = new Box + { + RelativeSizeAxes = Axes.Both + }); + } + } } } diff --git a/osu.Game/Overlays/TabControlOverlayHeader.cs b/osu.Game/Overlays/TabControlOverlayHeader.cs index a4bf423e46..defd6d6b05 100644 --- a/osu.Game/Overlays/TabControlOverlayHeader.cs +++ b/osu.Game/Overlays/TabControlOverlayHeader.cs @@ -5,29 +5,51 @@ using System; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics; +using osu.Game.Graphics.UserInterface; using osuTK; namespace osu.Game.Overlays { - public abstract class TabControlOverlayHeader : ControllableOverlayHeader + /// + /// which contains . + /// + /// The type of item to be represented by tabs in . + public abstract class TabControlOverlayHeader : OverlayHeader { - protected OverlayHeaderTabControl TabControl; + protected OsuTabControl TabControl; - protected override TabControl CreateTabControl() => TabControl = new OverlayHeaderTabControl(); + private readonly Box controlBackground; protected TabControlOverlayHeader(OverlayColourScheme colourScheme) : base(colourScheme) { + HeaderInfo.Add(new Container + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Children = new Drawable[] + { + controlBackground = new Box + { + RelativeSizeAxes = Axes.Both, + }, + TabControl = CreateTabControl().With(control => control.Margin = new MarginPadding { Left = UserProfileOverlay.CONTENT_X_MARGIN }) + } + }); } [BackgroundDependencyLoader] private void load(OsuColour colours) { TabControl.AccentColour = colours.ForOverlayElement(ColourScheme, 1, 0.75f); + controlBackground.Colour = colours.ForOverlayElement(ColourScheme, 0.2f, 0.2f); } + protected virtual OsuTabControl CreateTabControl() => new OverlayHeaderTabControl(); + public class OverlayHeaderTabControl : OverlayTabControl { public OverlayHeaderTabControl() @@ -38,18 +60,9 @@ namespace osu.Game.Overlays Anchor = Anchor.BottomLeft; Origin = Anchor.BottomLeft; Height = 35; - - if (typeof(T).IsEnum) - { - foreach (var val in (T[])Enum.GetValues(typeof(T))) - AddItem(val); - } } - protected override TabItem CreateTabItem(T value) => new OverlayHeaderTabItem(value) - { - AccentColour = AccentColour, - }; + protected override TabItem CreateTabItem(T value) => new OverlayHeaderTabItem(value); protected override TabFillFlowContainer CreateTabFlow() => new TabFillFlowContainer {