private async void ProjectBuildStartCommand_Executed(object sender, ExecutedRoutedEventArgs e) { // Force update of script interface ProjectBuildStartButton.Focus(); // TODO: Better locking system? Interlocked.Increment(ref Engine.WorkingLock); try { // Get current project Project p = Model.CurMainTree.Script.Project; Model.BuildTreeItems.Clear(); ProjectTreeItemModel treeRoot = MainViewModel.PopulateOneTreeItem(p.MainScript, null, null); MainViewModel.ScriptListToTreeViewModel(p, p.ActiveScripts, false, treeRoot); Model.BuildTreeItems.Add(treeRoot); Model.CurBuildTree = null; EngineState s = new EngineState(p, Logger, Model); s.SetOptions(Global.Setting, p.Compat); Engine.WorkingEngine = new Engine(s); // Build Start, Switch to Build View Model.SwitchNormalBuildInterface = false; // Turn on progress ring Model.WorkInProgress = true; // Set StatusBar Text CancellationTokenSource ct = new CancellationTokenSource(); Task printStatus = MainViewModel.PrintBuildElapsedStatus($"Building {p.ProjectName}...", s, ct.Token); // Run int buildId = await Engine.WorkingEngine.Run($"Project {p.ProjectName}"); #if DEBUG Logger.ExportBuildLog(LogExportType.Text, Path.Combine(s.BaseDir, "LogDebugDump.txt"), buildId, new LogExporter.BuildLogOptions { IncludeComments = true, IncludeMacros = true, }); #endif // Cancel and wait until PrintBuildElapsedStatus stops // Report elapsed time ct.Cancel(); await printStatus; Model.StatusBarText = $"{p.ProjectName} build done ({s.Elapsed:h\\:mm\\:ss})"; // Turn off progress ring Model.WorkInProgress = false; // Build ended, Switch to Normal View Model.SwitchNormalBuildInterface = true; Model.BuildTreeItems.Clear(); Model.DisplayScript(Model.CurMainTree.Script); if (Global.Setting.General.ShowLogAfterBuild && LogWindow.Count == 0) { // Open BuildLogWindow LogDialog = new LogWindow(1); LogDialog.Show(); } } finally { Engine.WorkingEngine = null; Interlocked.Decrement(ref Engine.WorkingLock); CommandManager.InvalidateRequerySuggested(); } }
private async void ScriptRunCommand_Executed(object sender, ExecutedRoutedEventArgs e) { // Force update of script interface ScriptRunButton.Focus(); Script sc = Model.CurMainTree.Script; if (!sc.Sections.ContainsKey(ScriptSection.Names.Process)) { Model.StatusBarText = $"Section [Process] does not exist in {sc.Title}"; return; } if (Engine.WorkingLock == 0) // Start Build { Interlocked.Increment(ref Engine.WorkingLock); // Populate BuildTree Model.BuildTreeItems.Clear(); ProjectTreeItemModel rootItem = MainViewModel.PopulateOneTreeItem(sc, null, null); Model.BuildTreeItems.Add(rootItem); Model.CurBuildTree = null; EngineState s = new EngineState(sc.Project, Logger, Model, EngineMode.RunMainAndOne, sc); s.SetOptions(Global.Setting, sc.Project.Compat); Engine.WorkingEngine = new Engine(s); // Switch to Build View Model.SwitchNormalBuildInterface = false; CancellationTokenSource ct = new CancellationTokenSource(); Task printStatus = MainViewModel.PrintBuildElapsedStatus($"Running {sc.Title}...", s, ct.Token); // Run int buildId = await Engine.WorkingEngine.Run($"{sc.Title} - Run"); #if DEBUG Logger.ExportBuildLog(LogExportType.Text, Path.Combine(s.BaseDir, "LogDebugDump.txt"), buildId, new LogExporter.BuildLogOptions { IncludeComments = true, IncludeMacros = true, }); #endif // Cancel and Wait until PrintBuildElapsedStatus stops // Report elapsed time TimeSpan t = s.Elapsed; ct.Cancel(); await printStatus; Model.StatusBarText = $"{sc.Title} took {t:h\\:mm\\:ss}"; // Build Ended, Switch to Normal View Model.SwitchNormalBuildInterface = true; Model.BuildTreeItems.Clear(); Model.DisplayScript(Model.CurMainTree.Script); if (Global.Setting.General.ShowLogAfterBuild && LogWindow.Count == 0) { // Open BuildLogWindow LogDialog = new LogWindow(1); LogDialog.Show(); } Engine.WorkingEngine = null; Interlocked.Decrement(ref Engine.WorkingLock); } else // Stop Build { Engine.WorkingEngine?.ForceStop(); } }