/// <summary> /// Sets the progress being displayed to a new value /// </summary> /// <param name="Percent">Progress percentage in the [0.0 - 1.0] range</param> public void Set_Progress(double Percent) { lock (Line) { if (Equals(Disposed, 1)) { return; } if (!last_time.HasValue) { last_time = DateTime.UtcNow; LastPct = (float)Percent; } else { History.Enqueue(new Tuple <TimeSpan, float>(DateTime.UtcNow.Subtract(last_time.Value), (float)Percent - LastPct)); while (History.Count > MAX_HIST) { History.Dequeue(); } } Buffer.Clear(); Buffer.Append(string.Format(ANSI.Yellow("{0,6:#00.00}%") + ANSI.MagentaBright(" ["), Percent * 100f));// 9 chars // draw the active '=' portion of the bar const int ACTIVE_SPACE = PROG_BAR_WIDTH; double progSafe = Math.Min(1.0, Math.Max(0.0, Percent)); int active = (int)(progSafe * ACTIVE_SPACE); bool has_cap = active < ACTIVE_SPACE; string active_str = new string('=', active);// always draw an arrow head to cap the active portion of the bar UNLESS it would extend past the bars end if (has_cap) { active_str += ">"; } Buffer.Append(ANSI.CyanBright(active_str)); Buffer.Append(new string(' ', ACTIVE_SPACE - active_str.Length));// pad out the bar's unused space Buffer.Append(ANSI.MagentaBright("]")); Line.Set(Buffer.ToString()); } }