HandleIncomingProgressRecord(Int64 sourceId, ProgressRecord record) { Dbg.Assert(record != null, "record should not be null"); if (_pendingProgress == null) { Dbg.Assert(_progPane == null, "If there is no data struct, there shouldn't be a pane, either."); _pendingProgress = new PendingProgress(); } _pendingProgress.Update(sourceId, record); if (_progPane == null) { // This is the first time we've received a progress record. // Create a progress pane, // then show it, // then create and start timer to update it. _progPane = new ProgressPane(this); if (_progPaneUpdateTimer == null && _progPane != null) { _progPane.Show(_pendingProgress); _progPaneUpdateTimer = new Timer(new TimerCallback(ProgressPaneUpdateTimerElapsed), null, UpdateTimerThreshold, Timeout.Infinite); } } }
HandleIncomingProgressRecord(long sourceId, ProgressRecord record) { Dbg.Assert(record != null, "record should not be null"); if (_pendingProgress == null) { Dbg.Assert(_progPane == null, "If there is no data struct, there shouldn't be a pane, either."); _pendingProgress = new PendingProgress(); } _pendingProgress.Update(sourceId, record); if (_progPane == null) { // This is the first time we've received a progress record // Create a progress pane // Set up a update flag // Create a timer for updating the flag _progPane = new ProgressPane(this); if (_progPaneUpdateTimer == null) { // Show a progress pane at the first time we've received a progress record progPaneUpdateFlag = 1; // The timer will be auto restarted every 'UpdateTimerThreshold' ms _progPaneUpdateTimer = new Timer(new TimerCallback(ProgressPaneUpdateTimerElapsed), null, UpdateTimerThreshold, UpdateTimerThreshold); } } if (Interlocked.CompareExchange(ref progPaneUpdateFlag, 0, 1) == 1 || record.RecordType == ProgressRecordType.Completed) { // Update the progress pane only when the timer set up the update flag or WriteProgress is completed. // As a result, we do not block WriteProgress and whole script and eliminate unnecessary console locks and updates. if (SupportsVirtualTerminal && PSStyle.Instance.Progress.UseOSCIndicator) { int percentComplete = record.PercentComplete; if (percentComplete < 0) { // Write-Progress allows for negative percent complete, but not greater than 100 // but OSC sequence is limited from 0 to 100. percentComplete = 0; } // OSC sequence to turn on progress indicator // https://github.com/microsoft/terminal/issues/6700 Console.Write($"\x1b]9;4;1;{percentComplete}\x1b\\"); } // If VT is not supported, we change ProgressView to classic if (!SupportsVirtualTerminal) { PSStyle.Instance.Progress.View = ProgressView.Classic; } _progPane.Show(_pendingProgress); } }
HandleIncomingProgressRecord(Int64 sourceId, ProgressRecord record) { Dbg.Assert(record != null, "record should not be null"); if (_pendingProgress == null) { Dbg.Assert(_progPane == null, "If there is no data struct, there shouldn't be a pane, either."); _pendingProgress = new PendingProgress(); } _pendingProgress.Update(sourceId, record); if (_progPane == null) { // This is the first time we've received a progress record // Create a progress pane // Set up a update flag // Create a timer for updating the flag _progPane = new ProgressPane(this); if (_progPaneUpdateTimer == null) { // Show a progress pane at the first time we've received a progress record progPaneUpdateFlag = 1; // The timer will be auto restarted every 'UpdateTimerThreshold' ms _progPaneUpdateTimer = new Timer(new TimerCallback(ProgressPaneUpdateTimerElapsed), null, UpdateTimerThreshold, UpdateTimerThreshold); } } if (Interlocked.CompareExchange(ref progPaneUpdateFlag, 0, 1) == 1 || record.RecordType == ProgressRecordType.Completed) { // Update the progress pane only when the timer set up the update flag or WriteProgress is completed. // As a result, we do not block WriteProgress and whole script and eliminate unnecessary console locks and updates. _progPane.Show(_pendingProgress); // Reset the cursor back to where it started if (record.RecordType == ProgressRecordType.Completed) { _progPane.Hide(); } } }
HandleIncomingProgressRecord(Int64 sourceId, ProgressRecord record) { Dbg.Assert(record != null, "record should not be null"); if (_pendingProgress == null) { Dbg.Assert(_progPane == null, "If there is no data struct, there shouldn't be a pane, either."); _pendingProgress = new PendingProgress(); } _pendingProgress.Update(sourceId, record); if (_progPane == null) { // This is the first time we've received a progress record. Create a progress pane, then show it. _progPane = new ProgressPane(this); } _progPane.Show(_pendingProgress); }
HandleIncomingProgressRecord(Int64 sourceId, ProgressRecord record) { Dbg.Assert(record != null, "record should not be null"); if (_pendingProgress == null) { Dbg.Assert(_progPane == null, "If there is no data struct, there shouldn't be a pane, either."); _pendingProgress = new PendingProgress(); } _pendingProgress.Update(sourceId, record); if (_progPane == null) { // This is the first time we've received a progress record. Create a pane to show it, and // then show it. _progPane = new ProgressPane(this); } _progPane.Show(_pendingProgress); }
private void HandleIncomingProgressRecord(long sourceId, ProgressRecord record) { if (this.pendingProgress == null) { this.pendingProgress = new PendingProgress(); } this.pendingProgress.Update(sourceId, record); if (this.progPane == null) { this.progPane = new ProgressPane(this); } this.progPane.Show(this.pendingProgress); }
internal void ResetProgress() { if (this.progPane != null) { this.progPane.Hide(); this.progPane = null; } this.pendingProgress = null; }