From 9f3b0247f5551fbd33d33873b9471061d53244e8 Mon Sep 17 00:00:00 2001 From: Dragon Date: Thu, 28 Oct 2021 23:47:55 +0300 Subject: [PATCH] Fix Windows support for DynamicProgress --- include/indicators/cursor_control.hpp | 27 +++++++++++++++++++++++++ include/indicators/dynamic_progress.hpp | 15 ++++++++------ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/include/indicators/cursor_control.hpp b/include/indicators/cursor_control.hpp index 6669cd7..641156f 100644 --- a/include/indicators/cursor_control.hpp +++ b/include/indicators/cursor_control.hpp @@ -26,12 +26,39 @@ static inline void show_console_cursor(bool const show) { SetConsoleCursorInfo(out, &cursorInfo); } +static inline void erase_line() { + auto hStdout = GetStdHandle(STD_OUTPUT_HANDLE); + if (!hStdout) + return; + + CONSOLE_SCREEN_BUFFER_INFO csbiInfo; + GetConsoleScreenBufferInfo(hStdout, &csbiInfo); + + COORD cursor; + + cursor.X = 0; + cursor.Y = csbiInfo.dwCursorPosition.Y; + + DWORD count = 0; + + FillConsoleOutputCharacterA(hStdout, ' ', csbiInfo.dwSize.X, cursor, &count); + + FillConsoleOutputAttribute(hStdout, csbiInfo.wAttributes, csbiInfo.dwSize.X, + cursor, &count); + + SetConsoleCursorPosition(hStdout, cursor); +} + #else static inline void show_console_cursor(bool const show) { std::fputs(show ? "\033[?25h" : "\033[?25l", stdout); } +static inline void erase_line() { + std::fputs("\r\033[K", stdout); +} + #endif } // namespace indicators diff --git a/include/indicators/dynamic_progress.hpp b/include/indicators/dynamic_progress.hpp index 44c31a0..49d7d89 100644 --- a/include/indicators/dynamic_progress.hpp +++ b/include/indicators/dynamic_progress.hpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include #include @@ -83,8 +85,11 @@ public: if (hide_bar_when_complete) { // Hide completed bars if (started_) { - for (size_t i = 0; i < incomplete_count_; ++i) - std::cout << "\033[A\r\033[K" << std::flush; + for (size_t i = 0; i < incomplete_count_; ++i) { + move_up(1); + erase_line(); + std::cout << std::flush; + } } incomplete_count_ = 0; for (auto &bar : bars_) { @@ -98,10 +103,8 @@ public: started_ = true; } else { // Don't hide any bars - if (started_) { - for (size_t i = 0; i < total_count_; ++i) - std::cout << "\x1b[A"; - } + if (started_) + move_up(static_cast(total_count_)); for (auto &bar : bars_) { bar.get().print_progress(true); std::cout << "\n";