-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathConsoleProgress.cs
More file actions
104 lines (91 loc) · 3.5 KB
/
Copy pathConsoleProgress.cs
File metadata and controls
104 lines (91 loc) · 3.5 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//Released under the MIT License.
//
//Copyright (c) 2018 Ntreev Soft co., Ltd.
//
//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
//documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
//rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
//persons to whom the Software is furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
//Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
//WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
//COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
//OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace Ntreev.Library
{
public class ConsoleProgress : Progress
{
private readonly TextWriter writer;
public ConsoleProgress()
: this(Console.Out)
{
}
public ConsoleProgress(TextWriter writer)
{
this.writer = writer;
this.Style = ConsoleProgressStyle.Percent;
}
public static string GetProgressString(int index, int count)
{
var len = $"{count}".Length;
var f = string.Format("{{0,{0}}}", len);
return string.Format(f, index) + "/" + string.Format(f, count);
}
public ConsoleProgressStyle Style
{
get; set;
}
protected override void OnChanged(ProgressChangedEventArgs e)
{
base.OnChanged(e);
var progressString = this.GetPrgressStringInternal(e.Value) ?? string.Empty;
if (progressString != string.Empty)
progressString += " ";
var message = $"{progressString}{e.Message}";
if (message != string.Empty)
this.writer.WriteLine(message);
}
protected virtual string GetCustomPrgressString(double value)
{
return this.GetPercentString(value);
}
protected string GetPercentString(double value)
{
return $"[{(value * 100),3}%]";
}
protected string GetProgressString(double value, int length)
{
var ss = length * value;
var fill = string.Empty.PadRight((int)ss, '#');
var empty = string.Empty.PadRight(length - fill.Length, '.');
return $"[{fill}{empty}]";
}
private string GetPrgressStringInternal(double value)
{
if (this.Style == ConsoleProgressStyle.None)
{
return string.Empty;
}
else if (this.Style == ConsoleProgressStyle.Percent)
{
return this.GetPercentString(value);
}
else if (this.Style == ConsoleProgressStyle.Progress)
{
return this.GetProgressString(value, 10);
}
else
{
return this.GetCustomPrgressString(value);
}
}
}
}