Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ppy
GitHub Repository: ppy/osu
Path: blob/master/osu.Game/Tests/Visual/OnlinePlay/OnlinePlayTestSceneDependencies.cs
5236 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 System;
using System.Collections.Generic;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Game.Database;
using osu.Game.Overlays;
using osu.Game.Screens.OnlinePlay;

namespace osu.Game.Tests.Visual.OnlinePlay
{
    /// <summary>
    /// Contains the basic dependencies of online play test scenes.
    /// </summary>
    public class OnlinePlayTestSceneDependencies : IReadOnlyDependencyContainer, IOnlinePlayTestSceneDependencies
    {
        public OngoingOperationTracker OngoingOperationTracker { get; }
        public TestRoomRequestsHandler RequestsHandler { get; }
        public TestUserLookupCache UserLookupCache { get; }
        public BeatmapLookupCache BeatmapLookupCache { get; }

        /// <summary>
        /// All cached dependencies which are also <see cref="Drawable"/> components.
        /// </summary>
        public IReadOnlyList<Drawable> DrawableComponents => drawableComponents;

        private readonly List<Drawable> drawableComponents = new List<Drawable>();
        private readonly DependencyContainer dependencies;

        public OnlinePlayTestSceneDependencies()
        {
            RequestsHandler = new TestRoomRequestsHandler();
            OngoingOperationTracker = new OngoingOperationTracker();
            UserLookupCache = new TestUserLookupCache();
            BeatmapLookupCache = new BeatmapLookupCache();

            dependencies = new DependencyContainer();

            CacheAs(RequestsHandler);
            CacheAs(OngoingOperationTracker);
            CacheAs(new OverlayColourProvider(OverlayColourScheme.Plum));
            CacheAs<UserLookupCache>(UserLookupCache);
            CacheAs(BeatmapLookupCache);
        }

        public object? Get(Type type)
            => dependencies.Get(type);

        public object? Get(Type type, CacheInfo info)
            => dependencies.Get(type, info);

        public void Inject<T>(T instance)
            where T : class, IDependencyInjectionCandidate
            => dependencies.Inject(instance);

        protected void Cache(object instance)
        {
            dependencies.Cache(instance);
            if (instance is Drawable drawable)
                drawableComponents.Add(drawable);
        }

        protected void CacheAs<T>(T instance)
            where T : class
        {
            dependencies.CacheAs(instance);
            if (instance is Drawable drawable)
                drawableComponents.Add(drawable);
        }
    }
}