Skip to content

Commit

Permalink
Merge branch 'master' into tooltip-via-touch
Browse files Browse the repository at this point in the history
  • Loading branch information
peppy authored Feb 14, 2025
2 parents a44caef + 2468c15 commit f12005b
Show file tree
Hide file tree
Showing 93 changed files with 1,637 additions and 440 deletions.
2 changes: 1 addition & 1 deletion .config/dotnet-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
]
},
"nvika": {
"version": "3.0.0",
"version": "4.0.0",
"commands": [
"nvika"
]
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/build-ffmpeg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,7 @@ jobs:

build-linux:
name: Build Linux (x64)
# Use 20.04 to target glibc 2.31 like the other native libs
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- name: Install dependencies
run: |
Expand Down
5 changes: 1 addition & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,7 @@ jobs:
dotnet-version: "8.0.x"

- name: Restore .NET workloads
# since windows image 20241113.3.0, not specifying a version here
# installs the .NET 7 version of android workload for very unknown reasons.
# revisit once we upgrade to .NET 9, it's probably fixed there.
run: dotnet workload install android --version (dotnet --version)
run: dotnet workload install android

- name: Compile
run: dotnet build -c Debug osu-framework.Android.slnf
Expand Down
5 changes: 1 addition & 4 deletions .github/workflows/deploy-pack.yml
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,7 @@ jobs:
java-version: 11

- name: Restore .NET workloads
# since windows image 20241113.3.0, not specifying a version here
# installs the .NET 7 version of android workload for very unknown reasons.
# revisit once we upgrade to .NET 9, it's probably fixed there.
run: dotnet workload install android --version (dotnet --version)
run: dotnet workload install android

- name: Pack (Android Framework)
run: dotnet pack -c Release osu.Framework.Android /p:Version=${{ github.ref_name }} /p:GenerateDocumentationFile=true -o ${{steps.artifactsPath.outputs.nuget_artifacts}}
Expand Down
1 change: 1 addition & 0 deletions osu-framework.sln.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=API/@EntryIndexedValue">API</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ARGB/@EntryIndexedValue">ARGB</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BPM/@EntryIndexedValue">BPM</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CG/@EntryIndexedValue">CG</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FBO/@EntryIndexedValue">FBO</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CCL/@EntryIndexedValue">CCL</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GC/@EntryIndexedValue">GC</s:String>
Expand Down
1 change: 0 additions & 1 deletion osu.Framework.Android/osu.Framework.Android.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
<ProjectReference Include="..\osu.Framework\osu.Framework.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="ppy.SDL3-CS.Android" Version="2024.1128.0" />
<PackageReference Include="Xamarin.AndroidX.Window" Version="1.2.0.1" PrivateAssets="compile" />
</ItemGroup>
</Project>
35 changes: 35 additions & 0 deletions osu.Framework.Benchmarks/BenchmarkAsyncDisposal.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// 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.

using System.Collections.Generic;
using BenchmarkDotNet.Attributes;
using NUnit.Framework;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Shapes;

namespace osu.Framework.Benchmarks
{
[MemoryDiagnoser]
public partial class BenchmarkAsyncDisposal
{
private readonly List<Drawable> objects = new List<Drawable>();

[GlobalSetup]
[OneTimeSetUp]
public virtual void SetUp()
{
objects.Clear();
for (int i = 0; i < 10000; i++)
objects.Add(new Box());
}

[Test]
[Benchmark]
public void Run()
{
objects.ForEach(AsyncDisposalQueue.Enqueue);
AsyncDisposalQueue.WaitForEmpty();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using osu.Framework.Allocation;
using osu.Framework.Platform;
using NUnit.Framework;

namespace TemplateGame.Game.Tests.Visual
Expand All @@ -10,15 +9,10 @@ public partial class TestSceneTemplateGameGame : TemplateGameTestScene
// Add visual tests to ensure correct behaviour of your game: https://github.com/ppy/osu-framework/wiki/Development-and-Testing
// You can make changes to classes associated with the tests and they will recompile and update immediately.

private TemplateGameGame game;

[BackgroundDependencyLoader]
private void load(GameHost host)
private void load()
{
game = new TemplateGameGame();
game.SetHost(host);

AddGame(game);
AddGame(new TemplateGameGame());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using osu.Framework.Allocation;
using osu.Framework.Platform;
using NUnit.Framework;

namespace FlappyDon.Game.Tests.Visual
Expand All @@ -11,14 +10,10 @@ namespace FlappyDon.Game.Tests.Visual
[TestFixture]
public partial class TestSceneFlappyDonGame : FlappyDonTestScene
{
private FlappyDonGame game;

[BackgroundDependencyLoader]
private void load(GameHost host)
private void load()
{
game = new FlappyDonGame();
game.SetHost(host);
AddGame(game);
AddGame(new FlappyDonGame());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ private void scrollTo(float position, float scrollContentHeight, float extension
AddStep($"scroll to {position}", () =>
{
scrollContainer.ScrollTo(position, false);
immediateScrollPosition = scrollContainer.Current;
immediateScrollPosition = (float)scrollContainer.Current;
});

AddAssert($"immediately scrolled to {clampedTarget}", () => Precision.AlmostEquals(clampedTarget, immediateScrollPosition, 1));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
// 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.

using System;
using System.Diagnostics;
using System.Linq;
using NUnit.Framework;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Testing;
using osu.Framework.Utils;
using osuTK;
using osuTK.Graphics;

namespace osu.Framework.Tests.Visual.Containers
{
public partial class TestSceneScrollContainerDoublePrecision : ManualInputManagerTestScene
{
private const float item_height = 5000;
private const int item_count = 8000;

private ScrollContainer<Drawable> scrollContainer = null!;

[SetUp]
public void Setup() => Schedule(Clear);

[Test]
public void TestStandard()
{
AddStep("Create scroll container", () =>
{
Add(scrollContainer = new BasicScrollContainer
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
ScrollbarVisible = true,
RelativeSizeAxes = Axes.Both,
Size = new Vector2(0.7f, 0.9f),
});

for (int i = 0; i < item_count; i++)
{
scrollContainer.Add(new BoxWithDouble
{
Colour = new Color4(RNG.NextSingle(1), RNG.NextSingle(1), RNG.NextSingle(1), 1),
RelativeSizeAxes = Axes.X,
Height = item_height,
Y = i * item_height,
});
}
});

scrollIntoView(item_count - 2);
scrollIntoView(item_count - 1);
}

[Test]
public void TestDoublePrecision()
{
AddStep("Create scroll container", () =>
{
Add(scrollContainer = new DoubleScrollContainer
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
ScrollbarVisible = true,
RelativeSizeAxes = Axes.Both,
Size = new Vector2(0.7f, 0.9f),
});

for (int i = 0; i < item_count; i++)
{
scrollContainer.Add(new BoxWithDouble
{
Colour = new Color4(RNG.NextSingle(1), RNG.NextSingle(1), RNG.NextSingle(1), 1),
RelativeSizeAxes = Axes.X,
Height = item_height,
DoubleLocation = i * item_height,
});
}
});

scrollIntoView(item_count - 2);
scrollIntoView(item_count - 1);
}

private void scrollIntoView(int index)
{
AddStep($"scroll {index} into view", () => scrollContainer.ScrollIntoView(scrollContainer.ChildrenOfType<BoxWithDouble>().Skip(index).First()));
AddUntilStep($"{index} is visible", () => !scrollContainer.ChildrenOfType<BoxWithDouble>().Skip(index).First().IsMaskedAway);
}

public partial class DoubleScrollContainer : BasicScrollContainer
{
private readonly Container<BoxWithDouble> layoutContent;

public override void Add(Drawable drawable)
{
if (drawable is not BoxWithDouble boxWithDouble)
throw new InvalidOperationException();

Add(boxWithDouble);
}

public void Add(BoxWithDouble drawable)
{
if (drawable is not BoxWithDouble boxWithDouble)
throw new InvalidOperationException();

layoutContent.Height = (float)Math.Max(layoutContent.Height, boxWithDouble.DoubleLocation + boxWithDouble.DrawHeight);
layoutContent.Add(drawable);
}

public DoubleScrollContainer()
{
// Managing our own custom layout within ScrollContent causes feedback with internal ScrollContainer calculations,
// so we must maintain one level of separation from ScrollContent.
base.Add(layoutContent = new Container<BoxWithDouble>
{
RelativeSizeAxes = Axes.X,
});
}

public override double GetChildPosInContent(Drawable d, Vector2 offset)
{
if (d is not BoxWithDouble boxWithDouble)
return base.GetChildPosInContent(d, offset);

return boxWithDouble.DoubleLocation + offset.X;
}

protected override void ApplyCurrentToContent()
{
Debug.Assert(ScrollDirection == Direction.Vertical);

double scrollableExtent = -Current + ScrollableExtent * ScrollContent.RelativeAnchorPosition.Y;

foreach (var d in layoutContent)
d.Y = (float)(d.DoubleLocation + scrollableExtent);
}
}

public partial class BoxWithDouble : Box
{
public double DoubleLocation { get; set; }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,10 @@ public void TestManyChildren(bool instant)
AddUntilStep("repeating schedulers removed", () => !scroll.Scheduler.HasPendingTasks);
}

// Fails once in a blue moon due to loose (but maybe-not-loose-enough) timing requirements. If we break things, it will fail every time so this is fine.
[TestCase(false)]
[TestCase(true)]
[FlakyTest]
public void TestManyChildrenFunction(bool instant)
{
AddStep("create children", () =>
Expand Down
5 changes: 5 additions & 0 deletions osu.Framework.Tests/Visual/Input/TestSceneInputManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,11 @@ private void load()
setCursorConfineRect(false);

AddStep("Reset handlers", () => host.ResetInputHandlers());

AddLabel("Input handlers");

foreach (var h in host.AvailableInputHandlers)
AddToggleStep($"{h.Description} enabled", v => h.Enabled.Value = v);
}

private void setCursorSensitivityConfig(double sensitivity)
Expand Down
Loading

0 comments on commit f12005b

Please sign in to comment.