Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ppy
GitHub Repository: ppy/osu
Path: blob/master/osu.Game/Screens/Play/LetterboxOverlay.cs
2264 views
// Copyright (c) ppy Pty Ltd <[email protected]>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Game.Utils;
using osuTK.Graphics;

namespace osu.Game.Screens.Play
{
    public partial class LetterboxOverlay : CompositeDrawable
    {
        public required BreakTracker BreakTracker { get; init; }

        private readonly Container fadeContainer;

        private readonly IBindable<Period?> currentPeriod = new Bindable<Period?>();

        public LetterboxOverlay()
        {
            RelativeSizeAxes = Axes.Both;
            const float letterbox_height = 0.125f;

            InternalChild = fadeContainer = new Container
            {
                RelativeSizeAxes = Axes.Both,
                Alpha = 0,
                Children = new Drawable[]
                {
                    new Box
                    {
                        Anchor = Anchor.TopLeft,
                        Origin = Anchor.TopLeft,
                        RelativeSizeAxes = Axes.Both,
                        Height = letterbox_height,
                        Colour = Color4.Black,
                    },
                    new Box
                    {
                        Anchor = Anchor.BottomLeft,
                        Origin = Anchor.BottomLeft,
                        RelativeSizeAxes = Axes.Both,
                        Height = letterbox_height,
                        Colour = Color4.Black,
                    }
                }
            };
        }

        protected override void LoadComplete()
        {
            base.LoadComplete();

            currentPeriod.BindTo(BreakTracker.CurrentPeriod);
            currentPeriod.BindValueChanged(updateDisplay, true);
        }

        public override bool RemoveCompletedTransforms => false;

        private void updateDisplay(ValueChangedEvent<Period?> period)
        {
            FinishTransforms(true);

            if (period.NewValue == null)
                return;

            var b = period.NewValue.Value;

            using (BeginAbsoluteSequence(b.Start))
            {
                fadeContainer.FadeInFromZero(BreakOverlay.BREAK_FADE_DURATION);
                using (BeginDelayedSequence(b.Duration - BreakOverlay.BREAK_FADE_DURATION))
                    fadeContainer.FadeOut(BreakOverlay.BREAK_FADE_DURATION);
            }
        }
    }
}