Browse Source

Merge pull request #1251 from AvaloniaUI/appbuilder-setup-run

Appbuilder setup run
pull/1337/head
Jeremy Koritzinsky 9 years ago
committed by GitHub
parent
commit
fca2762d36
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 20
      src/Avalonia.Controls/AppBuilderBase.cs
  2. 9
      src/Avalonia.Controls/Application.cs
  3. 6
      tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs

20
src/Avalonia.Controls/AppBuilderBase.cs

@ -14,6 +14,8 @@ namespace Avalonia.Controls
/// <typeparam name="TAppBuilder">The type of the AppBuilder class itself.</typeparam>
public abstract class AppBuilderBase<TAppBuilder> where TAppBuilder : AppBuilderBase<TAppBuilder>, new()
{
private static bool s_setupWasAlreadyCalled;
/// <summary>
/// Gets or sets the <see cref="IRuntimePlatform"/> instance.
/// </summary>
@ -207,6 +209,17 @@ namespace Avalonia.Controls
public TAppBuilder UseAvaloniaModules() => AfterSetup(builder => SetupAvaloniaModules());
private bool CheckSetup { get; set; } = true;
/// <summary>
/// Set this AppBuilder to ignore the setup check. Used for testing purposes.
/// </summary>
internal TAppBuilder IgnoreSetupCheck()
{
CheckSetup = false;
return Self;
}
private void SetupAvaloniaModules()
{
var moduleInitializers = from assembly in AvaloniaLocator.Current.GetService<IRuntimePlatform>().GetLoadedAssemblies()
@ -252,6 +265,13 @@ namespace Avalonia.Controls
throw new InvalidOperationException("No rendering system configured.");
}
if (s_setupWasAlreadyCalled && CheckSetup)
{
throw new InvalidOperationException("Setup was already called on one of AppBuilder instances");
}
s_setupWasAlreadyCalled = true;
Instance.RegisterServices();
RuntimePlatformServicesInitializer();
WindowingSubsystemInitializer();

9
src/Avalonia.Controls/Application.cs

@ -175,6 +175,15 @@ namespace Avalonia
closable.Closed += (s, e) => source.Cancel();
Dispatcher.UIThread.MainLoop(source.Token);
}
/// <summary>
/// Runs the application's main loop until the <see cref="CancellationToken"/> is cancelled.
/// </summary>
/// <param name="token">The token to track</param>
public void Run(CancellationToken token)
{
Dispatcher.UIThread.MainLoop(token);
}
/// <summary>
/// Exits the application

6
tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs

@ -65,6 +65,7 @@ namespace Avalonia.Controls.UnitTests
{
ResetModuleLoadStates();
AppBuilder.Configure<App>()
.IgnoreSetupCheck()
.UseWindowingSubsystem(() => { })
.UseRenderingSubsystem(() => { })
.UseAvaloniaModules()
@ -81,6 +82,7 @@ namespace Avalonia.Controls.UnitTests
{
ResetModuleLoadStates();
var builder = AppBuilder.Configure<App>()
.IgnoreSetupCheck()
.UseWindowingSubsystem(() => { })
.UseRenderingSubsystem(() => { }, "Direct2D1");
builder.UseAvaloniaModules().SetupWithoutStarting();
@ -90,6 +92,7 @@ namespace Avalonia.Controls.UnitTests
ResetModuleLoadStates();
builder = AppBuilder.Configure<App>()
.IgnoreSetupCheck()
.UseWindowingSubsystem(() => { })
.UseRenderingSubsystem(() => { }, "Skia");
builder.UseAvaloniaModules().SetupWithoutStarting();
@ -99,13 +102,14 @@ namespace Avalonia.Controls.UnitTests
}
}
[Fact (Skip = "We don't have rendering modules with dependencies right now")]
[Fact]
public void LoadsRenderingModuleWithoutDependenciesWhenNoModuleMatches()
{
using (AvaloniaLocator.EnterScope())
{
ResetModuleLoadStates();
var builder = AppBuilder.Configure<App>()
.IgnoreSetupCheck()
.UseWindowingSubsystem(() => { })
.UseRenderingSubsystem(() => { }, "TBD");
builder.UseAvaloniaModules().SetupWithoutStarting();

Loading…
Cancel
Save