septum_0.0.7_88e658ca/src/common/sp-progress.adb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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;