// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Rulesets.Mania.Skinning; using osu.Game.Skinning; namespace osu.Game.Rulesets.Mania.UI { /// /// A which flows its contents according to the s in a . /// Content can be added to individual columns via . /// /// The type of content in each column. public class ColumnFlow : CompositeDrawable where TContent : Drawable { /// /// All contents added to this . /// public IReadOnlyList Content => columns.Children.Select(c => c.Count == 0 ? null : (TContent)c.Child).ToList(); private readonly FillFlowContainer columns; private readonly StageDefinition stageDefinition; public ColumnFlow(StageDefinition stageDefinition) { this.stageDefinition = stageDefinition; AutoSizeAxes = Axes.X; InternalChild = columns = new FillFlowContainer { RelativeSizeAxes = Axes.Y, AutoSizeAxes = Axes.X, Direction = FillDirection.Horizontal, }; for (int i = 0; i < stageDefinition.Columns; i++) columns.Add(new Container { RelativeSizeAxes = Axes.Y }); } private ISkinSource currentSkin; [BackgroundDependencyLoader] private void load(ISkinSource skin) { currentSkin = skin; skin.SourceChanged += onSkinChanged; onSkinChanged(); } private void onSkinChanged() { for (int i = 0; i < stageDefinition.Columns; i++) { if (i > 0) { float spacing = currentSkin.GetConfig( new ManiaSkinConfigurationLookup(LegacyManiaSkinConfigurationLookups.ColumnSpacing, i - 1)) ?.Value ?? Stage.COLUMN_SPACING; columns[i].Margin = new MarginPadding { Left = spacing }; } float? width = currentSkin.GetConfig( new ManiaSkinConfigurationLookup(LegacyManiaSkinConfigurationLookups.ColumnWidth, i)) ?.Value; if (width == null) // only used by default skin (legacy skins get defaults set in LegacyManiaSkinConfiguration) columns[i].Width = stageDefinition.IsSpecialColumn(i) ? Column.SPECIAL_COLUMN_WIDTH : Column.COLUMN_WIDTH; else columns[i].Width = width.Value; } } /// /// Sets the content of one of the columns of this . /// /// The index of the column to set the content of. /// The content. public void SetContentForColumn(int column, TContent content) => columns[column].Child = content; public new MarginPadding Padding { get => base.Padding; set => base.Padding = value; } protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); if (currentSkin != null) currentSkin.SourceChanged -= onSkinChanged; } } }