2019-01-24 16:43:03 +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.
2018-05-18 16:53:19 +08:00
2022-06-17 15:37:17 +08:00
#nullable disable
2022-09-18 04:43:40 +08:00
using System ;
2018-05-18 16:53:19 +08:00
using NUnit.Framework ;
using osu.Framework.Graphics ;
using osu.Framework.Graphics.Colour ;
using osu.Framework.Graphics.Containers ;
using osu.Framework.Graphics.Primitives ;
using osu.Framework.Graphics.Shapes ;
2019-05-08 12:37:03 +08:00
using osu.Framework.Testing ;
2020-11-03 16:06:33 +08:00
using osu.Framework.Utils ;
2018-05-18 16:53:19 +08:00
using osu.Game.Graphics ;
using osu.Game.Graphics.Cursor ;
2018-11-06 17:28:22 +08:00
using osu.Game.Screens.Edit.Compose.Components.Timeline ;
2018-11-20 15:51:59 +08:00
using osuTK ;
using osuTK.Graphics ;
2020-11-03 16:06:33 +08:00
using osuTK.Input ;
2018-05-18 16:53:19 +08:00
2020-04-23 16:07:55 +08:00
namespace osu.Game.Tests.Visual.Editing
2018-05-18 16:53:19 +08:00
{
2020-03-23 09:01:33 +08:00
public class TestSceneZoomableScrollContainer : OsuManualInputManagerTestScene
2018-05-18 16:53:19 +08:00
{
2019-05-08 12:37:03 +08:00
private ZoomableScrollContainer scrollContainer ;
private Drawable innerBox ;
2018-05-18 16:53:19 +08:00
2019-05-08 12:37:03 +08:00
[SetUpSteps]
public void SetUpSteps ( )
2018-05-18 16:53:19 +08:00
{
2019-05-08 12:37:03 +08:00
AddStep ( "Add new scroll container" , ( ) = >
2018-05-18 16:53:19 +08:00
{
2019-05-08 12:37:03 +08:00
Children = new Drawable [ ]
2018-05-18 16:53:19 +08:00
{
2019-05-08 12:37:03 +08:00
new Container
2018-05-18 16:53:19 +08:00
{
2019-05-08 12:37:03 +08:00
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
RelativeSizeAxes = Axes . X ,
Height = 250 ,
Width = 0.75f ,
Children = new Drawable [ ]
2018-05-18 16:53:19 +08:00
{
2019-05-08 12:37:03 +08:00
new Box
{
RelativeSizeAxes = Axes . Both ,
Colour = OsuColour . Gray ( 30 )
} ,
2022-07-25 16:54:10 +08:00
scrollContainer = new ZoomableScrollContainer ( 1 , 60 , 1 )
2022-06-03 07:26:46 +08:00
{
Anchor = Anchor . Centre ,
Origin = Anchor . Centre ,
RelativeSizeAxes = Axes . Both ,
}
2019-05-08 12:37:03 +08:00
}
} ,
2022-10-11 21:20:57 +08:00
new MenuCursorContainer ( )
2019-05-08 12:37:03 +08:00
} ;
2018-05-18 16:53:19 +08:00
2019-05-08 12:37:03 +08:00
scrollContainer . Add ( innerBox = new Box
{
RelativeSizeAxes = Axes . Both ,
Colour = ColourInfo . GradientHorizontal ( new Color4 ( 0.8f , 0.6f , 0.4f , 1f ) , new Color4 ( 0.4f , 0.6f , 0.8f , 1f ) )
} ) ;
2018-05-18 16:53:19 +08:00
} ) ;
2019-05-08 12:37:03 +08:00
AddUntilStep ( "Scroll container is loaded" , ( ) = > scrollContainer . LoadState > = LoadState . Loaded ) ;
}
2022-09-18 04:43:40 +08:00
[Test]
public void TestInitialZoomOutOfRange ( )
{
AddStep ( "Invalid ZoomableScrollContainer throws ArgumentException" , ( ) = >
{
Assert . Throws < ArgumentException > ( ( ) = >
{
_ = new ZoomableScrollContainer ( 1 , 60 , 0 ) ;
} ) ;
} ) ;
}
2019-05-08 12:37:03 +08:00
[Test]
public void TestWidthInitialization ( )
{
2022-06-03 07:26:46 +08:00
AddAssert ( "Inner container width was initialized" , ( ) = > innerBox . DrawWidth = = scrollContainer . DrawWidth ) ;
}
[Test]
public void TestWidthUpdatesOnDrawSizeChanges ( )
{
AddStep ( "Shrink scroll container" , ( ) = > scrollContainer . Width = 0.5f ) ;
AddAssert ( "Scroll container width shrunk" , ( ) = > scrollContainer . DrawWidth = = scrollContainer . Parent . DrawWidth / 2 ) ;
AddAssert ( "Inner container width matches scroll container" , ( ) = > innerBox . DrawWidth = = scrollContainer . DrawWidth ) ;
2018-05-18 16:53:19 +08:00
}
[Test]
public void TestZoom0 ( )
{
reset ( ) ;
AddAssert ( "Box at 0" , ( ) = > Precision . AlmostEquals ( boxQuad . TopLeft , scrollQuad . TopLeft ) ) ;
AddAssert ( "Box width = 1x" , ( ) = > Precision . AlmostEquals ( boxQuad . Size , scrollQuad . Size ) ) ;
}
[Test]
public void TestZoom10 ( )
{
reset ( ) ;
AddStep ( "Set zoom = 10" , ( ) = > scrollContainer . Zoom = 10 ) ;
2018-06-12 15:20:38 +08:00
AddAssert ( "Box at 1/2" , ( ) = > Precision . AlmostEquals ( boxQuad . Centre , scrollQuad . Centre , 1 ) ) ;
2018-05-18 16:53:19 +08:00
AddAssert ( "Box width = 10x" , ( ) = > Precision . AlmostEquals ( boxQuad . Size . X , 10 * scrollQuad . Size . X ) ) ;
}
[Test]
public void TestMouseZoomInOnceOutOnce ( )
{
reset ( ) ;
// Scroll in at 0.25
AddStep ( "Move mouse to 0.25x" , ( ) = > InputManager . MoveMouseTo ( new Vector2 ( scrollQuad . TopLeft . X + 0.25f * scrollQuad . Size . X , scrollQuad . Centre . Y ) ) ) ;
2020-11-03 16:06:33 +08:00
AddStep ( "Press alt down" , ( ) = > InputManager . PressKey ( Key . AltLeft ) ) ;
2018-06-12 15:20:31 +08:00
AddStep ( "Scroll by 3" , ( ) = > InputManager . ScrollBy ( new Vector2 ( 0 , 3 ) ) ) ;
2018-05-18 16:53:19 +08:00
AddAssert ( "Box not at 0" , ( ) = > ! Precision . AlmostEquals ( boxQuad . TopLeft , scrollQuad . TopLeft ) ) ;
AddAssert ( "Box 1/4 at 1/4" , ( ) = > Precision . AlmostEquals ( boxQuad . TopLeft . X + 0.25f * boxQuad . Size . X , scrollQuad . TopLeft . X + 0.25f * scrollQuad . Size . X ) ) ;
// Scroll out at 0.25
2018-06-12 15:20:31 +08:00
AddStep ( "Scroll by -3" , ( ) = > InputManager . ScrollBy ( new Vector2 ( 0 , - 3 ) ) ) ;
2018-05-18 16:53:19 +08:00
AddAssert ( "Box at 0" , ( ) = > Precision . AlmostEquals ( boxQuad . TopLeft , scrollQuad . TopLeft ) ) ;
AddAssert ( "Box 1/4 at 1/4" , ( ) = > Precision . AlmostEquals ( boxQuad . TopLeft . X + 0.25f * boxQuad . Size . X , scrollQuad . TopLeft . X + 0.25f * scrollQuad . Size . X ) ) ;
2020-11-03 16:06:33 +08:00
AddStep ( "Release alt" , ( ) = > InputManager . ReleaseKey ( Key . AltLeft ) ) ;
2018-05-18 16:53:19 +08:00
}
2020-11-03 16:22:45 +08:00
[Test]
public void TestMouseZoomInThenScroll ( )
{
reset ( ) ;
// Scroll in at 0.25
AddStep ( "Move mouse to 0.25x" , ( ) = > InputManager . MoveMouseTo ( new Vector2 ( scrollQuad . TopLeft . X + 0.25f * scrollQuad . Size . X , scrollQuad . Centre . Y ) ) ) ;
AddStep ( "Press alt down" , ( ) = > InputManager . PressKey ( Key . AltLeft ) ) ;
AddStep ( "Zoom by 3" , ( ) = > InputManager . ScrollBy ( new Vector2 ( 0 , 3 ) ) ) ;
AddStep ( "Release alt" , ( ) = > InputManager . ReleaseKey ( Key . AltLeft ) ) ;
AddStep ( "Scroll far left" , ( ) = > InputManager . ScrollBy ( new Vector2 ( 0 , 30 ) ) ) ;
AddUntilStep ( "Scroll is at start" , ( ) = > Precision . AlmostEquals ( scrollQuad . TopLeft . X , boxQuad . TopLeft . X , 1 ) ) ;
AddStep ( "Scroll far right" , ( ) = > InputManager . ScrollBy ( new Vector2 ( 0 , - 300 ) ) ) ;
AddUntilStep ( "Scroll is at end" , ( ) = > Precision . AlmostEquals ( scrollQuad . TopRight . X , boxQuad . TopRight . X , 1 ) ) ;
}
2018-05-18 16:53:19 +08:00
[Test]
public void TestMouseZoomInTwiceOutTwice ( )
{
reset ( ) ;
2020-11-03 16:06:33 +08:00
AddStep ( "Press alt down" , ( ) = > InputManager . PressKey ( Key . AltLeft ) ) ;
2018-05-18 16:53:19 +08:00
// Scroll in at 0.25
AddStep ( "Move mouse to 0.25x" , ( ) = > InputManager . MoveMouseTo ( new Vector2 ( scrollQuad . TopLeft . X + 0.25f * scrollQuad . Size . X , scrollQuad . Centre . Y ) ) ) ;
2018-06-12 15:20:31 +08:00
AddStep ( "Scroll by 1" , ( ) = > InputManager . ScrollBy ( new Vector2 ( 0 , 1 ) ) ) ;
2018-05-18 16:53:19 +08:00
// Scroll in at 0.6
AddStep ( "Move mouse to 0.75x" , ( ) = > InputManager . MoveMouseTo ( new Vector2 ( scrollQuad . TopLeft . X + 0.75f * scrollQuad . Size . X , scrollQuad . Centre . Y ) ) ) ;
2018-06-12 15:20:31 +08:00
AddStep ( "Scroll by 1" , ( ) = > InputManager . ScrollBy ( new Vector2 ( 0 , 1 ) ) ) ;
2018-05-18 16:53:19 +08:00
AddAssert ( "Box not at 0" , ( ) = > ! Precision . AlmostEquals ( boxQuad . TopLeft , scrollQuad . TopLeft ) ) ;
// Very hard to determine actual position, so approximate
AddAssert ( "Box at correct position (1)" , ( ) = > Precision . DefinitelyBigger ( scrollQuad . TopLeft . X + 0.25f * scrollQuad . Size . X , boxQuad . TopLeft . X + 0.25f * boxQuad . Size . X ) ) ;
AddAssert ( "Box at correct position (2)" , ( ) = > Precision . DefinitelyBigger ( scrollQuad . TopLeft . X + 0.6f * scrollQuad . Size . X , boxQuad . TopLeft . X + 0.3f * boxQuad . Size . X ) ) ;
AddAssert ( "Box at correct position (3)" , ( ) = > Precision . DefinitelyBigger ( boxQuad . TopLeft . X + 0.6f * boxQuad . Size . X , scrollQuad . TopLeft . X + 0.6f * scrollQuad . Size . X ) ) ;
// Scroll out at 0.6
2018-06-12 15:20:31 +08:00
AddStep ( "Scroll by -1" , ( ) = > InputManager . ScrollBy ( new Vector2 ( 0 , - 1 ) ) ) ;
2018-05-18 16:53:19 +08:00
// Scroll out at 0.25
AddStep ( "Move mouse to 0.25x" , ( ) = > InputManager . MoveMouseTo ( new Vector2 ( scrollQuad . TopLeft . X + 0.25f * scrollQuad . Size . X , scrollQuad . Centre . Y ) ) ) ;
2018-06-12 15:20:31 +08:00
AddStep ( "Scroll by -1" , ( ) = > InputManager . ScrollBy ( new Vector2 ( 0 , - 1 ) ) ) ;
2018-05-18 16:53:19 +08:00
AddAssert ( "Box at 0" , ( ) = > Precision . AlmostEquals ( boxQuad . TopLeft , scrollQuad . TopLeft ) ) ;
2020-11-03 16:06:33 +08:00
AddStep ( "Release alt" , ( ) = > InputManager . ReleaseKey ( Key . AltLeft ) ) ;
2018-05-18 16:53:19 +08:00
}
private void reset ( )
{
AddStep ( "Reset" , ( ) = >
{
scrollContainer . Zoom = 0 ;
scrollContainer . ScrollTo ( 0 , false ) ;
} ) ;
}
private Quad scrollQuad = > scrollContainer . ScreenSpaceDrawQuad ;
private Quad boxQuad = > innerBox . ScreenSpaceDrawQuad ;
}
}