Add version verb with option to check for upgrade Add Search verb to search the library Add export file type inference Add more set-status options Add console progress bar and ETA Add processable option to liberate specific book IDs Scan accounts by nickname or account ID Improve startup performance for halp and on parsing error More useful error messages
78 lines
1.8 KiB
C#
78 lines
1.8 KiB
C#
using System;
|
|
using System.IO;
|
|
|
|
namespace LibationCli;
|
|
|
|
internal class ConsoleProgressBar
|
|
{
|
|
public TextWriter Output { get; }
|
|
public int MaxWidth { get; }
|
|
public char ProgressChar { get; }
|
|
public char NoProgressChar { get; }
|
|
|
|
public double? Progress
|
|
{
|
|
get => m_Progress;
|
|
set
|
|
{
|
|
m_Progress = value ?? 0;
|
|
WriteProgress();
|
|
}
|
|
}
|
|
|
|
public TimeSpan RemainingTime
|
|
{
|
|
get => m_RemainingTime;
|
|
set
|
|
{
|
|
m_RemainingTime = value;
|
|
WriteProgress();
|
|
}
|
|
}
|
|
|
|
|
|
private double m_Progress;
|
|
private TimeSpan m_RemainingTime;
|
|
private int m_LastWriteLength = 0;
|
|
private const int MAX_ETA_LEN = 10;
|
|
private readonly int m_NumProgressPieces;
|
|
|
|
public ConsoleProgressBar(
|
|
TextWriter output,
|
|
int maxWidth = 80,
|
|
char progressCharr = '#',
|
|
char noProgressChar = '.')
|
|
{
|
|
Output = output;
|
|
MaxWidth = maxWidth;
|
|
ProgressChar = progressCharr;
|
|
NoProgressChar = noProgressChar;
|
|
m_NumProgressPieces = MaxWidth - MAX_ETA_LEN - 4;
|
|
}
|
|
|
|
private void WriteProgress()
|
|
{
|
|
var numCompleted = (int)Math.Round(double.Min(100, m_Progress) * m_NumProgressPieces / 100);
|
|
var numRemaining = m_NumProgressPieces - numCompleted;
|
|
var progressBar = $"[{new string(ProgressChar, numCompleted)}{new string(NoProgressChar, numRemaining)}] ";
|
|
|
|
progressBar += RemainingTime.TotalMinutes > 1000
|
|
? "ETA ∞"
|
|
: $"ETA {(int)RemainingTime.TotalMinutes}:{RemainingTime.Seconds:D2}";
|
|
|
|
Output.Write(new string('\b', m_LastWriteLength) + progressBar);
|
|
if (progressBar.Length < m_LastWriteLength)
|
|
{
|
|
var extra = m_LastWriteLength - progressBar.Length;
|
|
Output.Write(new string(' ', extra) + new string('\b', extra));
|
|
}
|
|
m_LastWriteLength = progressBar.Length;
|
|
}
|
|
|
|
public void Clear()
|
|
=> Output.Write(
|
|
new string('\b', m_LastWriteLength)
|
|
+ new string(' ', m_LastWriteLength)
|
|
+ new string('\b', m_LastWriteLength));
|
|
}
|