mirror of
https://github.com/p-ranav/indicators.git
synced 2025-12-16 04:18:51 +08:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3872f37abd | ||
|
|
a746832d97 | ||
|
|
824ca21bbf | ||
|
|
091a87e51a | ||
|
|
a6de479a9c | ||
|
|
cef20c7c4b | ||
|
|
08bf7ec793 | ||
|
|
fbdac646ee | ||
|
|
e0349eb806 | ||
|
|
ac6c93ea2b | ||
|
|
c793684c9c | ||
|
|
0c4ec7d773 | ||
|
|
9c855c95e7 | ||
|
|
7962c540a8 | ||
|
|
cefe02f449 | ||
|
|
05ba667474 | ||
|
|
13bdb4b396 | ||
|
|
cb8f728c68 | ||
|
|
222382c3a6 | ||
|
|
68d059d6d2 | ||
|
|
ef71abd9bc | ||
|
|
525ce444f4 | ||
|
|
4ea716116d | ||
|
|
6549b77d0b | ||
|
|
5050a88877 | ||
|
|
d6e70912bb | ||
|
|
bd4826c885 | ||
|
|
b44735a2a5 |
@@ -1,7 +1,9 @@
|
||||
cmake_minimum_required(VERSION 3.8)
|
||||
|
||||
if(DEFINED PROJECT_NAME)
|
||||
set(INDICATORS_SUBPROJECT ON)
|
||||
if(NOT DEFINED PROJECT_NAME)
|
||||
set(INDICATORS_IS_TOP_LEVEL ON)
|
||||
else()
|
||||
set(INDICATORS_IS_TOP_LEVEL OFF)
|
||||
endif()
|
||||
|
||||
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.12")
|
||||
@@ -20,6 +22,8 @@ if(EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake")
|
||||
conan_basic_setup()
|
||||
endif()
|
||||
|
||||
option(INDICATORS_INSTALL "Include an install target" ${INDICATORS_IS_TOP_LEVEL})
|
||||
option(INDICATORS_PACKAGE "Include package targets" ${INDICATORS_IS_TOP_LEVEL})
|
||||
option(INDICATORS_BUILD_TESTS "Build indicators tests + enable CTest")
|
||||
option(INDICATORS_SAMPLES "Build indicators samples")
|
||||
option(INDICATORS_DEMO "Build indicators demo" OFF)
|
||||
@@ -46,7 +50,7 @@ if(INDICATORS_SAMPLES)
|
||||
add_subdirectory(samples)
|
||||
endif()
|
||||
|
||||
if(NOT INDICATORS_SUBPROJECT)
|
||||
if(INDICATORS_INSTALL)
|
||||
configure_package_config_file(indicatorsConfig.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/indicatorsConfig.cmake
|
||||
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/indicators)
|
||||
@@ -71,7 +75,9 @@ if(NOT INDICATORS_SUBPROJECT)
|
||||
PATTERN "*.hpp")
|
||||
install(FILES LICENSE LICENSE.termcolor
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/licenses/indicators)
|
||||
endif()
|
||||
|
||||
if(INDICATORS_PACKAGE)
|
||||
if(EXISTS "${PROJECT_SOURCE_DIR}/.gitignore")
|
||||
# Simple glob to regex conversion (.gitignore => CPACK_SOURCE_IGNORE_FILES)
|
||||
file(READ ".gitignore" DOT_GITIGNORE)
|
||||
|
||||
83
README.md
83
README.md
@@ -3,9 +3,6 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://travis-ci.com/p-ranav/indicators">
|
||||
<img src="https://travis-ci.com/p-ranav/indicators.svg?branch=master" alt="ci status"/>
|
||||
</a>
|
||||
<a href="https://www.codacy.com/manual/p-ranav/indicators?utm_source=github.com&utm_medium=referral&utm_content=p-ranav/indicators&utm_campaign=Badge_Grade">
|
||||
<img src="https://api.codacy.com/project/badge/Grade/93401e73f250407cb32445afec4e3e99" alt="codacy"/>
|
||||
</a>
|
||||
@@ -83,6 +80,7 @@ int main() {
|
||||
option::End{"]"},
|
||||
option::PostfixText{"Extracting Archive"},
|
||||
option::ForegroundColor{Color::green},
|
||||
option::ShowPercentage{true},
|
||||
option::FontStyles{std::vector<FontStyle>{FontStyle::bold}}
|
||||
};
|
||||
|
||||
@@ -130,8 +128,8 @@ int main() {
|
||||
option::End{" ]"},
|
||||
option::PostfixText{"Loading dependency 1/4"},
|
||||
option::ForegroundColor{Color::cyan},
|
||||
option::FontStyles{std::vector<FontStyle>{FontStyle::bold}}
|
||||
};
|
||||
option::ShowPercentage{true},
|
||||
option::FontStyles{std::vector<FontStyle>{FontStyle::bold}} };
|
||||
|
||||
// Update bar state
|
||||
bar.set_progress(10); // 10% done
|
||||
@@ -193,6 +191,7 @@ int main() {
|
||||
option::End{"]"},
|
||||
option::PrefixText{"Training Gaze Network 👀"},
|
||||
option::ForegroundColor{Color::yellow},
|
||||
option::ShowPercentage{true},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::FontStyles{std::vector<FontStyle>{FontStyle::bold}}
|
||||
@@ -278,6 +277,7 @@ Are you in need of a smooth block progress bar using [unicode block elements](ht
|
||||
|
||||
```cpp
|
||||
#include <indicators/block_progress_bar.hpp>
|
||||
#include <indicators/cursor_control.hpp>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
|
||||
@@ -293,6 +293,7 @@ int main() {
|
||||
option::Start{"["},
|
||||
option::End{"]"},
|
||||
option::ForegroundColor{Color::white} ,
|
||||
option::ShowPercentage{true},
|
||||
option::FontStyles{std::vector<FontStyle>{FontStyle::bold}}
|
||||
};
|
||||
|
||||
@@ -342,6 +343,7 @@ int main() {
|
||||
option::Remainder{" "},
|
||||
option::End{" ]"},
|
||||
option::ForegroundColor{Color::yellow},
|
||||
option::ShowPercentage{true},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"Progress Bar #1 "},
|
||||
@@ -358,6 +360,7 @@ int main() {
|
||||
option::Remainder{" "},
|
||||
option::End{" ]"},
|
||||
option::ForegroundColor{Color::cyan},
|
||||
option::ShowPercentage{true},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"Progress Bar #2 "},
|
||||
@@ -373,6 +376,7 @@ int main() {
|
||||
option::Remainder{" "},
|
||||
option::End{" ]"},
|
||||
option::ForegroundColor{Color::red},
|
||||
option::ShowPercentage{true},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"Progress Bar #3 "},
|
||||
@@ -444,35 +448,59 @@ using namespace indicators;
|
||||
|
||||
int main() {
|
||||
|
||||
ProgressBar bar1{option::BarWidth{50}, option::ForegroundColor{Color::red},
|
||||
option::ShowElapsedTime{true}, option::ShowRemainingTime{true},
|
||||
option::PrefixText{"5c90d4a2d1a8: Downloading "}};
|
||||
auto bar1 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::red},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"5c90d4a2d1a8: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar2{option::BarWidth{50}, option::ForegroundColor{Color::yellow},
|
||||
option::ShowElapsedTime{true}, option::ShowRemainingTime{true},
|
||||
option::PrefixText{"22337bfd13a9: Downloading "}};
|
||||
auto bar2 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::yellow},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"22337bfd13a9: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar3{option::BarWidth{50}, option::ForegroundColor{Color::green},
|
||||
option::ShowElapsedTime{true}, option::ShowRemainingTime{true},
|
||||
option::PrefixText{"10f26c680a34: Downloading "}};
|
||||
auto bar3 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::green},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"10f26c680a34: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar4{option::BarWidth{50}, option::ForegroundColor{Color::white},
|
||||
option::ShowElapsedTime{true}, option::ShowRemainingTime{true},
|
||||
option::PrefixText{"6364e0d7a283: Downloading "}};
|
||||
auto bar4 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::white},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"6364e0d7a283: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar5{option::BarWidth{50}, option::ForegroundColor{Color::blue},
|
||||
option::ShowElapsedTime{true}, option::ShowRemainingTime{true},
|
||||
option::PrefixText{"ff1356ba118b: Downloading "}};
|
||||
auto bar5 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::blue},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"ff1356ba118b: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar6{option::BarWidth{50}, option::ForegroundColor{Color::cyan},
|
||||
option::ShowElapsedTime{true}, option::ShowRemainingTime{true},
|
||||
option::PrefixText{"5a17453338b4: Downloading "}};
|
||||
auto bar6 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::cyan},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"5a17453338b4: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
std::cout << termcolor::bold << termcolor::white << "Pulling image foo:bar/baz\n";
|
||||
|
||||
// Construct with 3 progress bars. We'll add 3 more at a later point
|
||||
DynamicProgress<ProgressBar> bars(bar1, bar2, bar3);
|
||||
|
||||
|
||||
// Do not hide bars when completed
|
||||
bars.set_option(option::HideBarWhenComplete{false});
|
||||
|
||||
@@ -520,7 +548,7 @@ int main() {
|
||||
if (bars[0].is_completed()) {
|
||||
bars[0].set_option(option::PrefixText{"5c90d4a2d1a8: Pull complete "});
|
||||
// bar1 is completed, adding bar6
|
||||
auto i = bars.push_back(bar6);
|
||||
auto i = bars.push_back(std::move(bar6));
|
||||
sixth_job = std::thread(job6, i);
|
||||
sixth_job.join();
|
||||
break;
|
||||
@@ -535,7 +563,7 @@ int main() {
|
||||
if (bars[1].is_completed()) {
|
||||
bars[1].set_option(option::PrefixText{"22337bfd13a9: Pull complete "});
|
||||
// bar2 is completed, adding bar5
|
||||
auto i = bars.push_back(bar5);
|
||||
auto i = bars.push_back(std::move(bar5));
|
||||
fifth_job = std::thread(job5, i);
|
||||
fifth_job.join();
|
||||
break;
|
||||
@@ -550,7 +578,7 @@ int main() {
|
||||
if (bars[2].is_completed()) {
|
||||
bars[2].set_option(option::PrefixText{"10f26c680a34: Pull complete "});
|
||||
// bar3 is completed, adding bar4
|
||||
auto i = bars.push_back(bar4);
|
||||
auto i = bars.push_back(std::move(bar4));
|
||||
fourth_job = std::thread(job4, i);
|
||||
fourth_job.join();
|
||||
break;
|
||||
@@ -701,6 +729,7 @@ int main() {
|
||||
BlockProgressBar bar{
|
||||
option::BarWidth{80},
|
||||
option::ForegroundColor{Color::white},
|
||||
option::ShowPercentage{true},
|
||||
option::FontStyles{
|
||||
std::vector<FontStyle>{FontStyle::bold}},
|
||||
option::MaxProgress{numbers.size()}
|
||||
|
||||
@@ -102,10 +102,10 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void set_progress(float value) {
|
||||
void set_progress(size_t value) {
|
||||
{
|
||||
std::lock_guard<std::mutex> lock{mutex_};
|
||||
progress_ = value;
|
||||
tick_ = value;
|
||||
}
|
||||
save_start_time();
|
||||
print_progress();
|
||||
@@ -114,7 +114,7 @@ public:
|
||||
void tick() {
|
||||
{
|
||||
std::lock_guard<std::mutex> lock{mutex_};
|
||||
progress_ += 1;
|
||||
tick_++;
|
||||
}
|
||||
save_start_time();
|
||||
print_progress();
|
||||
@@ -122,8 +122,7 @@ public:
|
||||
|
||||
size_t current() {
|
||||
std::lock_guard<std::mutex> lock{mutex_};
|
||||
return (std::min)(static_cast<size_t>(progress_),
|
||||
size_t(get_value<details::ProgressBarOption::max_progress>()));
|
||||
return (std::min)(tick_, size_t(get_value<details::ProgressBarOption::max_progress>()));
|
||||
}
|
||||
|
||||
bool is_completed() const { return get_value<details::ProgressBarOption::completed>(); }
|
||||
@@ -147,6 +146,7 @@ private:
|
||||
|
||||
Settings settings_;
|
||||
float progress_{0.0};
|
||||
size_t tick_{0};
|
||||
std::chrono::time_point<std::chrono::high_resolution_clock> start_time_point_;
|
||||
std::mutex mutex_;
|
||||
|
||||
@@ -164,7 +164,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_prefix_text() {
|
||||
std::pair<std::string, int> get_prefix_text() {
|
||||
std::stringstream os;
|
||||
os << get_value<details::ProgressBarOption::prefix_text>();
|
||||
const auto result = os.str();
|
||||
@@ -172,14 +172,15 @@ private:
|
||||
return {result, result_size};
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_postfix_text() {
|
||||
std::pair<std::string, int> get_postfix_text() {
|
||||
std::stringstream os;
|
||||
const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
|
||||
progress_ = static_cast<float>(tick_)/max_progress;
|
||||
auto now = std::chrono::high_resolution_clock::now();
|
||||
auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(now - start_time_point_);
|
||||
|
||||
if (get_value<details::ProgressBarOption::show_percentage>()) {
|
||||
os << " " << (std::min)(static_cast<size_t>(progress_ / max_progress * 100.0), size_t(100))
|
||||
os << " " << (std::min)(static_cast<size_t>(progress_ * 100.0), size_t(100))
|
||||
<< "%";
|
||||
}
|
||||
|
||||
@@ -201,9 +202,8 @@ private:
|
||||
|
||||
if (saved_start_time) {
|
||||
auto eta = std::chrono::nanoseconds(
|
||||
progress_ > 0
|
||||
? static_cast<long long>(std::ceil(float(elapsed.count()) *
|
||||
max_progress / progress_))
|
||||
tick_ > 0
|
||||
? static_cast<long long>(std::ceil(float(elapsed.count()) / progress_))
|
||||
: 0);
|
||||
auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta);
|
||||
details::write_duration(os, remaining);
|
||||
@@ -232,7 +232,7 @@ public:
|
||||
|
||||
const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
|
||||
if (multi_progress_mode_ && !from_multi_progress) {
|
||||
if (progress_ > max_progress) {
|
||||
if (tick_ > max_progress) {
|
||||
get_value<details::ProgressBarOption::completed>() = true;
|
||||
}
|
||||
return;
|
||||
@@ -253,7 +253,7 @@ public:
|
||||
|
||||
details::BlockProgressScaleWriter writer{os,
|
||||
get_value<details::ProgressBarOption::bar_width>()};
|
||||
writer.write(progress_ / max_progress * 100);
|
||||
writer.write(progress_ * 100);
|
||||
|
||||
os << get_value<details::ProgressBarOption::end>();
|
||||
|
||||
@@ -269,14 +269,16 @@ public:
|
||||
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);
|
||||
if (remaining > 0) {
|
||||
if (prefix_length == -1 || postfix_length == -1) {
|
||||
os << "\r";
|
||||
} else if (remaining > 0) {
|
||||
os << std::string(remaining, ' ') << "\r";
|
||||
} else if (remaining < 0) {
|
||||
// Do nothing. Maybe in the future truncate postfix with ...
|
||||
}
|
||||
os.flush();
|
||||
|
||||
if (progress_ > max_progress) {
|
||||
if (tick_ > max_progress) {
|
||||
get_value<details::ProgressBarOption::completed>() = true;
|
||||
}
|
||||
if (get_value<details::ProgressBarOption::completed>() &&
|
||||
@@ -287,4 +289,4 @@ public:
|
||||
|
||||
} // namespace indicators
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -311,7 +311,10 @@ static inline int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) {
|
||||
// convert UTF-8 string to wstring
|
||||
#ifdef _MSC_VER
|
||||
static inline std::wstring utf8_decode(const std::string& s) {
|
||||
std::string curLocale = setlocale(LC_ALL, "");
|
||||
auto r = setlocale(LC_ALL, NULL);
|
||||
std::string curLocale;
|
||||
if (r)
|
||||
curLocale = r;
|
||||
const char* _Source = s.c_str();
|
||||
size_t _Dsize = std::strlen(_Source) + 1;
|
||||
wchar_t* _Dest = new wchar_t[_Dsize];
|
||||
@@ -324,7 +327,10 @@ static inline std::wstring utf8_decode(const std::string& s) {
|
||||
}
|
||||
#else
|
||||
static inline std::wstring utf8_decode(const std::string& s) {
|
||||
std::string curLocale = setlocale(LC_ALL, "");
|
||||
auto r = setlocale(LC_ALL, NULL);
|
||||
std::string curLocale;
|
||||
if (r)
|
||||
curLocale = r;
|
||||
const char* _Source = s.c_str();
|
||||
size_t _Dsize = mbstowcs(NULL, _Source, 0) + 1;
|
||||
wchar_t* _Dest = new wchar_t[_Dsize];
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <indicators/cursor_movement.hpp>
|
||||
#include <indicators/details/stream_helper.hpp>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
|
||||
@@ -19,10 +20,10 @@ template <typename Indicator> class DynamicProgress {
|
||||
using Settings = std::tuple<option::HideBarWhenComplete>;
|
||||
|
||||
public:
|
||||
template <typename... Indicators> explicit DynamicProgress(Indicators &... bars) {
|
||||
bars_ = {bars...};
|
||||
template <typename... Indicators> explicit DynamicProgress(Indicators &&... bars) {
|
||||
(bars_.emplace_back(std::move(bars)), ...);
|
||||
for (auto &bar : bars_) {
|
||||
bar.get().multi_progress_mode_ = true;
|
||||
bar->multi_progress_mode_ = true;
|
||||
++total_count_;
|
||||
++incomplete_count_;
|
||||
}
|
||||
@@ -31,13 +32,13 @@ public:
|
||||
Indicator &operator[](size_t index) {
|
||||
print_progress();
|
||||
std::lock_guard<std::mutex> lock{mutex_};
|
||||
return bars_[index].get();
|
||||
return *bars_[index];
|
||||
}
|
||||
|
||||
size_t push_back(Indicator &bar) {
|
||||
size_t push_back(std::unique_ptr<Indicator> bar) {
|
||||
std::lock_guard<std::mutex> lock{mutex_};
|
||||
bar.multi_progress_mode_ = true;
|
||||
bars_.push_back(bar);
|
||||
bar->multi_progress_mode_ = true;
|
||||
bars_.push_back(std::move(bar));
|
||||
return bars_.size() - 1;
|
||||
}
|
||||
|
||||
@@ -63,7 +64,7 @@ private:
|
||||
Settings settings_;
|
||||
std::atomic<bool> started_{false};
|
||||
std::mutex mutex_;
|
||||
std::vector<std::reference_wrapper<Indicator>> bars_;
|
||||
std::vector<std::unique_ptr<Indicator>> bars_;
|
||||
std::atomic<size_t> total_count_{0};
|
||||
std::atomic<size_t> incomplete_count_{0};
|
||||
|
||||
@@ -93,8 +94,8 @@ public:
|
||||
}
|
||||
incomplete_count_ = 0;
|
||||
for (auto &bar : bars_) {
|
||||
if (!bar.get().is_completed()) {
|
||||
bar.get().print_progress(true);
|
||||
if (!bar->is_completed()) {
|
||||
bar->print_progress(true);
|
||||
std::cout << "\n";
|
||||
++incomplete_count_;
|
||||
}
|
||||
@@ -106,7 +107,7 @@ public:
|
||||
if (started_)
|
||||
move_up(static_cast<int>(total_count_));
|
||||
for (auto &bar : bars_) {
|
||||
bar.get().print_progress(true);
|
||||
bar->print_progress(true);
|
||||
std::cout << "\n";
|
||||
}
|
||||
if (!started_)
|
||||
@@ -119,4 +120,4 @@ public:
|
||||
|
||||
} // namespace indicators
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -160,7 +160,7 @@ private:
|
||||
template <typename Indicator> friend class DynamicProgress;
|
||||
std::atomic<bool> multi_progress_mode_{false};
|
||||
|
||||
std::pair<std::string, size_t> get_prefix_text() {
|
||||
std::pair<std::string, int> get_prefix_text() {
|
||||
std::stringstream os;
|
||||
os << get_value<details::ProgressBarOption::prefix_text>();
|
||||
const auto result = os.str();
|
||||
@@ -168,7 +168,7 @@ private:
|
||||
return {result, result_size};
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_postfix_text() {
|
||||
std::pair<std::string, int> get_postfix_text() {
|
||||
std::stringstream os;
|
||||
os << " " << get_value<details::ProgressBarOption::postfix_text>();
|
||||
|
||||
@@ -219,7 +219,9 @@ public:
|
||||
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);
|
||||
if (remaining > 0) {
|
||||
if (prefix_length == -1 || postfix_length == -1) {
|
||||
os << "\r";
|
||||
} else if (remaining > 0) {
|
||||
os << std::string(remaining, ' ') << "\r";
|
||||
} else if (remaining < 0) {
|
||||
// Do nothing. Maybe in the future truncate postfix with ...
|
||||
|
||||
@@ -216,7 +216,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_prefix_text() {
|
||||
std::pair<std::string, int> get_prefix_text() {
|
||||
std::stringstream os;
|
||||
os << get_value<details::ProgressBarOption::prefix_text>();
|
||||
const auto result = os.str();
|
||||
@@ -224,7 +224,7 @@ private:
|
||||
return {result, result_size};
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_postfix_text() {
|
||||
std::pair<std::string, int> get_postfix_text() {
|
||||
std::stringstream os;
|
||||
const auto max_progress =
|
||||
get_value<details::ProgressBarOption::max_progress>();
|
||||
@@ -338,7 +338,9 @@ public:
|
||||
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);
|
||||
if (remaining > 0) {
|
||||
if (prefix_length == -1 || postfix_length == -1) {
|
||||
os << "\r";
|
||||
} else if (remaining > 0) {
|
||||
os << std::string(remaining, ' ') << "\r";
|
||||
} else if (remaining < 0) {
|
||||
// Do nothing. Maybe in the future truncate postfix with ...
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstdint>
|
||||
|
||||
// Detect target's platform and set some macros in order to wrap platform
|
||||
// specific code this library depends on.
|
||||
|
||||
@@ -14,10 +14,10 @@ int main() {
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
|
||||
|
||||
// Update bar state
|
||||
auto progress = 0.0f;
|
||||
size_t progress = 0;
|
||||
while (true) {
|
||||
bar.set_progress(progress);
|
||||
progress += 0.25f;
|
||||
progress++;
|
||||
if (bar.is_completed())
|
||||
break;
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
||||
|
||||
@@ -4,57 +4,60 @@ using namespace indicators;
|
||||
|
||||
int main() {
|
||||
|
||||
ProgressBar bar1{option::BarWidth{50},
|
||||
auto bar1 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::red},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"5c90d4a2d1a8: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar2{option::BarWidth{50},
|
||||
auto bar2 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::yellow},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"22337bfd13a9: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar3{option::BarWidth{50},
|
||||
auto bar3 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::green},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"10f26c680a34: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar4{option::BarWidth{50},
|
||||
auto bar4 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::white},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"6364e0d7a283: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar5{option::BarWidth{50},
|
||||
auto bar5 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::blue},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"ff1356ba118b: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
ProgressBar bar6{option::BarWidth{50},
|
||||
auto bar6 = std::make_unique<ProgressBar>(option::BarWidth{50},
|
||||
option::ForegroundColor{Color::cyan},
|
||||
option::ShowElapsedTime{true},
|
||||
option::ShowRemainingTime{true},
|
||||
option::PrefixText{"5a17453338b4: Downloading "},
|
||||
indicators::option::FontStyles{
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
|
||||
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
|
||||
|
||||
std::cout << termcolor::bold << termcolor::white << "Pulling image foo:bar/baz\n";
|
||||
|
||||
// Construct with 3 progress bars. We'll add 3 more at a later point
|
||||
DynamicProgress<ProgressBar> bars(bar1, bar2, bar3);
|
||||
|
||||
// Do not hide bars when completed
|
||||
bars.set_option(option::HideBarWhenComplete{false});
|
||||
|
||||
std::thread fourth_job, fifth_job, sixth_job;
|
||||
@@ -101,7 +104,7 @@ int main() {
|
||||
if (bars[0].is_completed()) {
|
||||
bars[0].set_option(option::PrefixText{"5c90d4a2d1a8: Pull complete "});
|
||||
// bar1 is completed, adding bar6
|
||||
auto i = bars.push_back(bar6);
|
||||
auto i = bars.push_back(std::move(bar6));
|
||||
sixth_job = std::thread(job6, i);
|
||||
sixth_job.join();
|
||||
break;
|
||||
@@ -116,7 +119,7 @@ int main() {
|
||||
if (bars[1].is_completed()) {
|
||||
bars[1].set_option(option::PrefixText{"22337bfd13a9: Pull complete "});
|
||||
// bar2 is completed, adding bar5
|
||||
auto i = bars.push_back(bar5);
|
||||
auto i = bars.push_back(std::move(bar5));
|
||||
fifth_job = std::thread(job5, i);
|
||||
fifth_job.join();
|
||||
break;
|
||||
@@ -131,7 +134,7 @@ int main() {
|
||||
if (bars[2].is_completed()) {
|
||||
bars[2].set_option(option::PrefixText{"10f26c680a34: Pull complete "});
|
||||
// bar3 is completed, adding bar4
|
||||
auto i = bars.push_back(bar4);
|
||||
auto i = bars.push_back(std::move(bar4));
|
||||
fourth_job = std::thread(job4, i);
|
||||
fourth_job.join();
|
||||
break;
|
||||
|
||||
@@ -46,6 +46,7 @@ enum class ProgressType { incremental, decremental };
|
||||
|
||||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstdint>
|
||||
|
||||
// Detect target's platform and set some macros in order to wrap platform
|
||||
// specific code this library depends on.
|
||||
@@ -1651,7 +1652,10 @@ static inline int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) {
|
||||
// convert UTF-8 string to wstring
|
||||
#ifdef _MSC_VER
|
||||
static inline std::wstring utf8_decode(const std::string& s) {
|
||||
std::string curLocale = setlocale(LC_ALL, "");
|
||||
auto r = setlocale(LC_ALL, "");
|
||||
std::string curLocale;
|
||||
if (r)
|
||||
curLocale = r;
|
||||
const char* _Source = s.c_str();
|
||||
size_t _Dsize = std::strlen(_Source) + 1;
|
||||
wchar_t* _Dest = new wchar_t[_Dsize];
|
||||
@@ -1664,7 +1668,10 @@ static inline std::wstring utf8_decode(const std::string& s) {
|
||||
}
|
||||
#else
|
||||
static inline std::wstring utf8_decode(const std::string& s) {
|
||||
std::string curLocale = setlocale(LC_ALL, "");
|
||||
auto r = setlocale(LC_ALL, "");
|
||||
std::string curLocale;
|
||||
if (r)
|
||||
curLocale = r;
|
||||
const char* _Source = s.c_str();
|
||||
size_t _Dsize = mbstowcs(NULL, _Source, 0) + 1;
|
||||
wchar_t* _Dest = new wchar_t[_Dsize];
|
||||
@@ -2128,7 +2135,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_prefix_text() {
|
||||
std::pair<std::string, int> get_prefix_text() {
|
||||
std::stringstream os;
|
||||
os << get_value<details::ProgressBarOption::prefix_text>();
|
||||
const auto result = os.str();
|
||||
@@ -2136,7 +2143,7 @@ private:
|
||||
return {result, result_size};
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_postfix_text() {
|
||||
std::pair<std::string, int> get_postfix_text() {
|
||||
std::stringstream os;
|
||||
const auto max_progress =
|
||||
get_value<details::ProgressBarOption::max_progress>();
|
||||
@@ -2250,7 +2257,9 @@ public:
|
||||
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);
|
||||
if (remaining > 0) {
|
||||
if (prefix_length == -1 || postfix_length == -1) {
|
||||
os << "\r";
|
||||
} else if (remaining > 0) {
|
||||
os << std::string(remaining, ' ') << "\r";
|
||||
} else if (remaining < 0) {
|
||||
// Do nothing. Maybe in the future truncate postfix with ...
|
||||
@@ -2437,7 +2446,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_prefix_text() {
|
||||
std::pair<std::string, int> get_prefix_text() {
|
||||
std::stringstream os;
|
||||
os << get_value<details::ProgressBarOption::prefix_text>();
|
||||
const auto result = os.str();
|
||||
@@ -2445,7 +2454,7 @@ private:
|
||||
return {result, result_size};
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_postfix_text() {
|
||||
std::pair<std::string, int> get_postfix_text() {
|
||||
std::stringstream os;
|
||||
const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
|
||||
auto now = std::chrono::high_resolution_clock::now();
|
||||
@@ -2542,7 +2551,9 @@ public:
|
||||
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);
|
||||
if (remaining > 0) {
|
||||
if (prefix_length == -1 || postfix_length == -1) {
|
||||
os << "\r";
|
||||
} else if (remaining > 0) {
|
||||
os << std::string(remaining, ' ') << "\r";
|
||||
} else if (remaining < 0) {
|
||||
// Do nothing. Maybe in the future truncate postfix with ...
|
||||
@@ -2724,7 +2735,7 @@ private:
|
||||
template <typename Indicator> friend class DynamicProgress;
|
||||
std::atomic<bool> multi_progress_mode_{false};
|
||||
|
||||
std::pair<std::string, size_t> get_prefix_text() {
|
||||
std::pair<std::string, int> get_prefix_text() {
|
||||
std::stringstream os;
|
||||
os << get_value<details::ProgressBarOption::prefix_text>();
|
||||
const auto result = os.str();
|
||||
@@ -2732,7 +2743,7 @@ private:
|
||||
return {result, result_size};
|
||||
}
|
||||
|
||||
std::pair<std::string, size_t> get_postfix_text() {
|
||||
std::pair<std::string, int> get_postfix_text() {
|
||||
std::stringstream os;
|
||||
os << " " << get_value<details::ProgressBarOption::postfix_text>();
|
||||
|
||||
@@ -2783,7 +2794,9 @@ public:
|
||||
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);
|
||||
if (remaining > 0) {
|
||||
if (prefix_length == -1 || postfix_length == -1) {
|
||||
os << "\r";
|
||||
} else if (remaining > 0) {
|
||||
os << std::string(remaining, ' ') << "\r";
|
||||
} else if (remaining < 0) {
|
||||
// Do nothing. Maybe in the future truncate postfix with ...
|
||||
|
||||
Reference in New Issue
Block a user