/// <summary> /// Function to perform the boot strapping operation. /// </summary> /// <returns>The main application window.</returns> public async void BootStrap() { AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; try { // Get our initial context. SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext()); Program.Log.Print("Booting application...", LoggingLevel.All); Cursor.Current = Cursors.WaitCursor; await ShowSplashAsync(); // Initalize the common resources. EditorCommonResources.LoadResources(); _folderBrowser = new FileSystemFolderBrowseService(); _commonServices = new ViewModelInjection(Program.Log, new WaitCursorBusyState(), new MessageBoxService()); _pluginCache = new GorgonMefPlugInCache(Program.Log); _graphicsContext = GraphicsContext.Create(Program.Log); _plugInLocation = new DirectoryInfo(Path.Combine(GorgonApplication.StartupPath.FullName, "PlugIns")); if (!_plugInLocation.Exists) { Program.Log.Print($"[ERROR] Plug in path '{_plugInLocation.FullName}' was not found. No plug ins will be loaded.", LoggingLevel.Simple); GorgonDialogs.ErrorBox(null, Resources.GOREDIT_ERR_LOADING_PLUGINS); } // Get any application settings we might have. _settings = LoadSettings(); // Load our file system import/export plugins. FileSystemProviders fileSystemProviders = LoadFileSystemPlugIns(); // Load our tool plug ins. _toolPlugIns = LoadToolPlugIns(); // Load our content service plugins. _contentPlugIns = LoadContentPlugIns(); // Create the project manager for the application _projectManager = new ProjectManager(fileSystemProviders); _mainForm = new FormMain { Location = new Point(_settings.WindowBounds.Value.X, _settings.WindowBounds.Value.Y), Size = new Size(_settings.WindowBounds.Value.Width, _settings.WindowBounds.Value.Height), WindowState = FormWindowState.Normal }; await HideSplashAsync(); MainForm = _mainForm; var factory = new ViewModelFactory(_settings, fileSystemProviders, _contentPlugIns, _toolPlugIns, _projectManager, _commonServices, new ClipboardService(), new DirectoryLocateService(), new FileScanService(_contentPlugIns), _folderBrowser); FormWindowState windowState; // Ensure the window state values fall into an acceptable range. if (!Enum.IsDefined(typeof(FormWindowState), _settings.WindowState)) { windowState = FormWindowState.Maximized; } else { windowState = (FormWindowState)_settings.WindowState; } _mainForm.GraphicsContext = _graphicsContext; _mainForm.SetDataContext(factory.CreateMainViewModel(_graphicsContext.Graphics.VideoAdapter.Name)); _mainForm.Show(); _mainForm.WindowState = windowState; } finally { Cursor.Current = Cursors.Default; } }
/// <summary> /// Function to load the application settings. /// </summary> /// <returns>The settings for the application.</returns> private EditorSettings LoadSettings() { #if DEBUG var settingsFile = new FileInfo(Path.Combine(Program.ApplicationUserDirectory.FullName, "Gorgon.Editor.Settings.DEBUG.json")); #else var settingsFile = new FileInfo(Path.Combine(Program.ApplicationUserDirectory.FullName, "Gorgon.Editor.Settings.json")); #endif EditorSettings result = null; _splash.InfoText = "Loading application settings..."; var defaultSize = new Size(1280.Min(Screen.PrimaryScreen.WorkingArea.Width), 800.Min(Screen.PrimaryScreen.WorkingArea.Height)); var defaultLocation = new Point((Screen.PrimaryScreen.WorkingArea.Width / 2) - (defaultSize.Width / 2) + Screen.PrimaryScreen.WorkingArea.X, (Screen.PrimaryScreen.WorkingArea.Height / 2) - (defaultSize.Height / 2) + Screen.PrimaryScreen.WorkingArea.Y); EditorSettings CreateEditorSettings() { return(new EditorSettings { WindowBounds = new DX.Rectangle(defaultLocation.X, defaultLocation.Y, defaultSize.Width, defaultSize.Height), WindowState = (int)FormWindowState.Maximized, LastOpenSavePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).FormatDirectory(Path.DirectorySeparatorChar), LastProjectWorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).FormatDirectory(Path.DirectorySeparatorChar) }); } if (!settingsFile.Exists) { Program.Log.Print($"Settings file '{settingsFile.FullName}' does not exist. Using new settings.", LoggingLevel.Intermediate); } else { StreamReader reader = null; try { Program.Log.Print($"Loading application settings from '{settingsFile.FullName}'", LoggingLevel.Intermediate); reader = new StreamReader(settingsFile.FullName, Encoding.UTF8, true); result = JsonConvert.DeserializeObject <EditorSettings>(reader.ReadToEnd(), new JsonSharpDxRectConverter()); Program.Log.Print("Application settings loaded.", LoggingLevel.Intermediate); } catch (IOException ioex) { Program.Log.Print($"Failed to load settings from '{settingsFile.FullName}'. Using fresh settings.", LoggingLevel.Intermediate); Program.Log.LogException(ioex); result = CreateEditorSettings(); } finally { reader?.Dispose(); } } if (result == null) { result = CreateEditorSettings(); } if (string.IsNullOrWhiteSpace(result.LastOpenSavePath)) { result.LastOpenSavePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).FormatDirectory(Path.DirectorySeparatorChar); } var lastOpenSavePath = new DirectoryInfo(result.LastOpenSavePath); if (!lastOpenSavePath.Exists) { result.LastOpenSavePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).FormatDirectory(Path.DirectorySeparatorChar); } if ((string.IsNullOrWhiteSpace(result.LastProjectWorkingDirectory)) || (!Directory.Exists(result.LastProjectWorkingDirectory))) { result.LastProjectWorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).FormatDirectory(Path.DirectorySeparatorChar); } // If we're not on one of the screens, then default to the main screen. if (result.WindowBounds != null) { var rect = new Rectangle(result.WindowBounds.Value.X, result.WindowBounds.Value.Y, result.WindowBounds.Value.Width, result.WindowBounds.Value.Height); var onScreen = Screen.FromRectangle(rect); // If we detected that we're on the primary screen (meaning we aren't on any of the others), but we don't intersect with the working area, // then we need to reset. // Shrink the target rect so that we can ensure won't just get a sliver of the window. rect.Inflate(-50, -50); if ((onScreen == Screen.PrimaryScreen) && (!onScreen.WorkingArea.IntersectsWith(rect))) { result.WindowBounds = new DX.Rectangle(defaultLocation.X, defaultLocation.Y, defaultSize.Width, defaultSize.Height); } } else { result.WindowBounds = new DX.Rectangle(defaultLocation.X, defaultLocation.Y, defaultSize.Width, defaultSize.Height); } return(result); }