diff --git a/osu.Game.Rulesets.Catch.Tests.iOS/AppDelegate.cs b/osu.Game.Rulesets.Catch.Tests.iOS/AppDelegate.cs new file mode 100644 index 000000000000..b594d2861187 --- /dev/null +++ b/osu.Game.Rulesets.Catch.Tests.iOS/AppDelegate.cs @@ -0,0 +1,15 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using Foundation; +using osu.Framework.iOS; +using osu.Game.Tests; + +namespace osu.Game.Rulesets.Catch.Tests.iOS +{ + [Register("AppDelegate")] + public class AppDelegate : GameApplicationDelegate + { + protected override Framework.Game CreateGame() => new OsuTestBrowser(); + } +} diff --git a/osu.Game.Rulesets.Catch.Tests.iOS/Application.cs b/osu.Game.Rulesets.Catch.Tests.iOS/Program.cs similarity index 66% rename from osu.Game.Rulesets.Catch.Tests.iOS/Application.cs rename to osu.Game.Rulesets.Catch.Tests.iOS/Program.cs index d097c6a698fa..6b887ae2d4da 100644 --- a/osu.Game.Rulesets.Catch.Tests.iOS/Application.cs +++ b/osu.Game.Rulesets.Catch.Tests.iOS/Program.cs @@ -1,16 +1,15 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.iOS; -using osu.Game.Tests; +using UIKit; namespace osu.Game.Rulesets.Catch.Tests.iOS { - public static class Application + public static class Program { public static void Main(string[] args) { - GameApplication.Main(new OsuTestBrowser()); + UIApplication.Main(args, null, typeof(AppDelegate)); } } } diff --git a/osu.Game.Rulesets.Mania.Tests.iOS/AppDelegate.cs b/osu.Game.Rulesets.Mania.Tests.iOS/AppDelegate.cs new file mode 100644 index 000000000000..09bed3b42be7 --- /dev/null +++ b/osu.Game.Rulesets.Mania.Tests.iOS/AppDelegate.cs @@ -0,0 +1,15 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using Foundation; +using osu.Framework.iOS; +using osu.Game.Tests; + +namespace osu.Game.Rulesets.Mania.Tests.iOS +{ + [Register("AppDelegate")] + public class AppDelegate : GameApplicationDelegate + { + protected override Framework.Game CreateGame() => new OsuTestBrowser(); + } +} diff --git a/osu.Game.Rulesets.Mania.Tests.iOS/Application.cs b/osu.Game.Rulesets.Mania.Tests.iOS/Program.cs similarity index 66% rename from osu.Game.Rulesets.Mania.Tests.iOS/Application.cs rename to osu.Game.Rulesets.Mania.Tests.iOS/Program.cs index 75a5a7305855..696816c47ba5 100644 --- a/osu.Game.Rulesets.Mania.Tests.iOS/Application.cs +++ b/osu.Game.Rulesets.Mania.Tests.iOS/Program.cs @@ -1,16 +1,15 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.iOS; -using osu.Game.Tests; +using UIKit; namespace osu.Game.Rulesets.Mania.Tests.iOS { - public static class Application + public static class Program { public static void Main(string[] args) { - GameApplication.Main(new OsuTestBrowser()); + UIApplication.Main(args, null, typeof(AppDelegate)); } } } diff --git a/osu.Game.Rulesets.Osu.Tests.iOS/AppDelegate.cs b/osu.Game.Rulesets.Osu.Tests.iOS/AppDelegate.cs new file mode 100644 index 000000000000..77177e93f1a0 --- /dev/null +++ b/osu.Game.Rulesets.Osu.Tests.iOS/AppDelegate.cs @@ -0,0 +1,15 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using Foundation; +using osu.Framework.iOS; +using osu.Game.Tests; + +namespace osu.Game.Rulesets.Osu.Tests.iOS +{ + [Register("AppDelegate")] + public class AppDelegate : GameApplicationDelegate + { + protected override Framework.Game CreateGame() => new OsuTestBrowser(); + } +} diff --git a/osu.Game.Rulesets.Osu.Tests.iOS/Application.cs b/osu.Game.Rulesets.Osu.Tests.iOS/Program.cs similarity index 66% rename from osu.Game.Rulesets.Osu.Tests.iOS/Application.cs rename to osu.Game.Rulesets.Osu.Tests.iOS/Program.cs index f9059014a5f7..579e20e05a06 100644 --- a/osu.Game.Rulesets.Osu.Tests.iOS/Application.cs +++ b/osu.Game.Rulesets.Osu.Tests.iOS/Program.cs @@ -1,16 +1,15 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.iOS; -using osu.Game.Tests; +using UIKit; namespace osu.Game.Rulesets.Osu.Tests.iOS { - public static class Application + public static class Program { public static void Main(string[] args) { - GameApplication.Main(new OsuTestBrowser()); + UIApplication.Main(args, null, typeof(AppDelegate)); } } } diff --git a/osu.Game.Rulesets.Taiko.Tests.iOS/AppDelegate.cs b/osu.Game.Rulesets.Taiko.Tests.iOS/AppDelegate.cs new file mode 100644 index 000000000000..4bfc12e7e8d2 --- /dev/null +++ b/osu.Game.Rulesets.Taiko.Tests.iOS/AppDelegate.cs @@ -0,0 +1,15 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using Foundation; +using osu.Framework.iOS; +using osu.Game.Tests; + +namespace osu.Game.Rulesets.Taiko.Tests.iOS +{ + [Register("AppDelegate")] + public class AppDelegate : GameApplicationDelegate + { + protected override Framework.Game CreateGame() => new OsuTestBrowser(); + } +} diff --git a/osu.Game.Rulesets.Taiko.Tests.iOS/Application.cs b/osu.Game.Rulesets.Taiko.Tests.iOS/Program.cs similarity index 66% rename from osu.Game.Rulesets.Taiko.Tests.iOS/Application.cs rename to osu.Game.Rulesets.Taiko.Tests.iOS/Program.cs index 0b6a11d8c25e..bf2ffecb2357 100644 --- a/osu.Game.Rulesets.Taiko.Tests.iOS/Application.cs +++ b/osu.Game.Rulesets.Taiko.Tests.iOS/Program.cs @@ -1,16 +1,15 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.iOS; -using osu.Game.Tests; +using UIKit; namespace osu.Game.Rulesets.Taiko.Tests.iOS { - public static class Application + public static class Program { public static void Main(string[] args) { - GameApplication.Main(new OsuTestBrowser()); + UIApplication.Main(args, null, typeof(AppDelegate)); } } } diff --git a/osu.Game.Tests.iOS/AppDelegate.cs b/osu.Game.Tests.iOS/AppDelegate.cs new file mode 100644 index 000000000000..bfad59de43dc --- /dev/null +++ b/osu.Game.Tests.iOS/AppDelegate.cs @@ -0,0 +1,14 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using Foundation; +using osu.Framework.iOS; + +namespace osu.Game.Tests.iOS +{ + [Register("AppDelegate")] + public class AppDelegate : GameApplicationDelegate + { + protected override Framework.Game CreateGame() => new OsuTestBrowser(); + } +} diff --git a/osu.Game.Tests.iOS/Application.cs b/osu.Game.Tests.iOS/Program.cs similarity index 69% rename from osu.Game.Tests.iOS/Application.cs rename to osu.Game.Tests.iOS/Program.cs index e5df79f3deef..35a90d721377 100644 --- a/osu.Game.Tests.iOS/Application.cs +++ b/osu.Game.Tests.iOS/Program.cs @@ -1,15 +1,15 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.iOS; +using UIKit; namespace osu.Game.Tests.iOS { - public static class Application + public static class Program { public static void Main(string[] args) { - GameApplication.Main(new OsuTestBrowser()); + UIApplication.Main(args, null, typeof(AppDelegate)); } } } diff --git a/osu.Game/Graphics/UserInterfaceV2/FormFileSelector.cs b/osu.Game/Graphics/UserInterfaceV2/FormFileSelector.cs index 5fdf453fc4c2..a8458c98e3b5 100644 --- a/osu.Game/Graphics/UserInterfaceV2/FormFileSelector.cs +++ b/osu.Game/Graphics/UserInterfaceV2/FormFileSelector.cs @@ -24,7 +24,6 @@ using osu.Game.Graphics.Sprites; using osu.Game.Overlays; using osuTK; -using osuTK.Graphics; namespace osu.Game.Graphics.UserInterfaceV2 { @@ -38,6 +37,12 @@ public Bindable Current private readonly BindableWithCurrent current = new BindableWithCurrent(); + /// + /// Directly contains the file selected from the popover. + /// This is propagated to through . + /// + protected Bindable InternalSelection { get; } = new Bindable(); + public IEnumerable HandledExtensions => handledExtensions; private readonly string[] handledExtensions; @@ -82,13 +87,17 @@ public Bindable Current [Resolved] private OsuGameBase game { get; set; } = null!; + private ISystemFileSelector? systemFileSelector; + + protected virtual bool IsPopoverVisible => popoverState.Value == Visibility.Visible; + public FormFileSelector(params string[] handledExtensions) { this.handledExtensions = handledExtensions; } [BackgroundDependencyLoader] - private void load() + private void load(GameHost host) { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; @@ -157,63 +166,85 @@ private void load() }, }, }; + + systemFileSelector = host.CreateSystemFileSelector(handledExtensions); } protected override void LoadComplete() { base.LoadComplete(); - popoverState.BindValueChanged(_ => updateState()); - current.BindDisabledChanged(_ => updateState()); + popoverState.BindValueChanged(_ => UpdateState()); + current.BindDisabledChanged(_ => UpdateState()); current.BindValueChanged(_ => { - updateState(); - onFileSelected(); + UpdateState(); + onCurrentChanged(); }, true); + + InternalSelection.BindValueChanged(_ => OnFileSelected()); + + if (systemFileSelector != null) + systemFileSelector.Selected += f => Schedule(() => InternalSelection.Value = f); + FinishTransforms(true); game.RegisterImportHandler(this); } - private void onFileSelected() + private void onCurrentChanged() { - if (Current.Value != null) - this.HidePopover(); - initialChooserPath = Current.Value?.DirectoryName; placeholderText.Alpha = Current.Value == null ? 1 : 0; filenameText.Text = Current.Value?.Name ?? string.Empty; background.FlashColour(ColourInfo.GradientVertical(colourProvider.Background5, colourProvider.Dark2), 800, Easing.OutQuint); } + /// + /// Triggered when a file is selected from the popover. This propagates selection specified in to . + /// This can be overriden to include extra dialogs before setting . + /// + protected virtual void OnFileSelected() + { + if (InternalSelection.Value == null) + return; + + Current.Value = InternalSelection.Value; + this.HidePopover(); + } + protected override bool OnClick(ClickEvent e) { - this.ShowPopover(); + if (systemFileSelector != null) + systemFileSelector.Present(); + else + this.ShowPopover(); + return true; } protected override bool OnHover(HoverEvent e) { - updateState(); + UpdateState(); return true; } protected override void OnHoverLost(HoverLostEvent e) { base.OnHoverLost(e); - updateState(); + UpdateState(); } - private void updateState() + public void UpdateState() { caption.Colour = Current.Disabled ? colourProvider.Foreground1 : colourProvider.Content2; filenameText.Colour = Current.Disabled || Current.Value == null ? colourProvider.Foreground1 : colourProvider.Content1; if (!Current.Disabled) { - BorderThickness = IsHovered || popoverState.Value == Visibility.Visible ? 2 : 0; - BorderColour = popoverState.Value == Visibility.Visible ? colourProvider.Highlight1 : colourProvider.Light4; + BorderThickness = IsHovered || IsPopoverVisible ? 2 : 0; + BorderColour = IsPopoverVisible ? colourProvider.Highlight1 : colourProvider.Light4; - if (popoverState.Value == Visibility.Visible) + if (IsPopoverVisible) background.Colour = ColourInfo.GradientVertical(colourProvider.Background5, colourProvider.Dark3); else if (IsHovered) background.Colour = ColourInfo.GradientVertical(colourProvider.Background5, colourProvider.Dark4); @@ -242,11 +273,12 @@ Task ICanAcceptFiles.Import(params string[] paths) Task ICanAcceptFiles.Import(ImportTask[] tasks, ImportParameters parameters) => throw new NotImplementedException(); - protected virtual FileChooserPopover CreatePopover(string[] handledExtensions, Bindable current, string? chooserPath) => new FileChooserPopover(handledExtensions, current, chooserPath); + protected virtual FileChooserPopover CreatePopover(string[] handledExtensions, Bindable current, string? chooserPath) => + new FileChooserPopover(handledExtensions, current, chooserPath); public Popover GetPopover() { - var popover = CreatePopover(handledExtensions, Current, initialChooserPath); + var popover = CreatePopover(handledExtensions, InternalSelection, initialChooserPath); popoverState.UnbindBindings(); popoverState.BindTo(popover.State); return popover; @@ -257,10 +289,6 @@ protected partial class FileChooserPopover : OsuPopover protected override string PopInSampleName => "UI/overlay-big-pop-in"; protected override string PopOutSampleName => "UI/overlay-big-pop-out"; - private readonly Bindable current = new Bindable(); - - protected OsuFileSelector FileSelector; - public FileChooserPopover(string[] handledExtensions, Bindable current, string? chooserPath) : base(false) { @@ -270,48 +298,20 @@ public FileChooserPopover(string[] handledExtensions, Bindable curren // simplest solution to avoid underlying text to bleed through the bottom border // https://github.com/ppy/osu/pull/30005#issuecomment-2378884430 Padding = new MarginPadding { Bottom = 1 }, - Child = FileSelector = new OsuFileSelector(chooserPath, handledExtensions) + Child = new OsuFileSelector(chooserPath, handledExtensions) { RelativeSizeAxes = Axes.Both, - }, + CurrentFile = { BindTarget = current }, + } }; - - this.current.BindTo(current); } [BackgroundDependencyLoader] private void load(OverlayColourProvider colourProvider) { - Add(new Container - { - RelativeSizeAxes = Axes.Both, - Masking = true, - BorderThickness = 2, - CornerRadius = 10, - BorderColour = colourProvider.Highlight1, - Children = new Drawable[] - { - new Box - { - Colour = Color4.Transparent, - RelativeSizeAxes = Axes.Both, - }, - } - }); - } - - protected override void LoadComplete() - { - base.LoadComplete(); - - FileSelector.CurrentFile.ValueChanged += f => - { - if (f.NewValue != null) - OnFileSelected(f.NewValue); - }; + Body.BorderColour = colourProvider.Highlight1; + Body.BorderThickness = 2; } - - protected virtual void OnFileSelected(FileInfo file) => current.Value = file; } } } diff --git a/osu.Game/Graphics/UserInterfaceV2/OsuFileSelector.cs b/osu.Game/Graphics/UserInterfaceV2/OsuFileSelector.cs index addea5c4a9cd..8c6477090b8b 100644 --- a/osu.Game/Graphics/UserInterfaceV2/OsuFileSelector.cs +++ b/osu.Game/Graphics/UserInterfaceV2/OsuFileSelector.cs @@ -29,7 +29,7 @@ public OsuFileSelector(string? initialPath = null, string[]? validFileExtensions [BackgroundDependencyLoader] private void load(OverlayColourProvider colourProvider) { - AddInternal(new Box + TopLevelContent.Add(new Box { RelativeSizeAxes = Axes.Both, Colour = colourProvider.Background5, diff --git a/osu.Game/Screens/Edit/Setup/FormBeatmapFileSelector.cs b/osu.Game/Screens/Edit/Setup/FormBeatmapFileSelector.cs index 53287383ec2a..417cec738388 100644 --- a/osu.Game/Screens/Edit/Setup/FormBeatmapFileSelector.cs +++ b/osu.Game/Screens/Edit/Setup/FormBeatmapFileSelector.cs @@ -1,14 +1,14 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System.Diagnostics; -using System.IO; +using System; using osu.Framework.Allocation; using osu.Framework.Bindables; -using osu.Framework.Extensions.Color4Extensions; +using osu.Framework.Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.Cursor; +using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterfaceV2; @@ -32,123 +32,117 @@ public partial class FormBeatmapFileSelector : FormFileSelector public readonly Bindable ApplyToAllDifficulties = new Bindable(true); + private SelectionScopePopoverTarget selectionScopeTarget = null!; + + protected override bool IsPopoverVisible => base.IsPopoverVisible || selectionScopeTarget.PopoverState.Value == Visibility.Visible; + public FormBeatmapFileSelector(bool beatmapHasMultipleDifficulties, params string[] handledExtensions) : base(handledExtensions) { this.beatmapHasMultipleDifficulties = beatmapHasMultipleDifficulties; } - protected override FileChooserPopover CreatePopover(string[] handledExtensions, Bindable current, string? chooserPath) + [BackgroundDependencyLoader] + private void load() { - var popover = new BeatmapFileChooserPopover(handledExtensions, current, chooserPath, beatmapHasMultipleDifficulties); - popover.ApplyToAllDifficulties.BindTo(ApplyToAllDifficulties); - return popover; + AddInternal(selectionScopeTarget = new SelectionScopePopoverTarget + { + RelativeSizeAxes = Axes.Both, + }); } - private partial class BeatmapFileChooserPopover : FileChooserPopover + protected override void LoadComplete() { - private readonly bool beatmapHasMultipleDifficulties; + base.LoadComplete(); + selectionScopeTarget.PopoverState.BindValueChanged(_ => UpdateState(), true); + } - public readonly Bindable ApplyToAllDifficulties = new Bindable(true); + protected override void OnFileSelected() + { + if (InternalSelection.Value == null) + return; - private Container selectApplicationScopeContainer = null!; + if (!beatmapHasMultipleDifficulties) + { + base.OnFileSelected(); + return; + } - public BeatmapFileChooserPopover(string[] handledExtensions, Bindable current, string? chooserPath, bool beatmapHasMultipleDifficulties) - : base(handledExtensions, current, chooserPath) + selectionScopeTarget.ShowPopover(); + selectionScopeTarget.OnSelected = v => { - this.beatmapHasMultipleDifficulties = beatmapHasMultipleDifficulties; + ApplyToAllDifficulties.Value = v; + base.OnFileSelected(); + }; + } + + public partial class SelectionScopePopoverTarget : Drawable, IHasPopover + { + public Action? OnSelected; + + public readonly Bindable PopoverState = new Bindable(); + + public Popover GetPopover() + { + var popover = new SelectionScopePopover(v => OnSelected?.Invoke(v)); + PopoverState.UnbindBindings(); + PopoverState.BindTo(popover.State); + return popover; + } + } + + private partial class SelectionScopePopover : OsuPopover + { + private readonly Action onSelected; + + public SelectionScopePopover(Action onSelected) + { + this.onSelected = onSelected; } [BackgroundDependencyLoader] - private void load(OverlayColourProvider colourProvider, OsuColour colours) + private void load(OsuColour colours, OverlayColourProvider colourProvider) { - Add(selectApplicationScopeContainer = new InputBlockingContainer + AutoSizeAxes = Axes.Both; + + Body.BorderColour = colourProvider.Highlight1; + Body.BorderThickness = 2; + + Child = new FillFlowContainer { - Alpha = 0f, - RelativeSizeAxes = Axes.Both, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + AutoSizeAxes = Axes.Both, + Direction = FillDirection.Vertical, + Spacing = new Vector2(0f, 10f), Children = new Drawable[] { - new Box + new OsuSpriteText + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Text = EditorSetupStrings.ApplicationScopeSelectionTitle, + Margin = new MarginPadding { Bottom = 20f }, + }, + new RoundedButton { - Colour = colourProvider.Background6.Opacity(0.9f), - RelativeSizeAxes = Axes.Both, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Width = 300f, + Text = EditorSetupStrings.ApplyToAllDifficulties, + Action = () => onSelected(true), + BackgroundColour = colours.Red2, }, - new Container + new RoundedButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, - Masking = true, - CornerRadius = 10f, - AutoSizeAxes = Axes.Both, - Children = new Drawable[] - { - new Box - { - Colour = colourProvider.Background5, - RelativeSizeAxes = Axes.Both, - }, - new FillFlowContainer - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - AutoSizeAxes = Axes.Both, - Direction = FillDirection.Vertical, - Spacing = new Vector2(0f, 10f), - Margin = new MarginPadding(30), - Children = new Drawable[] - { - new OsuSpriteText - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Text = EditorSetupStrings.ApplicationScopeSelectionTitle, - Margin = new MarginPadding { Bottom = 20f }, - }, - new RoundedButton - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Width = 300f, - Text = EditorSetupStrings.ApplyToAllDifficulties, - Action = () => - { - ApplyToAllDifficulties.Value = true; - updateFileSelection(); - }, - BackgroundColour = colours.Red2, - }, - new RoundedButton - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Width = 300f, - Text = EditorSetupStrings.ApplyToThisDifficulty, - Action = () => - { - ApplyToAllDifficulties.Value = false; - updateFileSelection(); - }, - }, - } - } - } + Width = 300f, + Text = EditorSetupStrings.ApplyToThisDifficulty, + Action = () => onSelected(false), }, } - }); - } - - protected override void OnFileSelected(FileInfo file) - { - if (beatmapHasMultipleDifficulties) - selectApplicationScopeContainer.FadeIn(200, Easing.InQuint); - else - base.OnFileSelected(file); - } - - private void updateFileSelection() - { - Debug.Assert(FileSelector.CurrentFile.Value != null); - base.OnFileSelected(FileSelector.CurrentFile.Value); + }; } } } diff --git a/osu.iOS/AppDelegate.cs b/osu.iOS/AppDelegate.cs new file mode 100644 index 000000000000..e88b39f710f0 --- /dev/null +++ b/osu.iOS/AppDelegate.cs @@ -0,0 +1,14 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using Foundation; +using osu.Framework.iOS; + +namespace osu.iOS +{ + [Register("AppDelegate")] + public class AppDelegate : GameApplicationDelegate + { + protected override Framework.Game CreateGame() => new OsuGameIOS(); + } +} diff --git a/osu.iOS/Application.cs b/osu.iOS/Program.cs similarity index 69% rename from osu.iOS/Application.cs rename to osu.iOS/Program.cs index 74bd58acb865..fd24ecf4198f 100644 --- a/osu.iOS/Application.cs +++ b/osu.iOS/Program.cs @@ -1,15 +1,15 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.iOS; +using UIKit; namespace osu.iOS { - public static class Application + public static class Program { public static void Main(string[] args) { - GameApplication.Main(new OsuGameIOS()); + UIApplication.Main(args, null, typeof(AppDelegate)); } } }