A game framework written with osu! in mind.
1// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2// See the LICENCE file in the repository root for full licence text.
3
4using osu.Framework.Graphics;
5using osu.Framework.Graphics.Containers;
6using osu.Framework.Graphics.Cursor;
7using osu.Framework.Graphics.Shapes;
8using osu.Framework.Utils;
9using osu.Framework.Testing;
10using osuTK;
11using osuTK.Graphics;
12
13namespace osu.Framework.Tests.Visual.Containers
14{
15 public class TestSceneCursorContainer : ManualInputManagerTestScene
16 {
17 public TestSceneCursorContainer()
18 {
19 Container container;
20 TestCursorContainer cursorContainer;
21
22 void createContent()
23 {
24 Child = container = new Container
25 {
26 Masking = true,
27 RelativeSizeAxes = Axes.Both,
28 Anchor = Anchor.Centre,
29 Origin = Anchor.Centre,
30 Size = new Vector2(0.5f),
31 Children = new Drawable[]
32 {
33 new Box
34 {
35 Colour = Color4.Yellow,
36 RelativeSizeAxes = Axes.Both,
37 },
38 cursorContainer = new TestCursorContainer
39 {
40 Name = "test",
41 RelativeSizeAxes = Axes.Both
42 }
43 }
44 };
45 }
46
47 bool cursorCenteredInContainer() =>
48 Precision.AlmostEquals(
49 cursorContainer.ActiveCursor.ScreenSpaceDrawQuad.Centre,
50 container.ScreenSpaceDrawQuad.Centre);
51
52 bool cursorAtMouseScreenSpace() =>
53 Precision.AlmostEquals(
54 cursorContainer.ActiveCursor.ScreenSpaceDrawQuad.Centre,
55 InputManager.CurrentState.Mouse.Position);
56
57 createContent();
58 AddStep("Move cursor to centre", () => InputManager.MoveMouseTo(container.ScreenSpaceDrawQuad.Centre));
59 AddAssert("cursor is centered", () => cursorCenteredInContainer());
60 AddStep("Move container", () => container.Y += 50);
61 AddAssert("cursor no longer centered", () => !cursorCenteredInContainer());
62 AddAssert("cursor at mouse position", () => cursorAtMouseScreenSpace());
63 AddStep("Resize container", () => container.Size *= new Vector2(1.4f, 1));
64 AddAssert("cursor at mouse position", () => cursorAtMouseScreenSpace());
65
66 // ensure positional updates work
67 AddStep("Move cursor to centre", () => InputManager.MoveMouseTo(container.ScreenSpaceDrawQuad.Centre));
68 AddAssert("cursor is not centered", () => cursorCenteredInContainer());
69 AddAssert("cursor at mouse position", () => cursorAtMouseScreenSpace());
70
71 // ensure we received the mouse position update from IRequireHighFrequencyMousePosition
72 AddStep("Move cursor to test centre", () => InputManager.MoveMouseTo(Content.ScreenSpaceDrawQuad.Centre));
73 AddStep("Recreate container with mouse already in place", createContent);
74 AddAssert("cursor is centered", () => cursorCenteredInContainer());
75 AddAssert("cursor at mouse position", () => cursorAtMouseScreenSpace());
76 }
77
78 private class TestCursorContainer : CursorContainer
79 {
80 protected override Drawable CreateCursor() => new Circle
81 {
82 Size = new Vector2(50),
83 Colour = Color4.Red,
84 Origin = Anchor.Centre,
85 };
86 }
87 }
88}