mirror of
https://github.com/p-ranav/indicators.git
synced 2025-12-16 04:18:51 +08:00
Draft implementation of MultiProgress for progress bars
This commit is contained in:
@@ -231,6 +231,9 @@ private:
|
||||
auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta);
|
||||
_print_duration(std::cout, remaining);
|
||||
std::cout << "]";
|
||||
} else {
|
||||
if (_show_elapsed_time)
|
||||
std::cout << "]";
|
||||
}
|
||||
|
||||
if (_max_postfix_text_length == 0)
|
||||
|
||||
@@ -26,51 +26,62 @@ SOFTWARE.
|
||||
*/
|
||||
#pragma once
|
||||
#define NOMINMAX
|
||||
#include <functional>
|
||||
#include <indicators/progress_bar.hpp>
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
|
||||
namespace indicators {
|
||||
|
||||
template <size_t count>
|
||||
class MultiProgress {
|
||||
template <size_t count> class MultiProgress {
|
||||
public:
|
||||
void add_progress_bar(ProgressBar& bar) {
|
||||
void add_progress_bar(ProgressBar &bar) {
|
||||
_bars.push_back(bar);
|
||||
bar._multi_progress_mode = true;
|
||||
}
|
||||
|
||||
template <size_t index>
|
||||
typename std::enable_if<(index < count), void>::type
|
||||
set_progress(float value) {
|
||||
_bars[index].get().set_progress(value);
|
||||
_print_progress();
|
||||
typename std::enable_if<(index < count), void>::type set_progress(float value) {
|
||||
if (!_bars[index].get().is_completed())
|
||||
_bars[index].get().set_progress(value);
|
||||
_print_progress();
|
||||
}
|
||||
|
||||
template <size_t index>
|
||||
typename std::enable_if<(index < count), void>::type
|
||||
tick() {
|
||||
_bars[index].get().tick();
|
||||
template <size_t index> typename std::enable_if<(index < count), void>::type tick() {
|
||||
if (!_bars[index].get().is_completed())
|
||||
_bars[index].get().tick();
|
||||
_print_progress();
|
||||
}
|
||||
|
||||
template <size_t index>
|
||||
typename std::enable_if<(index < count), bool>::type
|
||||
is_completed() const { return _bars[index].get().is_completed(); }
|
||||
typename std::enable_if<(index < count), bool>::type is_completed() const {
|
||||
return _bars[index].get().is_completed();
|
||||
}
|
||||
|
||||
private:
|
||||
std::atomic<bool> _started{false};
|
||||
std::mutex _mutex;
|
||||
std::vector<std::reference_wrapper<ProgressBar>> _bars;
|
||||
|
||||
void _print_progress() {
|
||||
bool _all_completed() {
|
||||
bool result{true};
|
||||
for (size_t i = 0; i < count; ++i)
|
||||
std::cout << "\x1b[A";
|
||||
for (auto& bar: _bars) {
|
||||
bar.get()._print_progress();
|
||||
result &= _bars[i].get().is_completed();
|
||||
return result;
|
||||
}
|
||||
|
||||
void _print_progress() {
|
||||
std::unique_lock<std::mutex> lock{_mutex};
|
||||
if (_started)
|
||||
for (size_t i = 0; i < count; ++i)
|
||||
std::cout << "\x1b[A";
|
||||
for (auto &bar : _bars) {
|
||||
bar.get()._print_progress(true);
|
||||
std::cout << "\n";
|
||||
}
|
||||
std::cout << termcolor::reset;
|
||||
if (!_started)
|
||||
_started = true;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
} // namespace indicators
|
||||
|
||||
@@ -36,7 +36,6 @@ SOFTWARE.
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <indicators/multi_progress.hpp>
|
||||
|
||||
namespace indicators {
|
||||
|
||||
@@ -146,10 +145,9 @@ private:
|
||||
std::atomic<bool> _saved_start_time{false};
|
||||
std::chrono::time_point<std::chrono::high_resolution_clock> _start_time_point;
|
||||
std::mutex _mutex;
|
||||
Color _foreground_color;
|
||||
Color _foreground_color{indicators::Color::WHITE};
|
||||
|
||||
template <size_t count>
|
||||
friend class MultiProgress;
|
||||
template <size_t count> friend class MultiProgress;
|
||||
std::atomic<bool> _multi_progress_mode{false};
|
||||
|
||||
std::ostream &_print_duration(std::ostream &os, std::chrono::nanoseconds ns) {
|
||||
@@ -181,7 +179,13 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
void _print_progress() {
|
||||
void _print_progress(bool force = false) {
|
||||
if (_multi_progress_mode && !force) {
|
||||
if (_progress > 100.0) {
|
||||
_completed = true;
|
||||
}
|
||||
return;
|
||||
}
|
||||
std::unique_lock<std::mutex> lock{_mutex};
|
||||
auto now = std::chrono::high_resolution_clock::now();
|
||||
auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(now - _start_time_point);
|
||||
@@ -244,6 +248,9 @@ private:
|
||||
auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta);
|
||||
_print_duration(std::cout, remaining);
|
||||
std::cout << "]";
|
||||
} else {
|
||||
if (_show_elapsed_time)
|
||||
std::cout << "]";
|
||||
}
|
||||
|
||||
if (_max_postfix_text_length == 0)
|
||||
@@ -253,7 +260,7 @@ private:
|
||||
if (_progress > 100.0) {
|
||||
_completed = true;
|
||||
}
|
||||
if (_completed)
|
||||
if (_completed && !force)
|
||||
std::cout << termcolor::reset << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -207,6 +207,9 @@ private:
|
||||
auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta);
|
||||
_print_duration(std::cout, remaining);
|
||||
std::cout << "]";
|
||||
} else {
|
||||
if (_show_elapsed_time)
|
||||
std::cout << "]";
|
||||
}
|
||||
|
||||
if (_max_postfix_text_length == 0)
|
||||
|
||||
Reference in New Issue
Block a user