Browse Source

Make Application to be an AvaloniaObject. With properties and stuff.

pull/2978/head
Nikita Tsukanov 7 years ago
parent
commit
ef7e8f2107
  1. 6
      src/Android/Avalonia.Android/AndroidPlatform.cs
  2. 50
      src/Avalonia.Controls/AppBuilderBase.cs
  3. 2
      src/Avalonia.Controls/Application.cs
  4. 3
      src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs
  5. 11
      src/Avalonia.DesktopRuntime/AppBuilder.cs
  6. 3
      src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs
  7. 2
      src/iOS/Avalonia.iOS/AppBuilder.cs

6
src/Android/Avalonia.Android/AndroidPlatform.cs

@ -17,7 +17,7 @@ namespace Avalonia
{ {
public static T UseAndroid<T>(this T builder) where T : AppBuilderBase<T>, new() public static T UseAndroid<T>(this T builder) where T : AppBuilderBase<T>, new()
{ {
builder.UseWindowingSubsystem(() => Android.AndroidPlatform.Initialize(builder.Instance), "Android"); builder.UseWindowingSubsystem(() => Android.AndroidPlatform.Initialize(builder.ApplicationType), "Android");
builder.UseSkia(); builder.UseSkia();
return builder; return builder;
} }
@ -41,7 +41,7 @@ namespace Avalonia.Android
_scalingFactor = global::Android.App.Application.Context.Resources.DisplayMetrics.ScaledDensity; _scalingFactor = global::Android.App.Application.Context.Resources.DisplayMetrics.ScaledDensity;
} }
public static void Initialize(Avalonia.Application app) public static void Initialize(Type appType)
{ {
AvaloniaLocator.CurrentMutable AvaloniaLocator.CurrentMutable
.Bind<IClipboard>().ToTransient<ClipboardImpl>() .Bind<IClipboard>().ToTransient<ClipboardImpl>()
@ -55,7 +55,7 @@ namespace Avalonia.Android
.Bind<IRenderTimer>().ToConstant(new DefaultRenderTimer(60)) .Bind<IRenderTimer>().ToConstant(new DefaultRenderTimer(60))
.Bind<IRenderLoop>().ToConstant(new RenderLoop()) .Bind<IRenderLoop>().ToConstant(new RenderLoop())
.Bind<PlatformHotkeyConfiguration>().ToSingleton<PlatformHotkeyConfiguration>() .Bind<PlatformHotkeyConfiguration>().ToSingleton<PlatformHotkeyConfiguration>()
.Bind<IAssetLoader>().ToConstant(new AssetLoader(app.GetType().Assembly)); .Bind<IAssetLoader>().ToConstant(new AssetLoader(appType.Assembly));
SkiaPlatform.Initialize(); SkiaPlatform.Initialize();
((global::Android.App.Application) global::Android.App.Application.Context.ApplicationContext) ((global::Android.App.Application) global::Android.App.Application.Context.ApplicationContext)

50
src/Avalonia.Controls/AppBuilderBase.cs

@ -18,7 +18,9 @@ namespace Avalonia.Controls
{ {
private static bool s_setupWasAlreadyCalled; private static bool s_setupWasAlreadyCalled;
private Action _optionsInitializers; private Action _optionsInitializers;
private Func<Application> _appFactory;
private IApplicationLifetime _lifetime;
/// <summary> /// <summary>
/// Gets or sets the <see cref="IRuntimePlatform"/> instance. /// Gets or sets the <see cref="IRuntimePlatform"/> instance.
/// </summary> /// </summary>
@ -30,10 +32,15 @@ namespace Avalonia.Controls
public Action RuntimePlatformServicesInitializer { get; private set; } public Action RuntimePlatformServicesInitializer { get; private set; }
/// <summary> /// <summary>
/// Gets or sets the <see cref="Application"/> instance being initialized. /// Gets the <see cref="Application"/> instance being initialized.
/// </summary> /// </summary>
public Application Instance { get; protected set; } public Application Instance { get; private set; }
/// <summary>
/// Gets the type of the Instance (even if it's not created yet)
/// </summary>
public Type ApplicationType { get; private set; }
/// <summary> /// <summary>
/// Gets or sets a method to call the initialize the windowing subsystem. /// Gets or sets a method to call the initialize the windowing subsystem.
/// </summary> /// </summary>
@ -76,20 +83,11 @@ namespace Avalonia.Controls
public static TAppBuilder Configure<TApp>() public static TAppBuilder Configure<TApp>()
where TApp : Application, new() where TApp : Application, new()
{ {
return Configure(new TApp());
}
/// <summary>
/// Begin configuring an <see cref="Application"/>.
/// </summary>
/// <returns>An <typeparamref name="TAppBuilder"/> instance.</returns>
public static TAppBuilder Configure(Application app)
{
AvaloniaLocator.CurrentMutable.BindToSelf(app);
return new TAppBuilder() return new TAppBuilder()
{ {
Instance = app, ApplicationType = typeof(TApp),
// Needed for CoreRT compatibility
_appFactory = () => new TApp()
}; };
} }
@ -157,6 +155,18 @@ namespace Avalonia.Controls
return Self; return Self;
} }
/// <summary>
/// Sets up the platform-specific services for the application and initialized it with a particular lifetime, but does not run it.
/// </summary>
/// <param name="lifetime"></param>
/// <returns></returns>
public TAppBuilder SetupWithLifetime(IApplicationLifetime lifetime)
{
_lifetime = lifetime;
Setup();
return Self;
}
/// <summary> /// <summary>
/// Specifies a windowing subsystem to use. /// Specifies a windowing subsystem to use.
/// </summary> /// </summary>
@ -254,11 +264,6 @@ namespace Avalonia.Controls
/// </summary> /// </summary>
private void Setup() private void Setup()
{ {
if (Instance == null)
{
throw new InvalidOperationException("No App instance configured.");
}
if (RuntimePlatformServicesInitializer == null) if (RuntimePlatformServicesInitializer == null)
{ {
throw new InvalidOperationException("No runtime platform services configured."); throw new InvalidOperationException("No runtime platform services configured.");
@ -282,6 +287,9 @@ namespace Avalonia.Controls
s_setupWasAlreadyCalled = true; s_setupWasAlreadyCalled = true;
_optionsInitializers?.Invoke(); _optionsInitializers?.Invoke();
RuntimePlatformServicesInitializer(); RuntimePlatformServicesInitializer();
Instance = _appFactory();
Instance.ApplicationLifetime = _lifetime;
AvaloniaLocator.CurrentMutable.BindToSelf(Instance);
WindowingSubsystemInitializer(); WindowingSubsystemInitializer();
RenderingSubsystemInitializer(); RenderingSubsystemInitializer();
AfterPlatformServicesSetupCallback(Self); AfterPlatformServicesSetupCallback(Self);

2
src/Avalonia.Controls/Application.cs

@ -32,7 +32,7 @@ namespace Avalonia
/// method. /// method.
/// - Tracks the lifetime of the application. /// - Tracks the lifetime of the application.
/// </remarks> /// </remarks>
public class Application : IGlobalDataTemplates, IGlobalStyles, IStyleRoot, IResourceNode public class Application : AvaloniaObject, IGlobalDataTemplates, IGlobalStyles, IStyleRoot, IResourceNode
{ {
/// <summary> /// <summary>
/// The application-global data templates. /// The application-global data templates.

3
src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs

@ -125,8 +125,7 @@ namespace Avalonia
where T : AppBuilderBase<T>, new() where T : AppBuilderBase<T>, new()
{ {
var lifetime = new ClassicDesktopStyleApplicationLifetime(builder.Instance) {ShutdownMode = shutdownMode}; var lifetime = new ClassicDesktopStyleApplicationLifetime(builder.Instance) {ShutdownMode = shutdownMode};
builder.Instance.ApplicationLifetime = lifetime; builder.SetupWithLifetime(lifetime);
builder.SetupWithoutStarting();
return lifetime.Start(args); return lifetime.Start(args);
} }
} }

11
src/Avalonia.DesktopRuntime/AppBuilder.cs

@ -18,19 +18,10 @@ namespace Avalonia
/// </summary> /// </summary>
public AppBuilder() public AppBuilder()
: base(new StandardRuntimePlatform(), : base(new StandardRuntimePlatform(),
builder => StandardRuntimePlatformServices.Register(builder.Instance?.GetType()?.Assembly)) builder => StandardRuntimePlatformServices.Register(builder.ApplicationType.Assembly))
{ {
} }
/// <summary>
/// Initializes a new instance of the <see cref="AppBuilder"/> class.
/// </summary>
/// <param name="app">The <see cref="Application"/> instance.</param>
public AppBuilder(Application app) : this()
{
Instance = app;
}
bool CheckEnvironment(Type checkerType) bool CheckEnvironment(Type checkerType)
{ {
if (checkerType == null) if (checkerType == null)

3
src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs

@ -118,8 +118,7 @@ public static class LinuxFramebufferPlatformExtensions
where T : AppBuilderBase<T>, new() where T : AppBuilderBase<T>, new()
{ {
var lifetime = LinuxFramebufferPlatform.Initialize(builder, backend); var lifetime = LinuxFramebufferPlatform.Initialize(builder, backend);
builder.Instance.ApplicationLifetime = lifetime; builder.SetupWithLifetime(lifetime);
builder.SetupWithoutStarting();
lifetime.Start(args); lifetime.Start(args);
builder.Instance.Run(lifetime.Token); builder.Instance.Run(lifetime.Token);
return lifetime.ExitCode; return lifetime.ExitCode;

2
src/iOS/Avalonia.iOS/AppBuilder.cs

@ -6,7 +6,7 @@ namespace Avalonia
public class AppBuilder : AppBuilderBase<AppBuilder> public class AppBuilder : AppBuilderBase<AppBuilder>
{ {
public AppBuilder() : base(new StandardRuntimePlatform(), public AppBuilder() : base(new StandardRuntimePlatform(),
builder => StandardRuntimePlatformServices.Register(builder.Instance?.GetType().Assembly)) builder => StandardRuntimePlatformServices.Register(builder.ApplicationType.Assembly))
{ {
} }

Loading…
Cancel
Save