with Ada.Calendar;
with Ada.Strings.Fixed;
with Progress_Indicators.Spinners;
with SP.Terminal;
with Trendy_Terminal.VT100;
package body SP.Progress is
task body Update_Progress is
Spinner : PI.Spinners.Spinner := PI.Spinners.Make (PI.Spinners.Normal, 1);
SR : PI.Work_Trackers.Status_Report;
Start_Time : Ada.Calendar.Time;
Current_Time : Ada.Calendar.Time;
procedure Update is
use all type Ada.Calendar.Time;
begin
Current_Time := Ada.Calendar.Clock;
SP.Terminal.Beginning_Of_Line;
SP.Terminal.Clear_Line;
SR := Work.Report;
PI.Spinners.Tick(Spinner);
declare
Seconds : constant Natural := Natural (Float'Rounding (100.0 * Float (Current_Time - Start_Time)) * 0.01);
Elapsed : constant String := '(' & (if Seconds = 0
then "<1 s"
else Ada.Strings.Fixed.Trim (Seconds'Image, Ada.Strings.Left) & " s")
& ')';
begin
SP.Terminal.Put (
PI.Spinners.Value (Spinner)
& " "
& SR.Completed'Image
& " done of"
& SR.Total'Image
& " "
& Elapsed
& " "
& PI.Spinners.Value (Spinner));
end;
end Update;
begin
Start_Time := Ada.Calendar.Clock;
Trendy_Terminal.VT100.Hide_Cursor;
loop
select
accept Stop;
Trendy_Terminal.VT100.Show_Cursor;
exit;
or
delay 0.2;
end select;
Update;
end loop;
end Update_Progress;
end SP.Progress;