2019-02-15 15:17:01 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2022-06-17 15:37:17 +08:00
#nullable disable
2019-02-21 14:24:26 +08:00
using System.Threading ;
2019-02-15 15:38:27 +08:00
using NUnit.Framework ;
2019-02-21 14:24:26 +08:00
using osu.Framework.Allocation ;
2019-05-31 13:40:53 +08:00
using osu.Framework.Audio ;
2019-02-22 19:44:02 +08:00
using osu.Framework.Bindables ;
2022-01-03 16:02:15 +08:00
using osu.Framework.Extensions ;
2019-02-21 14:24:26 +08:00
using osu.Framework.Graphics ;
2019-07-10 11:36:58 +08:00
using osu.Framework.Graphics.Sprites ;
2019-02-28 15:18:46 +08:00
using osu.Framework.Input.Events ;
using osu.Framework.Input.States ;
2019-02-27 13:15:45 +08:00
using osu.Framework.Platform ;
2019-02-19 18:44:26 +08:00
using osu.Framework.Screens ;
2022-01-11 22:01:17 +08:00
using osu.Framework.Utils ;
2019-02-19 18:44:26 +08:00
using osu.Game.Beatmaps ;
2019-02-22 10:41:28 +08:00
using osu.Game.Configuration ;
2019-02-15 15:17:01 +08:00
using osu.Game.Graphics ;
2019-02-22 19:34:51 +08:00
using osu.Game.Graphics.Containers ;
2019-05-21 13:13:52 +08:00
using osu.Game.Graphics.Sprites ;
2019-02-27 13:15:45 +08:00
using osu.Game.Rulesets ;
using osu.Game.Rulesets.Osu.Mods ;
2019-02-18 17:58:34 +08:00
using osu.Game.Scoring ;
2019-02-15 15:17:01 +08:00
using osu.Game.Screens ;
using osu.Game.Screens.Backgrounds ;
using osu.Game.Screens.Play ;
2019-02-21 14:24:26 +08:00
using osu.Game.Screens.Play.PlayerSettings ;
2020-03-17 16:43:16 +08:00
using osu.Game.Screens.Ranking ;
2019-02-27 13:15:45 +08:00
using osu.Game.Screens.Select ;
using osu.Game.Tests.Resources ;
2019-02-28 13:40:31 +08:00
using osuTK ;
2019-02-18 18:53:55 +08:00
using osuTK.Graphics ;
2019-02-15 15:17:01 +08:00
2019-03-25 00:02:36 +08:00
namespace osu.Game.Tests.Visual.Background
2019-02-15 15:17:01 +08:00
{
2019-02-15 15:38:27 +08:00
[TestFixture]
2022-01-13 00:34:29 +08:00
public partial class TestSceneUserDimBackgrounds : ScreenTestScene
2019-02-15 15:17:01 +08:00
{
2019-02-19 18:44:26 +08:00
private DummySongSelect songSelect ;
2019-03-13 15:47:03 +08:00
private TestPlayerLoader playerLoader ;
2020-03-05 10:25:07 +08:00
private LoadBlockingTestPlayer player ;
2019-02-27 13:15:45 +08:00
private BeatmapManager manager ;
private RulesetStore rulesets ;
2019-02-21 14:24:26 +08:00
2019-02-27 13:15:45 +08:00
[BackgroundDependencyLoader]
2019-05-31 13:40:53 +08:00
private void load ( GameHost host , AudioManager audio )
2019-02-27 13:15:45 +08:00
{
2022-02-16 16:13:51 +08:00
Dependencies . Cache ( rulesets = new RealmRulesetStore ( Realm ) ) ;
2022-07-28 15:19:05 +08:00
Dependencies . Cache ( manager = new BeatmapManager ( LocalStorage , Realm , null , audio , Resources , host , Beatmap . Default ) ) ;
2019-02-27 16:02:04 +08:00
Dependencies . Cache ( new OsuConfigManager ( LocalStorage ) ) ;
2022-01-25 11:58:15 +08:00
Dependencies . Cache ( Realm ) ;
2019-02-27 13:15:45 +08:00
2022-01-03 16:02:15 +08:00
manager . Import ( TestResources . GetQuickTestBeatmapForImport ( ) ) . WaitSafely ( ) ;
2019-03-20 19:47:25 +08:00
2019-02-27 13:15:45 +08:00
Beatmap . SetDefault ( ) ;
}
2022-01-13 00:34:29 +08:00
public override void SetUpSteps ( )
2019-02-27 16:02:04 +08:00
{
2022-01-13 00:34:29 +08:00
base . SetUpSteps ( ) ;
2020-01-31 18:10:44 +08:00
2022-01-13 00:34:29 +08:00
AddStep ( "push song select" , ( ) = > Stack . Push ( songSelect = new DummySongSelect ( ) ) ) ;
}
2019-02-27 13:15:45 +08:00
2021-04-15 04:22:38 +08:00
/// <summary>
/// User settings should always be ignored on song select screen.
/// </summary>
[Test]
public void TestUserSettingsIgnoredOnSongSelect ( )
{
setupUserSettings ( ) ;
2021-04-15 05:48:15 +08:00
AddUntilStep ( "Screen is undimmed" , ( ) = > songSelect . IsBackgroundUndimmed ( ) ) ;
AddUntilStep ( "Screen using background blur" , ( ) = > songSelect . IsBackgroundBlur ( ) ) ;
2021-04-15 04:22:38 +08:00
performFullSetup ( ) ;
AddStep ( "Exit to song select" , ( ) = > player . Exit ( ) ) ;
AddUntilStep ( "Screen is undimmed" , ( ) = > songSelect . IsBackgroundUndimmed ( ) ) ;
AddUntilStep ( "Screen using background blur" , ( ) = > songSelect . IsBackgroundBlur ( ) ) ;
}
2019-02-24 17:10:59 +08:00
/// <summary>
2019-03-13 15:47:03 +08:00
/// Check if <see cref="PlayerLoader"/> properly triggers the visual settings preview when a user hovers over the visual settings panel.
2019-02-24 17:10:59 +08:00
/// </summary>
[Test]
2020-05-26 10:30:36 +08:00
public void TestPlayerLoaderSettingsHover ( )
2019-02-24 17:10:59 +08:00
{
2019-02-28 17:26:41 +08:00
setupUserSettings ( ) ;
2020-03-05 10:25:07 +08:00
AddStep ( "Start player loader" , ( ) = > songSelect . Push ( playerLoader = new TestPlayerLoader ( player = new LoadBlockingTestPlayer { BlockLoad = true } ) ) ) ;
2019-03-19 16:24:26 +08:00
AddUntilStep ( "Wait for Player Loader to load" , ( ) = > playerLoader ? . IsLoaded ? ? false ) ;
2019-02-26 08:54:28 +08:00
AddAssert ( "Background retained from song select" , ( ) = > songSelect . IsBackgroundCurrent ( ) ) ;
2019-02-21 14:24:26 +08:00
AddStep ( "Trigger background preview" , ( ) = >
{
InputManager . MoveMouseTo ( playerLoader . ScreenPos ) ;
InputManager . MoveMouseTo ( playerLoader . VisualSettingsPos ) ;
} ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Screen is dimmed and blur applied" , ( ) = > songSelect . IsBackgroundDimmed ( ) & & songSelect . IsUserBlurApplied ( ) ) ;
2019-02-28 19:01:15 +08:00
AddStep ( "Stop background preview" , ( ) = > InputManager . MoveMouseTo ( playerLoader . ScreenPos ) ) ;
2021-01-04 17:32:23 +08:00
AddUntilStep ( "Screen is undimmed and user blur removed" , ( ) = > songSelect . IsBackgroundUndimmed ( ) & & songSelect . CheckBackgroundBlur ( playerLoader . ExpectedBackgroundBlur ) ) ;
2019-02-24 17:10:59 +08:00
}
2019-02-21 14:24:26 +08:00
2019-02-24 17:10:59 +08:00
/// <summary>
/// In the case of a user triggering the dim preview the instant player gets loaded, then moving the cursor off of the visual settings:
2019-03-13 15:47:03 +08:00
/// The OnHover of PlayerLoader will trigger, which could potentially cause visual settings to be unapplied unless checked for in PlayerLoader.
/// We need to check that in this scenario, the dim and blur is still properly applied after entering player.
2019-02-24 17:10:59 +08:00
/// </summary>
[Test]
2020-05-26 10:30:36 +08:00
public void TestPlayerLoaderTransition ( )
2019-02-24 17:10:59 +08:00
{
2019-02-28 19:01:15 +08:00
performFullSetup ( ) ;
2019-02-28 15:18:46 +08:00
AddStep ( "Trigger hover event" , ( ) = > playerLoader . TriggerOnHover ( ) ) ;
2019-02-26 08:54:28 +08:00
AddAssert ( "Background retained from song select" , ( ) = > songSelect . IsBackgroundCurrent ( ) ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Screen is dimmed and blur applied" , ( ) = > songSelect . IsBackgroundDimmed ( ) & & songSelect . IsUserBlurApplied ( ) ) ;
2019-02-24 17:10:59 +08:00
}
2019-02-22 10:41:28 +08:00
2019-02-24 17:10:59 +08:00
/// <summary>
/// Make sure the background is fully invisible (Alpha == 0) when the background should be disabled by the storyboard.
/// </summary>
[Test]
2020-05-26 10:30:36 +08:00
public void TestStoryboardBackgroundVisibility ( )
2019-02-24 17:10:59 +08:00
{
2019-02-28 17:26:41 +08:00
performFullSetup ( ) ;
2021-01-04 17:32:23 +08:00
AddAssert ( "Background retained from song select" , ( ) = > songSelect . IsBackgroundCurrent ( ) ) ;
2019-02-27 16:56:44 +08:00
createFakeStoryboard ( ) ;
2019-08-12 04:19:22 +08:00
AddStep ( "Enable Storyboard" , ( ) = >
2019-02-28 19:01:15 +08:00
{
2023-08-02 14:50:15 +08:00
player . StoryboardReplacesBackground . Value = true ;
2019-02-28 19:01:15 +08:00
player . StoryboardEnabled . Value = true ;
} ) ;
2023-08-02 14:50:15 +08:00
AddUntilStep ( "Background is black, storyboard is visible" , ( ) = > songSelect . IsBackgroundVisible ( ) & & songSelect . IsBackgroundBlack ( ) & & player . IsStoryboardVisible ) ;
2019-08-12 04:19:22 +08:00
AddStep ( "Disable Storyboard" , ( ) = >
2019-02-22 10:41:28 +08:00
{
2023-08-02 14:50:15 +08:00
player . StoryboardReplacesBackground . Value = false ;
2019-02-27 16:56:44 +08:00
player . StoryboardEnabled . Value = false ;
2019-02-22 10:41:28 +08:00
} ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Background is visible, storyboard is invisible" , ( ) = > songSelect . IsBackgroundVisible ( ) & & ! player . IsStoryboardVisible ) ;
2019-02-18 17:58:34 +08:00
}
2019-02-25 11:35:01 +08:00
/// <summary>
/// When exiting player, the screen that it suspends/exits to needs to have a fully visible (Alpha == 1) background.
/// </summary>
[Test]
2020-05-26 10:30:36 +08:00
public void TestStoryboardTransition ( )
2019-02-25 11:35:01 +08:00
{
2019-02-28 17:26:41 +08:00
performFullSetup ( ) ;
2019-02-27 16:56:44 +08:00
createFakeStoryboard ( ) ;
2019-02-28 19:01:15 +08:00
AddStep ( "Exit to song select" , ( ) = > player . Exit ( ) ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Background is visible" , ( ) = > songSelect . IsBackgroundVisible ( ) ) ;
2019-02-25 11:35:01 +08:00
}
2019-02-18 18:53:55 +08:00
/// <summary>
2019-08-12 04:08:14 +08:00
/// Ensure <see cref="UserDimContainer"/> is properly accepting user-defined visual changes for a background.
2019-02-18 18:53:55 +08:00
/// </summary>
[Test]
2020-05-26 10:30:36 +08:00
public void TestDisableUserDimBackground ( )
2019-02-18 18:53:55 +08:00
{
2019-02-28 17:26:41 +08:00
performFullSetup ( ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Screen is dimmed and blur applied" , ( ) = > songSelect . IsBackgroundDimmed ( ) & & songSelect . IsUserBlurApplied ( ) ) ;
2021-04-15 13:02:12 +08:00
AddStep ( "Disable user dim" , ( ) = > songSelect . IgnoreUserSettings . Value = true ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Screen is undimmed and user blur removed" , ( ) = > songSelect . IsBackgroundUndimmed ( ) & & songSelect . IsUserBlurDisabled ( ) ) ;
2021-04-15 13:02:12 +08:00
AddStep ( "Enable user dim" , ( ) = > songSelect . IgnoreUserSettings . Value = false ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Screen is dimmed and blur applied" , ( ) = > songSelect . IsBackgroundDimmed ( ) & & songSelect . IsUserBlurApplied ( ) ) ;
2019-02-15 15:17:01 +08:00
}
2019-08-08 20:59:29 +08:00
/// <summary>
2019-08-12 04:08:14 +08:00
/// Ensure <see cref="UserDimContainer"/> is properly accepting user-defined visual changes for a storyboard.
2019-08-08 20:59:29 +08:00
/// </summary>
[Test]
2020-05-26 10:30:36 +08:00
public void TestDisableUserDimStoryboard ( )
2019-08-08 20:59:29 +08:00
{
performFullSetup ( ) ;
createFakeStoryboard ( ) ;
2019-08-12 04:19:22 +08:00
AddStep ( "Enable Storyboard" , ( ) = >
2019-08-08 20:59:29 +08:00
{
2023-08-02 14:50:15 +08:00
player . StoryboardReplacesBackground . Value = true ;
2019-08-08 20:59:29 +08:00
player . StoryboardEnabled . Value = true ;
} ) ;
2021-04-15 13:02:12 +08:00
AddStep ( "Enable user dim" , ( ) = > player . DimmableStoryboard . IgnoreUserSettings . Value = false ) ;
2019-08-08 20:59:29 +08:00
AddStep ( "Set dim level to 1" , ( ) = > songSelect . DimLevel . Value = 1f ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Storyboard is invisible" , ( ) = > ! player . IsStoryboardVisible ) ;
2021-04-15 13:02:12 +08:00
AddStep ( "Disable user dim" , ( ) = > player . DimmableStoryboard . IgnoreUserSettings . Value = true ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Storyboard is visible" , ( ) = > player . IsStoryboardVisible ) ;
2019-08-08 20:59:29 +08:00
}
2021-04-13 14:56:43 +08:00
[Test]
public void TestStoryboardIgnoreUserSettings ( )
{
performFullSetup ( ) ;
createFakeStoryboard ( ) ;
2023-08-02 14:50:15 +08:00
AddStep ( "Enable replacing background" , ( ) = > player . StoryboardReplacesBackground . Value = true ) ;
2021-04-13 14:56:43 +08:00
AddUntilStep ( "Storyboard is invisible" , ( ) = > ! player . IsStoryboardVisible ) ;
AddUntilStep ( "Background is visible" , ( ) = > songSelect . IsBackgroundVisible ( ) ) ;
AddStep ( "Ignore user settings" , ( ) = >
{
2021-04-15 13:02:12 +08:00
player . ApplyToBackground ( b = > b . IgnoreUserSettings . Value = true ) ;
player . DimmableStoryboard . IgnoreUserSettings . Value = true ;
2021-04-13 14:56:43 +08:00
} ) ;
AddUntilStep ( "Storyboard is visible" , ( ) = > player . IsStoryboardVisible ) ;
2023-08-02 14:50:15 +08:00
AddUntilStep ( "Background is dimmed" , ( ) = > songSelect . IsBackgroundVisible ( ) & & songSelect . IsBackgroundBlack ( ) ) ;
2021-04-13 14:56:43 +08:00
2023-08-02 14:50:15 +08:00
AddStep ( "Disable background replacement" , ( ) = > player . StoryboardReplacesBackground . Value = false ) ;
2021-04-13 14:56:43 +08:00
AddUntilStep ( "Storyboard is visible" , ( ) = > player . IsStoryboardVisible ) ;
2023-08-02 14:50:15 +08:00
AddUntilStep ( "Background is visible" , ( ) = > songSelect . IsBackgroundVisible ( ) & & ! songSelect . IsBackgroundBlack ( ) ) ;
2021-04-13 14:56:43 +08:00
}
2019-02-15 15:50:37 +08:00
/// <summary>
2019-03-13 15:47:03 +08:00
/// Check if the visual settings container retains dim and blur when pausing
2019-02-15 15:50:37 +08:00
/// </summary>
2019-02-15 15:38:27 +08:00
[Test]
2020-05-26 10:30:36 +08:00
public void TestPause ( )
2019-02-15 15:38:27 +08:00
{
2019-02-28 17:26:41 +08:00
performFullSetup ( true ) ;
2019-03-18 10:48:11 +08:00
AddStep ( "Pause" , ( ) = > player . Pause ( ) ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Screen is dimmed and blur applied" , ( ) = > songSelect . IsBackgroundDimmed ( ) & & songSelect . IsUserBlurApplied ( ) ) ;
2019-03-18 10:48:11 +08:00
AddStep ( "Unpause" , ( ) = > player . Resume ( ) ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Screen is dimmed and blur applied" , ( ) = > songSelect . IsBackgroundDimmed ( ) & & songSelect . IsUserBlurApplied ( ) ) ;
2019-02-18 18:53:55 +08:00
}
/// <summary>
2020-03-17 16:43:16 +08:00
/// Check if the visual settings container removes user dim when suspending <see cref="Player"/> for <see cref="ResultsScreen"/>
2019-02-18 18:53:55 +08:00
/// </summary>
[Test]
2020-05-26 10:30:36 +08:00
public void TestTransition ( )
2019-02-18 18:53:55 +08:00
{
2019-02-28 17:26:41 +08:00
performFullSetup ( ) ;
2020-06-11 13:55:49 +08:00
2019-11-29 14:51:00 +08:00
FadeAccessibleResults results = null ;
2020-06-11 13:55:49 +08:00
2021-12-13 15:50:29 +08:00
AddStep ( "Transition to Results" , ( ) = > player . Push ( results = new FadeAccessibleResults ( TestResources . CreateTestScoreInfo ( ) ) ) ) ;
2020-06-11 13:55:49 +08:00
2019-11-29 14:51:00 +08:00
AddUntilStep ( "Wait for results is current" , ( ) = > results . IsCurrentScreen ( ) ) ;
2021-01-04 17:32:23 +08:00
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Screen is undimmed, original background retained" , ( ) = >
2021-01-04 17:32:23 +08:00
songSelect . IsBackgroundUndimmed ( ) & & songSelect . IsBackgroundCurrent ( ) & & songSelect . CheckBackgroundBlur ( results . ExpectedBackgroundBlur ) ) ;
2019-02-19 18:44:26 +08:00
}
2019-03-20 16:18:42 +08:00
/// <summary>
/// Check if hovering on the visual settings dialogue after resuming from player still previews the background dim.
/// </summary>
[Test]
2020-05-26 10:30:36 +08:00
public void TestResumeFromPlayer ( )
2019-03-20 16:18:42 +08:00
{
performFullSetup ( ) ;
2022-10-18 18:15:11 +08:00
AddStep ( "Move mouse to Visual Settings location" , ( ) = > InputManager . MoveMouseTo ( playerLoader . ScreenSpaceDrawQuad . TopRight
+ new Vector2 ( - playerLoader . VisualSettingsPos . ScreenSpaceDrawQuad . Width ,
playerLoader . VisualSettingsPos . ScreenSpaceDrawQuad . Height / 2
) ) ) ;
2019-03-20 18:45:04 +08:00
AddStep ( "Resume PlayerLoader" , ( ) = > player . Restart ( ) ) ;
2020-05-26 10:29:56 +08:00
AddUntilStep ( "Screen is dimmed and blur applied" , ( ) = > songSelect . IsBackgroundDimmed ( ) & & songSelect . IsUserBlurApplied ( ) ) ;
2019-03-20 16:18:42 +08:00
AddStep ( "Move mouse to center of screen" , ( ) = > InputManager . MoveMouseTo ( playerLoader . ScreenPos ) ) ;
2021-01-04 17:32:23 +08:00
AddUntilStep ( "Screen is undimmed and user blur removed" , ( ) = > songSelect . IsBackgroundUndimmed ( ) & & songSelect . CheckBackgroundBlur ( playerLoader . ExpectedBackgroundBlur ) ) ;
2019-02-15 15:38:27 +08:00
}
2019-02-28 19:01:15 +08:00
private void createFakeStoryboard ( ) = > AddStep ( "Create storyboard" , ( ) = >
2019-02-27 16:56:44 +08:00
{
2019-02-28 19:01:15 +08:00
player . StoryboardEnabled . Value = false ;
2023-08-02 14:50:15 +08:00
player . StoryboardReplacesBackground . Value = false ;
2019-07-12 10:50:06 +08:00
player . DimmableStoryboard . Add ( new OsuSpriteText
2019-02-27 16:56:44 +08:00
{
2019-07-10 11:36:58 +08:00
Size = new Vector2 ( 500 , 50 ) ,
2019-02-27 16:56:44 +08:00
Alpha = 1 ,
2019-07-10 11:36:58 +08:00
Colour = Color4 . White ,
2019-02-28 13:33:29 +08:00
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
Text = "THIS IS A STORYBOARD" ,
2019-07-10 11:36:58 +08:00
Font = new FontUsage ( size : 50 )
2019-02-27 16:56:44 +08:00
} ) ;
} ) ;
2019-02-28 17:26:41 +08:00
private void performFullSetup ( bool allowPause = false )
2019-02-26 08:56:22 +08:00
{
2019-02-28 17:26:41 +08:00
setupUserSettings ( ) ;
2019-02-26 08:56:22 +08:00
2020-03-05 10:25:07 +08:00
AddStep ( "Start player loader" , ( ) = > songSelect . Push ( playerLoader = new TestPlayerLoader ( player = new LoadBlockingTestPlayer ( allowPause ) ) ) ) ;
2019-03-28 10:18:54 +08:00
2019-03-19 16:24:26 +08:00
AddUntilStep ( "Wait for Player Loader to load" , ( ) = > playerLoader . IsLoaded ) ;
2019-02-27 13:15:45 +08:00
AddStep ( "Move mouse to center of screen" , ( ) = > InputManager . MoveMouseTo ( playerLoader . ScreenPos ) ) ;
2019-03-19 16:24:26 +08:00
AddUntilStep ( "Wait for player to load" , ( ) = > player . IsLoaded ) ;
2019-02-26 08:56:22 +08:00
}
2019-02-28 17:26:41 +08:00
private void setupUserSettings ( )
2019-02-26 08:56:22 +08:00
{
2020-03-20 14:02:13 +08:00
AddUntilStep ( "Song select is current" , ( ) = > songSelect . IsCurrentScreen ( ) ) ;
2021-10-02 11:44:22 +08:00
AddUntilStep ( "Song select has selection" , ( ) = > songSelect . Carousel ? . SelectedBeatmapInfo ! = null ) ;
2019-02-28 17:26:41 +08:00
AddStep ( "Set default user settings" , ( ) = >
2019-02-26 16:31:21 +08:00
{
2022-05-06 03:24:11 +08:00
SelectedMods . Value = new [ ] { new OsuModNoFail ( ) } ;
2019-02-27 16:02:04 +08:00
songSelect . DimLevel . Value = 0.7f ;
2019-03-13 15:47:03 +08:00
songSelect . BlurLevel . Value = 0.4f ;
2019-02-26 16:31:21 +08:00
} ) ;
2019-02-26 08:56:22 +08:00
}
2019-10-15 15:14:06 +08:00
protected override void Dispose ( bool isDisposing )
{
base . Dispose ( isDisposing ) ;
rulesets ? . Dispose ( ) ;
}
2019-02-27 13:15:45 +08:00
private partial class DummySongSelect : PlaySongSelect
2019-02-19 18:44:26 +08:00
{
2021-01-04 17:32:23 +08:00
private FadeAccessibleBackground background ;
2019-02-26 16:31:21 +08:00
protected override BackgroundScreen CreateBackground ( )
{
2021-01-04 17:32:23 +08:00
background = new FadeAccessibleBackground ( Beatmap . Value ) ;
2021-04-15 13:02:12 +08:00
IgnoreUserSettings . BindTo ( background . IgnoreUserSettings ) ;
2019-02-26 16:31:21 +08:00
return background ;
}
2021-04-15 13:02:12 +08:00
public readonly Bindable < bool > IgnoreUserSettings = new Bindable < bool > ( ) ;
2020-02-02 05:50:29 +08:00
public readonly Bindable < double > DimLevel = new BindableDouble ( ) ;
public readonly Bindable < double > BlurLevel = new BindableDouble ( ) ;
2019-02-24 17:10:59 +08:00
2019-02-27 13:15:45 +08:00
public new BeatmapCarousel Carousel = > base . Carousel ;
2019-02-24 17:10:59 +08:00
[BackgroundDependencyLoader]
private void load ( OsuConfigManager config )
{
2019-02-27 16:02:04 +08:00
config . BindWith ( OsuSetting . DimLevel , DimLevel ) ;
2019-02-28 15:18:46 +08:00
config . BindWith ( OsuSetting . BlurLevel , BlurLevel ) ;
2019-02-22 15:56:03 +08:00
}
2019-02-21 14:24:26 +08:00
2023-08-02 14:50:15 +08:00
public bool IsBackgroundBlack ( ) = > background . CurrentColour = = OsuColour . Gray ( 0 ) ;
2021-01-04 17:32:23 +08:00
public bool IsBackgroundDimmed ( ) = > background . CurrentColour = = OsuColour . Gray ( 1f - background . CurrentDim ) ;
2019-02-21 14:24:26 +08:00
2021-01-04 17:32:23 +08:00
public bool IsBackgroundUndimmed ( ) = > background . CurrentColour = = Color4 . White ;
2019-02-22 10:41:28 +08:00
2022-01-11 22:01:17 +08:00
public bool IsUserBlurApplied ( ) = > Precision . AlmostEquals ( background . CurrentBlur , new Vector2 ( ( float ) BlurLevel . Value * BackgroundScreenBeatmap . USER_BLUR_FACTOR ) , 0.1f ) ;
2019-03-13 15:47:03 +08:00
2021-01-04 17:32:23 +08:00
public bool IsUserBlurDisabled ( ) = > background . CurrentBlur = = new Vector2 ( 0 ) ;
2019-03-13 15:47:03 +08:00
2021-01-04 17:32:23 +08:00
public bool IsBackgroundVisible ( ) = > background . CurrentAlpha = = 1 ;
2019-02-22 13:43:05 +08:00
2022-01-11 22:01:17 +08:00
public bool IsBackgroundBlur ( ) = > Precision . AlmostEquals ( background . CurrentBlur , new Vector2 ( BACKGROUND_BLUR ) , 0.1f ) ;
2021-01-04 17:32:23 +08:00
2022-01-11 22:01:17 +08:00
public bool CheckBackgroundBlur ( Vector2 expected ) = > Precision . AlmostEquals ( background . CurrentBlur , expected , 0.1f ) ;
2019-03-14 15:09:17 +08:00
2019-02-22 13:43:05 +08:00
/// <summary>
/// Make sure every time a screen gets pushed, the background doesn't get replaced
/// </summary>
2019-02-24 19:03:24 +08:00
/// <returns>Whether or not the original background (The one created in DummySongSelect) is still the current background</returns>
2021-01-04 17:32:23 +08:00
public bool IsBackgroundCurrent ( ) = > background ? . IsCurrentScreen ( ) = = true ;
2019-02-19 18:44:26 +08:00
}
2019-02-15 15:17:01 +08:00
2020-03-17 16:43:16 +08:00
private partial class FadeAccessibleResults : ResultsScreen
2019-02-18 18:53:55 +08:00
{
2019-02-28 19:01:15 +08:00
public FadeAccessibleResults ( ScoreInfo score )
2024-02-23 02:15:02 +08:00
: base ( score )
2019-02-18 18:53:55 +08:00
{
2024-02-23 02:15:02 +08:00
AllowRetry = true ;
2019-02-18 18:53:55 +08:00
}
2021-01-05 15:00:25 +08:00
protected override BackgroundScreen CreateBackground ( ) = > new FadeAccessibleBackground ( Beatmap . Value ) ;
2019-03-14 15:09:17 +08:00
2021-01-04 17:32:23 +08:00
public Vector2 ExpectedBackgroundBlur = > new Vector2 ( BACKGROUND_BLUR ) ;
2019-02-18 18:53:55 +08:00
}
2020-03-05 10:25:07 +08:00
private partial class LoadBlockingTestPlayer : TestPlayer
2019-02-15 15:17:01 +08:00
{
2021-01-04 17:32:23 +08:00
protected override BackgroundScreen CreateBackground ( ) = >
new FadeAccessibleBackground ( Beatmap . Value ) ;
2022-04-21 23:52:44 +08:00
public override void OnEntering ( ScreenTransitionEvent e )
2021-01-04 17:32:23 +08:00
{
2022-04-21 23:52:44 +08:00
base . OnEntering ( e ) ;
2021-01-04 17:32:23 +08:00
2023-08-02 14:50:15 +08:00
ApplyToBackground ( b = > StoryboardReplacesBackground . BindTo ( b . StoryboardReplacesBackground ) ) ;
2021-01-04 17:32:23 +08:00
}
2019-02-15 15:17:01 +08:00
2019-07-12 11:04:45 +08:00
public new DimmableStoryboard DimmableStoryboard = > base . DimmableStoryboard ;
2019-02-28 15:51:17 +08:00
2019-02-24 17:10:59 +08:00
// Whether or not the player should be allowed to load.
2019-03-27 16:34:58 +08:00
public bool BlockLoad ;
2019-02-21 14:24:26 +08:00
2019-02-22 10:41:28 +08:00
public Bindable < bool > StoryboardEnabled ;
2023-08-02 14:50:15 +08:00
public readonly Bindable < bool > StoryboardReplacesBackground = new Bindable < bool > ( ) ;
2019-02-24 17:10:59 +08:00
public readonly Bindable < bool > IsPaused = new Bindable < bool > ( ) ;
2019-02-22 13:43:05 +08:00
2020-03-05 10:25:07 +08:00
public LoadBlockingTestPlayer ( bool allowPause = true )
2019-03-26 15:53:44 +08:00
: base ( allowPause )
{
}
2019-07-12 11:04:45 +08:00
public bool IsStoryboardVisible = > DimmableStoryboard . ContentDisplayed ;
2019-02-27 16:56:44 +08:00
2019-02-21 14:24:26 +08:00
[BackgroundDependencyLoader]
2019-03-27 13:33:50 +08:00
private void load ( OsuConfigManager config , CancellationToken token )
2019-02-15 15:17:01 +08:00
{
2019-03-27 16:34:58 +08:00
while ( BlockLoad & & ! token . IsCancellationRequested )
2019-02-21 14:24:26 +08:00
Thread . Sleep ( 1 ) ;
2019-03-27 13:33:50 +08:00
2022-01-11 17:33:35 +08:00
if ( ! LoadedBeatmapSuccessfully )
return ;
2019-02-22 10:41:28 +08:00
StoryboardEnabled = config . GetBindable < bool > ( OsuSetting . ShowStoryboard ) ;
2019-03-19 22:44:15 +08:00
DrawableRuleset . IsPaused . BindTo ( IsPaused ) ;
2019-02-15 15:17:01 +08:00
}
2019-02-21 14:24:26 +08:00
}
2019-02-15 15:17:01 +08:00
2019-03-13 15:47:03 +08:00
private partial class TestPlayerLoader : PlayerLoader
2019-02-21 14:24:26 +08:00
{
2021-01-04 17:32:23 +08:00
private FadeAccessibleBackground background ;
2019-02-21 14:24:26 +08:00
public VisualSettings VisualSettingsPos = > VisualSettings ;
2021-01-04 17:32:23 +08:00
public BackgroundScreen ScreenPos = > background ;
2019-02-21 14:24:26 +08:00
2019-03-13 15:47:03 +08:00
public TestPlayerLoader ( Player player )
2019-02-26 08:56:22 +08:00
: base ( ( ) = > player )
2019-02-15 15:38:27 +08:00
{
}
2019-02-21 17:19:50 +08:00
2019-02-28 19:01:15 +08:00
public void TriggerOnHover ( ) = > OnHover ( new HoverEvent ( new InputState ( ) ) ) ;
2019-02-28 15:18:46 +08:00
2021-01-04 17:32:23 +08:00
public Vector2 ExpectedBackgroundBlur = > new Vector2 ( BACKGROUND_BLUR ) ;
2019-03-14 15:09:17 +08:00
2021-01-04 17:32:23 +08:00
protected override BackgroundScreen CreateBackground ( ) = > background = new FadeAccessibleBackground ( Beatmap . Value ) ;
2019-02-18 18:53:55 +08:00
}
private partial class FadeAccessibleBackground : BackgroundScreenBeatmap
{
2019-07-12 10:50:06 +08:00
protected override DimmableBackground CreateFadeContainer ( ) = > dimmable = new TestDimmableBackground { RelativeSizeAxes = Axes . Both } ;
2019-02-22 17:01:50 +08:00
2019-07-12 10:50:06 +08:00
public Color4 CurrentColour = > dimmable . CurrentColour ;
2019-03-13 15:47:03 +08:00
2019-07-12 10:50:06 +08:00
public float CurrentAlpha = > dimmable . CurrentAlpha ;
2019-02-22 19:34:51 +08:00
2019-12-10 20:25:03 +08:00
public float CurrentDim = > dimmable . DimLevel ;
2021-11-19 13:03:07 +08:00
public Vector2 CurrentBlur = > Background ? . BlurSigma ? ? Vector2 . Zero ;
2019-02-28 15:18:46 +08:00
2019-07-12 10:50:06 +08:00
private TestDimmableBackground dimmable ;
2019-02-28 19:01:15 +08:00
2019-02-27 13:15:45 +08:00
public FadeAccessibleBackground ( WorkingBeatmap beatmap )
: base ( beatmap )
{
}
2019-02-27 16:56:44 +08:00
}
2019-02-27 13:15:45 +08:00
2019-07-12 10:50:06 +08:00
private partial class TestDimmableBackground : BackgroundScreenBeatmap . DimmableBackground
2019-07-09 15:23:59 +08:00
{
2019-07-12 10:38:15 +08:00
public Color4 CurrentColour = > Content . Colour ;
public float CurrentAlpha = > Content . Alpha ;
2019-12-10 20:25:03 +08:00
public new float DimLevel = > base . DimLevel ;
2019-07-09 15:23:59 +08:00
}
2019-02-15 15:17:01 +08:00
}
}