diff --git a/include/progress/bar.hpp b/include/progress/bar.hpp index 74859a8..1d67e9c 100644 --- a/include/progress/bar.hpp +++ b/include/progress/bar.hpp @@ -45,6 +45,13 @@ public: _end = end; } + void append_text(const std::string& text) { + std::unique_lock lock{_mutex}; + _text_after = text; + if (_text_after.length() > _max_text_after_length) + _max_text_after_length = _text_after.length(); + } + void show_percentage(bool flag) { _show_percentage = flag; } void set_progress(float value) { @@ -78,11 +85,14 @@ public: private: float _progress{0.0}; size_t _bar_width{100}; + std::string _text_before{""}; std::string _start{"["}; std::string _fill{"="}; std::string _lead{">"}; std::string _remainder{" "}; std::string _end{"]"}; + std::string _text_after{""}; + std::atomic _max_text_after_length{0}; std::atomic _completed{false}; std::atomic _show_percentage{true}; std::mutex _mutex; @@ -128,9 +138,8 @@ private: } std::cout << _end; if (_show_percentage) - std::cout << " " << static_cast(_progress) << "%\r"; - else - std::cout << "\r"; + std::cout << " " << static_cast(_progress) << "%"; + std::cout << " " << _text_after << std::string(_max_text_after_length, ' ') << "\r"; std::cout.flush(); if (_completed) std::cout << termcolor::reset << std::endl; diff --git a/test/bar.cpp b/test/bar.cpp index d02277f..978bf94 100644 --- a/test/bar.cpp +++ b/test/bar.cpp @@ -1,4 +1,5 @@ #include +#include int main() { @@ -11,7 +12,7 @@ int main() { bar.lead_progress_with("■"); bar.fill_remainder_with("-"); bar.end_with(" ]"); - bar.color(ProgressBar::Color::GREEN); + bar.color(ProgressBar::Color::YELLOW); // As configured, the bar will look like this: // @@ -19,12 +20,29 @@ int main() { // // - auto job = [&bar]() { + std::atomic index{0}; + std::vector status_text = + { + "Rocket.exe is not responding", + "Finding a replacement engineer", + "Buying more snacks", + "Assimilating the modding community", + "Crossing fingers", + "Porting KSP to a Nokia 3310" + "Flexing struts", + "Releasing space whales", + "Watching paint dry" + }; + + auto job = [&bar, &index, &status_text]() { while (true) { - if (bar.completed()) + if (bar.completed()) { break; + } + bar.append_text(status_text[index % status_text.size()]); bar.tick(); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); + index += 1; + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); } };