diff --git a/include/indicators/block_progress_bar.hpp b/include/indicators/block_progress_bar.hpp index 8bb4086..58c236d 100644 --- a/include/indicators/block_progress_bar.hpp +++ b/include/indicators/block_progress_bar.hpp @@ -168,6 +168,53 @@ private: return os.str().size(); } + size_t get_postfix_length() { + std::stringstream os; + const auto max_progress = get_value(); + auto now = std::chrono::high_resolution_clock::now(); + auto elapsed = std::chrono::duration_cast(now - start_time_point_); + + if (get_value()) { + os << " " << std::min(static_cast(progress_ / max_progress * 100.0), size_t(100)) + << "%"; + } + + auto &saved_start_time = get_value(); + + if (get_value()) { + os << " ["; + if (saved_start_time) + details::write_duration(os, elapsed); + else + os << "00:00s"; + } + + if (get_value()) { + if (get_value()) + os << "<"; + else + os << " ["; + + if (saved_start_time) { + auto eta = std::chrono::nanoseconds( + progress_ > 0 ? static_cast(elapsed.count() * max_progress / progress_) : 0); + auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); + details::write_duration(os, remaining); + } else { + os << "00:00s"; + } + + os << "]"; + } else { + if (get_value()) + os << "]"; + } + + os << " " << get_value(); + + return os.str().size(); + } + public: void print_progress(bool from_multi_progress = false) { std::lock_guard lock{mutex_}; @@ -240,6 +287,7 @@ public: os << " " << get_value() << std::string(get_value(), ' ') << "\r"; os.flush(); + if (progress_ > max_progress) { get_value() = true; } diff --git a/include/indicators/progress_bar.hpp b/include/indicators/progress_bar.hpp index 3978f82..d9edcaf 100644 --- a/include/indicators/progress_bar.hpp +++ b/include/indicators/progress_bar.hpp @@ -214,16 +214,14 @@ private: } } - size_t get_prefix_length() { + std::pair get_prefix_text() { std::stringstream os; os << get_value(); - return os.str().size(); + return {os.str(), os.str().size()}; } - size_t get_postfix_length() { + std::pair get_postfix_text() { std::stringstream os; - const auto min_progress = - get_value(); const auto max_progress = get_value(); @@ -271,7 +269,7 @@ private: os << " " << get_value(); - return os.str().size(); + return {os.str(), os.str().size()}; } public: @@ -305,7 +303,10 @@ public: for (auto &style : get_value()) details::set_font_style(os, style); - os << get_value(); + const auto prefix_pair = get_prefix_text(); + const auto prefix_text = prefix_pair.first; + const auto prefix_length = prefix_pair.second; + os << prefix_text; os << get_value(); @@ -318,56 +319,15 @@ public: os << get_value(); - if (get_value()) { - os << " " - << std::min(static_cast(static_cast(progress_) / - max_progress * 100), - size_t(100)) - << "%"; - } - - auto &saved_start_time = - get_value(); - - if (get_value()) { - os << " ["; - if (saved_start_time) - details::write_duration(os, elapsed_); - else - os << "00:00s"; - } - - if (get_value()) { - if (get_value()) - os << "<"; - else - os << " ["; - - if (saved_start_time) { - auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(elapsed_.count() * - max_progress / progress_) - : 0); - auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); - details::write_duration(os, remaining); - } else { - os << "00:00s"; - } - - os << "]"; - } else { - if (get_value()) - os << "]"; - } - - os << " " << get_value(); + const auto postfix_pair = get_postfix_text(); + const auto postfix_text = postfix_pair.first; + const auto postfix_length = postfix_pair.second; + os << postfix_text; // Get length of prefix text and postfix text - const auto prefix_length = get_prefix_length(); const auto start_length = get_value().size(); const auto bar_width = get_value(); const auto end_length = get_value().size(); - const auto postfix_length = get_postfix_length(); const auto terminal_width = terminal_size().second; // prefix + bar_width + postfix should be <= terminal_width const int remaining = terminal_width - (prefix_length + start_length + bar_width + end_length + postfix_length);