public MainWindow() { this.InitializeComponent(); #if DEBUG this.AttachDevTools(); #endif using var initScope = new TimedScope(LoggingScope.Global($"{nameof(MainWindow)}.InitializeServices")); Session = new Session(); var menuProvider = new MenuProvider(); Services.AddService <IMenuProvider>(menuProvider); Session.EditorViewModel = new EditorViewModel(menuProvider); Session.Services = Services; Services.AddService <Window>(this); Services.AddService <Session>(Session); Services.AddService <IRootViewModelContainer>(Session); Services.AddService <ViewRegistry>(new ViewRegistry()); Services.AddService <IDialogService>(new DialogService(Services)); var viewDataTemplate = new ViewDataTemplate(Services); Services.AddService <IViewUpdater>(viewDataTemplate); DataTemplates.Add(viewDataTemplate); Services.AddService <IUndoService>(new UndoService()); Services.AddService <IMemberViewProvider <IViewBuilder> >(new MemberViewProvider(Services)); var commandDispatcher = new CommandDispatcher(Services); Services.AddService <ICommandDispatcher>(commandDispatcher); // after all synchronous code caused by user input has been executed // we begin the commands processing. InputManager.Instance.PostProcess.Subscribe(async(e) => await commandDispatcher.ProcessDispatchedCommands()); var tabManager = new SimpleTabManager(Services); Services.AddService <ITabManager>(tabManager); Services.AddService <SimpleTabManager>(tabManager); var assetManager = new AssetManager(Services); Services.AddService <IAssetManager>(assetManager); Services.AddService <IAssetEditorRegistry>(assetManager); var pluginRegistry = new PluginRegistry(Services); pluginRegistry.RefreshAvailablePlugins(); Services.AddService <PluginRegistry>(pluginRegistry); foreach (var initialPlugin in pluginRegistry.AvailablePlugins) { pluginRegistry.Register(initialPlugin); } // It will be rendered by the DataTemplate DataContext = Session.EditorViewModel; }
public async Task <PackageSessionResult> LoadProject(string path) { var viewUpdater = Services.GetService <IViewUpdater>(); PackageSessionResult sessionResult = await SetupResultProgress(viewUpdater, LoadProjectScope); using (var scope = new TimedScope(LoadProjectScope, TimedScope.Status.Failure)) { // Force PackageSession.Load to be executed on the thread pool // otherwise it would block execution and we want this process to be async await Task.Run(() => { PackageSession.Load(path, sessionResult); }).ConfigureAwait(false); PackageSession = sessionResult.Session; foreach (var pkg in PackageSession.LocalPackages) { pkg.UpdateAssemblyReferences(LoggingScope.Global($"{nameof(Session)}.{nameof(pkg.UpdateAssemblyReferences)}")); } if (!sessionResult.HasErrors) { scope.Result = TimedScope.Status.Success; } } // Create asset browser for package and add it to the viewmodel var browser = new AssetBrowserViewModel(PackageSession); await Services.GetService <ITabManager>().CreateToolTab(browser); EditorViewModel.LoadingStatus = null; await viewUpdater.UpdateView(); ProjectLoaded?.Invoke(sessionResult); return(sessionResult); }