mirror of
https://github.com/p-ranav/indicators.git
synced 2025-12-16 04:18:51 +08:00
Merge pull request #48 from motis-project/win-cursor-mv
Abstraction for Cursor Movements (Issue #46)
This commit is contained in:
22
README.md
22
README.md
@@ -110,14 +110,16 @@ If you'd rather control progress of the bar in discrete steps, consider using `b
|
||||
|
||||
```cpp
|
||||
#include <chrono>
|
||||
#include <indicators/cursor_control.hpp>
|
||||
#include <indicators/progress_bar.hpp>
|
||||
#include <thread>
|
||||
|
||||
int main() {
|
||||
using namespace indicators;
|
||||
|
||||
// Hide cursor
|
||||
std::cout << "\e[?25l";
|
||||
using namespace indicators;
|
||||
show_console_cursor(false);
|
||||
|
||||
ProgressBar bar{
|
||||
option::BarWidth{50},
|
||||
option::Start{"["},
|
||||
@@ -157,7 +159,7 @@ int main() {
|
||||
bar.mark_as_completed();
|
||||
|
||||
// Show cursor
|
||||
std::cout << "\e[?25h";
|
||||
show_console_cursor(true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -173,11 +175,16 @@ All progress bars and spinners in `indicators` support showing time elapsed and
|
||||
|
||||
```cpp
|
||||
#include <chrono>
|
||||
#include <indicators/cursor_control.hpp>
|
||||
#include <indicators/progress_bar.hpp>
|
||||
#include <thread>
|
||||
|
||||
int main() {
|
||||
using namespace indicators;
|
||||
|
||||
// Hide cursor
|
||||
show_console_cursor(false);
|
||||
|
||||
indicators::ProgressBar bar{
|
||||
option::BarWidth{50},
|
||||
option::Start{" ["},
|
||||
@@ -201,7 +208,7 @@ int main() {
|
||||
}
|
||||
|
||||
// Show cursor
|
||||
std::cout << "\e[?25h";
|
||||
show_console_cursor(true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -222,10 +229,11 @@ Are you in need of a smooth block progress bar using [unicode block elements](ht
|
||||
|
||||
int main() {
|
||||
|
||||
// Hide cursor
|
||||
std::cout << "\e[?25l";
|
||||
using namespace indicators;
|
||||
|
||||
// Hide cursor
|
||||
show_console_cursor(false);
|
||||
|
||||
BlockProgressBar bar{
|
||||
option::BarWidth{80},
|
||||
option::Start{"["},
|
||||
@@ -245,7 +253,7 @@ int main() {
|
||||
}
|
||||
|
||||
// Show cursor
|
||||
std::cout << "\e[?25h";
|
||||
show_console_cursor(true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
#include <indicators/progress_bar.hpp>
|
||||
#include <indicators/progress_spinner.hpp>
|
||||
#include <indicators/cursor_control.hpp>
|
||||
#include <vector>
|
||||
|
||||
int main() {
|
||||
using namespace indicators;
|
||||
|
||||
// Hide cursor
|
||||
std::cout << "\e[?25l";
|
||||
using namespace indicators;
|
||||
show_console_cursor(false);
|
||||
|
||||
{
|
||||
//
|
||||
// PROGRESS BAR 1
|
||||
@@ -312,7 +314,7 @@ int main() {
|
||||
}
|
||||
|
||||
// Show cursor
|
||||
std::cout << "\e[?25h";
|
||||
show_console_cursor(true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
35
include/indicators/cursor_control.hpp
Executable file
35
include/indicators/cursor_control.hpp
Executable file
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#if !defined(NOMINMAX)
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
#include <io.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <cstdio>
|
||||
#endif
|
||||
|
||||
namespace indicators {
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
|
||||
void show_console_cursor(bool const show) {
|
||||
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
|
||||
CONSOLE_CURSOR_INFO cursorInfo;
|
||||
|
||||
GetConsoleCursorInfo(out, &cursorInfo);
|
||||
cursorInfo.bVisible = show; // set the cursor visibility
|
||||
SetConsoleCursorInfo(out, &cursorInfo);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void show_console_cursor(bool const show) {
|
||||
std::fputs(show ? "\e[?25h" : "\e[?25l", stdout);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace indicators
|
||||
46
include/indicators/cursor_movement.hpp
Executable file
46
include/indicators/cursor_movement.hpp
Executable file
@@ -0,0 +1,46 @@
|
||||
#pragma once
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#if !defined(NOMINMAX)
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
#include <io.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <iostream>
|
||||
#endif
|
||||
|
||||
namespace indicators {
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
void move(int x, int y) {
|
||||
auto hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if (!hStdout)
|
||||
return;
|
||||
|
||||
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
|
||||
GetConsoleScreenBufferInfo(hStdout, &csbiInfo);
|
||||
|
||||
COORD cursor;
|
||||
|
||||
cursor.X = csbiInfo.dwCursorPosition.X + x;
|
||||
cursor.Y = csbiInfo.dwCursorPosition.Y + y;
|
||||
SetConsoleCursorPosition(hStdout, cursor);
|
||||
}
|
||||
|
||||
void move_up(int lines) { move(0, -lines); }
|
||||
void move_down(int lines) { move(0, -lines); }
|
||||
void move_right(int cols) { move(cols, 0); }
|
||||
void move_left(int cols) { move(-cols, 0); }
|
||||
|
||||
#else
|
||||
|
||||
void move_up(int lines) { std::cout << "x1b[" << lines << "A"; }
|
||||
void move_down(int lines) { std::cout << "x1b[" << lines << "B"; }
|
||||
void move_right(int cols) { std::cout << "x1b[" << cols << "C"; }
|
||||
void move_left(int cols) { std::cout << "x1b[" << cols << "D"; }
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace indicators
|
||||
@@ -27,11 +27,13 @@ SOFTWARE.
|
||||
#pragma once
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <indicators/color.hpp>
|
||||
#include <iostream>
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
|
||||
#include <indicators/cursor_movement.hpp>
|
||||
#include <indicators/color.hpp>
|
||||
|
||||
namespace indicators {
|
||||
|
||||
template <typename Indicator, size_t count> class MultiProgress {
|
||||
@@ -86,8 +88,7 @@ private:
|
||||
void print_progress() {
|
||||
std::lock_guard<std::mutex> lock{mutex_};
|
||||
if (started_)
|
||||
for (size_t i = 0; i < count; ++i)
|
||||
std::cout << "\x1b[A";
|
||||
move_up(count);
|
||||
for (auto &bar : bars_) {
|
||||
bar.get().print_progress(true);
|
||||
std::cout << "\n";
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include <chrono>
|
||||
#include <indicators/block_progress_bar.hpp>
|
||||
#include <indicators/cursor_control.hpp>
|
||||
#include <thread>
|
||||
|
||||
int main() {
|
||||
|
||||
// Hide cursor
|
||||
std::cout << "\e[?25l";
|
||||
indicators::show_console_cursor(false);
|
||||
|
||||
indicators::BlockProgressBar bar{
|
||||
indicators::option::BarWidth{80},
|
||||
@@ -24,7 +25,7 @@ int main() {
|
||||
}
|
||||
|
||||
// Show cursor
|
||||
std::cout << "\e[?25h";
|
||||
indicators::show_console_cursor(true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include <chrono>
|
||||
#include <indicators/cursor_control.hpp>
|
||||
#include <indicators/progress_bar.hpp>
|
||||
#include <thread>
|
||||
|
||||
int main() {
|
||||
|
||||
// Hide cursor
|
||||
std::cout << "\e[?25l";
|
||||
indicators::show_console_cursor(false);
|
||||
|
||||
indicators::ProgressBar bar{
|
||||
indicators::option::BarWidth{50},
|
||||
@@ -47,7 +48,7 @@ int main() {
|
||||
bar.mark_as_completed();
|
||||
|
||||
// Show cursor
|
||||
std::cout << "\e[?25h";
|
||||
indicators::show_console_cursor(true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
#include <indicators/cursor_control.hpp>
|
||||
#include <indicators/progress_spinner.hpp>
|
||||
|
||||
int main() {
|
||||
|
||||
// Hide cursor
|
||||
std::cout << "\e[?25l";
|
||||
indicators::show_console_cursor(false);
|
||||
|
||||
indicators::ProgressSpinner spinner{
|
||||
indicators::option::PostfixText{"Checking credentials"},
|
||||
@@ -34,7 +35,7 @@ int main() {
|
||||
thread.join();
|
||||
|
||||
// Show cursor
|
||||
std::cout << "\e[?25h";
|
||||
indicators::show_console_cursor(true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
#include <chrono>
|
||||
#include <indicators/cursor_control.hpp>
|
||||
#include <indicators/progress_bar.hpp>
|
||||
#include <thread>
|
||||
|
||||
int main() {
|
||||
// Hide cursor
|
||||
indicators::show_console_cursor(false);
|
||||
|
||||
indicators::ProgressBar bar{
|
||||
indicators::option::BarWidth{50},
|
||||
indicators::option::Start{" ["},
|
||||
@@ -27,7 +31,7 @@ int main() {
|
||||
}
|
||||
|
||||
// Show cursor
|
||||
std::cout << "\e[?25h";
|
||||
indicators::show_console_cursor(true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user