Fix Windows support for DynamicProgress

This commit is contained in:
Dragon
2021-10-28 23:47:55 +03:00
parent cdcff01339
commit 9f3b0247f5
2 changed files with 36 additions and 6 deletions

View File

@@ -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

View File

@@ -6,6 +6,8 @@
#include <functional>
#include <indicators/color.hpp>
#include <indicators/setting.hpp>
#include <indicators/cursor_control.hpp>
#include <indicators/cursor_movement.hpp>
#include <indicators/details/stream_helper.hpp>
#include <iostream>
#include <mutex>
@@ -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<int>(total_count_));
for (auto &bar : bars_) {
bar.get().print_progress(true);
std::cout << "\n";