22
33namespace Spectre . Docs . Examples . Showcase ;
44
5- /// <summary>Demonstrates progress bars with multiple tasks .</summary>
5+ /// <summary>Demonstrates multi-task progress tracking for deployments .</summary>
66public class ProgressSample : BaseSample
77{
88 /// <inheritdoc />
99 public override void Run ( IAnsiConsole console )
1010 {
11- // Show progress
1211 console . Progress ( )
1312 . AutoClear ( false )
14- . Columns ( new TaskDescriptionColumn ( ) , new ProgressBarColumn ( ) , new PercentageColumn ( ) , new RemainingTimeColumn ( ) , new SpinnerColumn ( ) )
13+ . Columns (
14+ new TaskDescriptionColumn ( ) ,
15+ new ProgressBarColumn ( ) ,
16+ new PercentageColumn ( ) ,
17+ new RemainingTimeColumn ( ) ,
18+ new SpinnerColumn ( ) )
1519 . Start ( ctx =>
1620 {
17- var random = new Random ( 122978 ) ;
21+ var random = new Random ( 42 ) ;
1822
19- // Create some tasks
20- var tasks = CreateTasks ( ctx , random ) ;
21- var warpTask = ctx . AddTask ( "Going to warp" , autoStart : false ) . IsIndeterminate ( ) ;
23+ var tasks = new List < ( ProgressTask Task , double Speed ) >
24+ {
25+ ( ctx . AddTask ( "Reticulating splines" ) , random . NextDouble ( ) * 2 + 1.1 ) ,
26+ ( ctx . AddTask ( "Hydrating caches" ) , random . NextDouble ( ) * 2 + 1 ) ,
27+ ( ctx . AddTask ( "Consulting the oracle" ) , random . NextDouble ( ) * 2 + 1.2 ) ,
28+ ( ctx . AddTask ( "Negotiating with upstream" ) , random . NextDouble ( ) * 2 + 1.05 ) ,
29+ ( ctx . AddTask ( "Defenestrating legacy code" ) , random . NextDouble ( ) * 2 + 1.4 ) ,
30+ } ;
31+
32+ var launchTask = ctx . AddTask ( "Preparing for descent" , autoStart : false ) ;
33+ launchTask . IsIndeterminate ( ) ;
2234
23- // Wait for all tasks (except the indeterminate one) to complete
2435 while ( ! ctx . IsFinished )
2536 {
26- // Increment progress
27- foreach ( var ( task , increment ) in tasks )
37+ foreach ( var ( task , speed ) in tasks )
2838 {
29- task . Increment ( random . NextDouble ( ) * increment ) ;
39+ if ( ! task . IsFinished )
40+ {
41+ task . Increment ( random . NextDouble ( ) * speed ) ;
42+ }
3043 }
3144
32- // Simulate some delay
33- Thread . Sleep ( 100 ) ;
34- }
45+ if ( tasks . All ( t => t . Task . IsFinished ) && ! launchTask . IsStarted )
46+ {
47+ launchTask . StartTask ( ) ;
48+ launchTask . IsIndeterminate ( false ) ;
49+ }
3550
36- // Now start the "warp" task
37- warpTask . StartTask ( ) ;
38- warpTask . IsIndeterminate ( false ) ;
39- while ( ! ctx . IsFinished )
40- {
41- warpTask . Increment ( 12 * random . NextDouble ( ) ) ;
51+ if ( launchTask is { IsStarted : true , IsFinished : false } )
52+ {
53+ launchTask . Increment ( random . NextDouble ( ) * 3 + 1 ) ;
54+ }
4255
43- // Simulate some delay
44- Thread . Sleep ( 100 ) ;
56+ Thread . Sleep ( 80 ) ;
4557 }
4658 } ) ;
4759 }
48-
49- /// <summary>Creates sample progress tasks.</summary>
50- /// <param name="progress">The progress context.</param>
51- /// <param name="random">Random generator for delays.</param>
52- /// <returns>List of tasks with their delay values.</returns>
53- public List < ( ProgressTask Task , int Delay ) > CreateTasks ( ProgressContext progress , Random random )
54- {
55- var tasks = new List < ( ProgressTask , int ) > ( ) ;
56-
57- var names = new [ ]
58- {
59- "Retriculating algorithms" , "Colliding splines" , "Solving quarks" , "Folding data structures" ,
60- "Rerouting capacitators "
61- } ;
62-
63- for ( var i = 0 ; i < 5 ; i ++ )
64- {
65- tasks . Add ( ( progress . AddTask ( names [ i ] ) , random . Next ( 2 , 10 ) ) ) ;
66- }
67-
68- return tasks ;
69- }
70- }
60+ }
0 commit comments