From c2228c53b9c6c4712b7f8ff5ee2ef8f74171013e Mon Sep 17 00:00:00 2001 From: Laura Date: Wed, 6 Jun 2018 10:44:01 +0200 Subject: [PATCH] Refactor, new features --- ProgressBarLib/ProgressBar.cs | 72 +++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/ProgressBarLib/ProgressBar.cs b/ProgressBarLib/ProgressBar.cs index 94f653a..399eb47 100644 --- a/ProgressBarLib/ProgressBar.cs +++ b/ProgressBarLib/ProgressBar.cs @@ -8,8 +8,12 @@ namespace ProgressBarLib { private volatile bool _shouldStop; private volatile List _msgList = new List(); + private volatile int _lastCurr; + private volatile int _lastTotal; + private volatile string _lastMsg = ""; private volatile string _mainMsg = ""; private readonly object _lock = new object(); + private volatile bool _hasStopped; public ProgressBar() { @@ -23,41 +27,47 @@ namespace ProgressBarLib lock (_lock) if (_msgList.Count > 0) { + ClearCurrentConsoleLine(); foreach (var msg in _msgList) { - Console.WriteLine(msg); + Console.WriteLine(msg.Length < Console.WindowWidth + ? msg + : msg.Substring(0, Console.WindowWidth - 1)); } _msgList.Clear(); } + ClearCurrentConsoleLine(); Console.Write("\r" + _mainMsg); Thread.Sleep(500); } + + if (_msgList.Count > 0) + { + ClearCurrentConsoleLine(); + foreach (var msg in _msgList) + { + Console.WriteLine(msg.Length < Console.WindowWidth + ? msg + : msg.Substring(0, Console.WindowWidth - 1)); + } + + _msgList.Clear(); + } + else + { + ClearCurrentConsoleLine(); + Console.Write("\r" + _mainMsg); + } + + _hasStopped = true; }).Start(); } public void UpdateMain(int curr, int total, string msg) { - var outMsg = $"({curr}/{total}) "; - var progPart = MakeProgressBar(curr, total); - var msgMaxLength = Console.WindowWidth - outMsg.Length - progPart.Length; - - if (msgMaxLength < 0) - { - _mainMsg = "Increase terminal width"; - return; - } - - if (msg.Length < msgMaxLength) - for (var i = (msgMaxLength - msg.Length); i > 0; i--) - msg += " "; - else - msg = msg.Substring(0, msgMaxLength); - - outMsg += msg; - outMsg += progPart; - _mainMsg = outMsg; + UpdateMainAdv(curr, total, curr.ToString(), msg); } public void UpdateMainAdv(int curr, int total, string custCurr, string msg) @@ -80,18 +90,30 @@ namespace ProgressBarLib outMsg += msg; outMsg += progPart; + + _lastCurr = curr; + _lastMsg = msg; + _lastTotal = total; + _mainMsg = outMsg; } + public void Tick() + { + _lastCurr++; + UpdateMain(_lastCurr, _lastTotal, _lastMsg); + } + public void PushMsg(string msg) { - lock(_lock) + lock (_lock) _msgList.Add(msg); } public void Stop() { _shouldStop = true; + while (!_hasStopped) ; } private static string MakeProgressBar(int curr, int total) @@ -114,10 +136,10 @@ namespace ProgressBarLib private static void ClearCurrentConsoleLine() { - var currentLineCursor = Console.CursorTop; - Console.SetCursorPosition(0, Console.CursorTop); - Console.Write(new string(' ', Console.WindowWidth)); - Console.SetCursorPosition(0, currentLineCursor); + var currentLineCursor = Console.CursorTop; + Console.SetCursorPosition(0, Console.CursorTop); + Console.Write(new string(' ', Console.WindowWidth)); + Console.SetCursorPosition(0, currentLineCursor); } } } \ No newline at end of file