// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using System.Collections; using System.Collections.Generic; using osu.Framework.Audio; using osu.Framework.Extensions.EnumExtensions; using osu.Framework.Graphics.Audio; using osu.Framework.Graphics.Effects; using osuTK; namespace osu.Framework.Graphics.Containers { /// /// A container which exposes audio adjustments via . /// /// /// This is a bare-minimal implementation of a container, so it may be required to be nested inside a for some use cases. /// /// The type of . public class AudioContainer : DrawableAudioWrapper, IContainerEnumerable, IContainerCollection, ICollection, IReadOnlyList where T : Drawable { private readonly Container container; public AudioContainer() : this(new Container()) { } private AudioContainer(Container container) : base(container) { this.container = container; } public override Vector2 Size { get => container.Size; set { base.Size = new Vector2( RelativeSizeAxes.HasFlagFast(Axes.X) ? 1 : value.X, RelativeSizeAxes.HasFlagFast(Axes.Y) ? 1 : value.Y); container.Size = value; } } public override Axes RelativeSizeAxes { get => container.RelativeSizeAxes; set { base.RelativeSizeAxes = value; container.RelativeSizeAxes = value; } } public new Axes AutoSizeAxes { get => container.AutoSizeAxes; set { base.AutoSizeAxes = value; container.AutoSizeAxes = value; } } public new EdgeEffectParameters EdgeEffect { get => base.EdgeEffect; set => base.EdgeEffect = value; } public new Vector2 RelativeChildSize { get => container.RelativeChildSize; set => container.RelativeChildSize = value; } public new Vector2 RelativeChildOffset { get => container.RelativeChildOffset; set => container.RelativeChildOffset = value; } public Container.Enumerator GetEnumerator() => container.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); public IReadOnlyList Children { get => container.Children; set => container.Children = value; } public int RemoveAll(Predicate match) => container.RemoveAll(match); public T Child { get => container.Child; set => container.Child = value; } public IEnumerable ChildrenEnumerable { set => container.ChildrenEnumerable = value; } public void Add(T drawable) { container.Add(drawable); } public void Clear() { container.Clear(); } public bool Contains(T item) => container.Contains(item); public void CopyTo(T[] array, int arrayIndex) { container.CopyTo(array, arrayIndex); } public void AddRange(IEnumerable collection) { container.AddRange(collection); } public bool Remove(T drawable) => container.Remove(drawable); int ICollection.Count => container.Count; public bool IsReadOnly => container.IsReadOnly; public void RemoveRange(IEnumerable range) { container.RemoveRange(range); } int IReadOnlyCollection.Count => container.Count; public T this[int index] => container[index]; } /// /// A container which exposes audio adjustments via . /// /// /// This is a bare-minimal implementation of a container, so it may be required to be nested inside a for some use cases. /// public class AudioContainer : AudioContainer { } }