Move initialization logic into MatterControlApplication

This commit is contained in:
John Lewin 2017-12-16 20:06:03 -08:00
parent 622607b710
commit 93f215e5c6
4 changed files with 113 additions and 140 deletions

View file

@ -124,11 +124,6 @@ namespace MatterHackers.MatterControl
public const string EnvironmentName = "";
#endif
/// <summary>
/// Allows application components to hook initial SystemWindow Load event without an existing Widget instance
/// </summary>
public static event EventHandler Load;
public bool ApplicationExiting { get; internal set; } = false;
public static Func<string, Task<Dictionary<string, string>>> GetProfileHistory;
@ -743,7 +738,7 @@ namespace MatterHackers.MatterControl
ApplicationSettings.Instance.ReleaseClientToken();
}
static void LoadOemOrDefaultTheme()
internal static void LoadOemOrDefaultTheme()
{
// if not check for the oem color and use it if set
// else default to "Blue - Light"
@ -764,26 +759,15 @@ namespace MatterHackers.MatterControl
{
if (globalInstance == null)
{
//using (new PerformanceTimer("Startup", "AppController Instance"))
globalInstance = new ApplicationController();
ActiveSliceSettings.ActivePrinterChanged.RegisterEvent((s, e) =>
{
globalInstance = new ApplicationController();
// Set the default theme colors
LoadOemOrDefaultTheme();
// Accessing any property on ProfileManager will run the static constructor and spin up the ProfileManager instance
bool na = ProfileManager.Instance.IsGuestProfile;
globalInstance.MainView = new DesktopView();
ActiveSliceSettings.ActivePrinterChanged.RegisterEvent((s, e) =>
if (!MatterControlApplication.IsLoading)
{
if (!MatterControlApplication.IsLoading)
{
ApplicationController.Instance.ReloadAll();
}
}, ref globalInstance.unregisterEvents);
}
ApplicationController.Instance.ReloadAll();
}
}, ref globalInstance.unregisterEvents);
}
return globalInstance;
}
@ -863,67 +847,6 @@ namespace MatterHackers.MatterControl
}
}
public void OnLoadActions()
{
Load?.Invoke(this, null);
// Pushing this after load fixes that empty printer list
ApplicationController.Instance.UserChanged();
bool showAuthWindow = PrinterSetup.ShouldShowAuthPanel?.Invoke() ?? false;
if (showAuthWindow)
{
if (ApplicationSettings.Instance.get(ApplicationSettingsKey.SuppressAuthPanel) != "True")
{
//Launch window to prompt user to sign in
UiThread.RunOnIdle(() => DialogWindow.Show(PrinterSetup.GetBestStartPage()));
}
}
else
{
//If user in logged in sync before checking to prompt to create printer
if (ApplicationController.SyncPrinterProfiles == null)
{
RunSetupIfRequired();
}
else
{
ApplicationController.SyncPrinterProfiles.Invoke("ApplicationController.OnLoadActions()", null).ContinueWith((task) =>
{
RunSetupIfRequired();
});
}
}
if (AggContext.OperatingSystem == OSType.Android)
{
// show this last so it is on top
if (UserSettings.Instance.get("SoftwareLicenseAccepted") != "true")
{
UiThread.RunOnIdle(() => DialogWindow.Show<LicenseAgreementPage>());
}
}
if (this.ActivePrinter.Settings.PrinterSelected
&& this.ActivePrinter.Settings.GetValue<bool>(SettingsKey.auto_connect))
{
UiThread.RunOnIdle(() =>
{
//PrinterConnectionAndCommunication.Instance.HaltConnectionThread();
this.ActivePrinter.Connection.Connect();
}, 2);
}
}
private static void RunSetupIfRequired()
{
if (!ProfileManager.Instance.ActiveProfiles.Any())
{
// Start the setup wizard if no profiles exist
UiThread.RunOnIdle(() => DialogWindow.Show(PrinterSetup.GetBestStartPage()));
}
}
private EventHandler unregisterEvent;
public Stream LoadHttpAsset(string url)

View file

@ -45,6 +45,7 @@ using MatterHackers.MatterControl.DataStorage;
using MatterHackers.MatterControl.PartPreviewWindow;
using MatterHackers.MatterControl.PluginSystem;
using MatterHackers.MatterControl.PrinterCommunication;
using MatterHackers.MatterControl.PrinterControls.PrinterConnections;
using MatterHackers.MatterControl.PrintQueue;
using MatterHackers.MatterControl.SlicerConfiguration;
using MatterHackers.PolygonMesh.Processors;
@ -53,7 +54,7 @@ using Mindscape.Raygun4Net;
namespace MatterHackers.MatterControl
{
public class MatterControlApplication : GuiWidget
public static class MatterControlApplication
{
#if DEBUG
@ -65,18 +66,12 @@ namespace MatterHackers.MatterControl
#endif
public static bool CameraInUseByExternalProcess { get; set; } = false;
public bool RestartOnClose = false;
private string[] commandLineArgs = null;
private static string[] commandLineArgs = null;
public static bool IsLoading { get; private set; } = true;
public static void RequestPowerShutDown()
{
// does nothing on windows
}
static MatterControlApplication()
public static GuiWidget Initialize(SystemWindow systemWindow, Action<string> reporter)
{
if (AggContext.OperatingSystem == OSType.Mac && AggContext.StaticData == null)
{
@ -86,27 +81,21 @@ namespace MatterHackers.MatterControl
Directory.SetCurrentDirectory(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location));
}
// Because fields on this class call localization methods and because those methods depend on the StaticData provider and because the field
// initializers run before the class constructor, we need to init the platform specific provider in the static constructor (or write a custom initializer method)
//
// Initialize a standard file system backed StaticData provider
if (AggContext.StaticData == null) // it may already be initialized by tests
{
reporter?.Invoke( "StaticData");
AggContext.StaticData = new MatterHackers.Agg.FileSystemStaticData();
}
}
public MatterControlApplication(double width, double height)
: base(width, height)
{
this.Name = "MatterControlApplication Widget";
ApplicationSettings.Instance.set("HardwareHasCamera", "false");
// TODO: Appears to be unused and should be removed
// set this at startup so that we can tell next time if it got set to true in close
UserSettings.Instance.Fields.StartCount = UserSettings.Instance.Fields.StartCount + 1;
this.commandLineArgs = Environment.GetCommandLineArgs();
var commandLineArgs = Environment.GetCommandLineArgs();
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
for (int currentCommandIndex = 0; currentCommandIndex < commandLineArgs.Length; currentCommandIndex++)
@ -127,40 +116,31 @@ namespace MatterHackers.MatterControl
DesktopRootSystemWindow.ShowMemoryUsed = true;
break;
}
if (MeshFileIo.ValidFileExtensions().Contains(Path.GetExtension(command).ToUpper()))
{
// If we are the only instance running then do nothing.
// Else send these to the running instance so it can load them.
}
}
using (new PerformanceTimer("Startup", "MainView"))
{
this.AddChild(ApplicationController.Instance.MainView);
}
reporter?.Invoke("ApplicationController");
var na = ApplicationController.Instance;
this.AnchorAll();
// Set the default theme colors
reporter?.Invoke("LoadOemOrDefaultTheme");
ApplicationController.LoadOemOrDefaultTheme();
UiThread.RunOnIdle(CheckOnPrinter);
}
// Accessing any property on ProfileManager will run the static constructor and spin up the ProfileManager instance
reporter?.Invoke("ProfileManager");
bool na2 = ProfileManager.Instance.IsGuestProfile;
public override void OnLoad(EventArgs args)
{
// Moved from OnParentChanged
if (File.Exists("RunUnitTests.txt"))
{
//DiagnosticWidget diagnosticView = new DiagnosticWidget(this);
}
reporter?.Invoke("MainView");
ApplicationController.Instance.MainView = new DesktopView();
// now that we are all set up lets load our plugins and allow them their chance to set things up
FindAndInstantiatePlugins();
reporter?.Invoke("Plugins");
FindAndInstantiatePlugins(systemWindow);
if (ApplicationController.Instance.PluginsLoaded != null)
{
ApplicationController.Instance.PluginsLoaded.CallEvents(null, null);
}
// TODO: Do we still want to support command line arguments for adding to the queue?
foreach (string arg in commandLineArgs)
{
string argExtension = Path.GetExtension(arg).ToUpper();
@ -171,19 +151,86 @@ namespace MatterHackers.MatterControl
}
}
ApplicationController.Instance.OnLoadActions();
AfterLoad();
return ApplicationController.Instance.MainView;
}
public static void AfterLoad()
{
UiThread.RunOnIdle(CheckOnPrinter);
// ApplicationController.Instance.OnLoadActions {{
// TODO: Calling UserChanged seems wrong. Load the right user before we spin up controls, rather than after
// Pushing this after load fixes that empty printer list
ApplicationController.Instance.UserChanged();
bool showAuthWindow = PrinterSetup.ShouldShowAuthPanel?.Invoke() ?? false;
if (showAuthWindow)
{
if (ApplicationSettings.Instance.get(ApplicationSettingsKey.SuppressAuthPanel) != "True")
{
//Launch window to prompt user to sign in
UiThread.RunOnIdle(() => DialogWindow.Show(PrinterSetup.GetBestStartPage()));
}
}
else
{
//If user in logged in sync before checking to prompt to create printer
if (ApplicationController.SyncPrinterProfiles == null)
{
RunSetupIfRequired();
}
else
{
ApplicationController.SyncPrinterProfiles.Invoke("ApplicationController.OnLoadActions()", null).ContinueWith((task) =>
{
RunSetupIfRequired();
});
}
}
if (AggContext.OperatingSystem == OSType.Android)
{
// show this last so it is on top
if (UserSettings.Instance.get("SoftwareLicenseAccepted") != "true")
{
UiThread.RunOnIdle(() => DialogWindow.Show<LicenseAgreementPage>());
}
}
if (ApplicationController.Instance.ActivePrinter is PrinterConfig printer
&& printer.Settings.PrinterSelected
&& printer.Settings.GetValue<bool>(SettingsKey.auto_connect))
{
UiThread.RunOnIdle(() =>
{
//PrinterConnectionAndCommunication.Instance.HaltConnectionThread();
printer.Connection.Connect();
}, 2);
}
// ApplicationController.Instance.OnLoadActions }}
//HtmlWindowTest();
IsLoading = false;
base.OnLoad(args);
}
private void CheckOnPrinter()
private static void RunSetupIfRequired()
{
if (!ProfileManager.Instance.ActiveProfiles.Any())
{
// Start the setup wizard if no profiles exist
UiThread.RunOnIdle(() => DialogWindow.Show(PrinterSetup.GetBestStartPage()));
}
}
private static void CheckOnPrinter()
{
try
{
// TODO: UiThread should not be driving anything in Printer.Connection
ApplicationController.Instance.ActivePrinter.Connection.OnIdle();
}
catch (Exception e)
@ -197,7 +244,7 @@ namespace MatterHackers.MatterControl
UiThread.RunOnIdle(CheckOnPrinter);
}
private void FindAndInstantiatePlugins()
private static void FindAndInstantiatePlugins(SystemWindow systemWindow)
{
#if false
string pluginDirectory = Path.Combine("..", "..", "..", "MatterControlPlugins", "bin");
@ -214,7 +261,6 @@ namespace MatterHackers.MatterControl
// TODO: this should look in a plugin folder rather than just the application directory (we probably want it in the user folder).
PluginFinder<MatterControlPlugin> pluginFinder = new PluginFinder<MatterControlPlugin>(pluginDirectory);
#endif
string oemName = ApplicationSettings.Instance.GetOEMName();
foreach (MatterControlPlugin plugin in PluginFinder.CreateInstancesOf<MatterControlPlugin>())
{
@ -225,12 +271,12 @@ namespace MatterHackers.MatterControl
{
if (nameValuePairs["OEM"] == oemName)
{
plugin.Initialize(this);
plugin.Initialize(systemWindow);
}
}
else
{
plugin.Initialize(this);
plugin.Initialize(systemWindow);
}
}
}

View file

@ -33,7 +33,6 @@ namespace MatterHackers.MatterControl
// Make sure we have the right working directory as we assume everything relative to the executable.
Directory.SetCurrentDirectory(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location));
Datastore.Instance.Initialize();
#if !DEBUG
// Conditionally spin up error reporting if not on the Stable channel
@ -63,17 +62,17 @@ namespace MatterHackers.MatterControl
{
UiThread.RunOnIdle(() =>
{
var matterControl = new MatterControlApplication(-1, -1);
Datastore.Instance.Initialize();
var mainView = MatterControlApplication.Initialize(systemWindow, ReportStartupProgress);
Console.WriteLine("Time to MatterControlApplication.Instance init: " + timer.Elapsed.TotalSeconds);
systemWindow.RemoveAllChildren();
systemWindow.AddChild(matterControl);
systemWindow.AddChild(mainView);
Console.WriteLine("Time to MatterControlApplication Layout: " + timer.Elapsed.TotalSeconds);
systemWindow.Invalidate();
});
};
@ -81,6 +80,12 @@ namespace MatterHackers.MatterControl
systemWindow.ShowAsSystemWindow();
}
private static void ReportStartupProgress(string status)
{
Console.WriteLine(status);
}
private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
#if !DEBUG

View file

@ -98,7 +98,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double value;
if (!double.TryParse(textValue, out value))
{
MatterControlApplication.BreakInDebugger("Slicing value is not a double.");
return valueOnError;
}