Исходник Красивый консольный ProgressBar

Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Сегодня я хочу поделиться с вами достаточно неплохой библиотекой для визуализации длительных задач командной строки или Powershell. Она также поддерживает создание дочерних индикаторов выполнения, что позволяет довольно хорошо визуализировать зависимости и параллелизм. Разработчики добавили поддержку .NET Core, поэтому проблем с кроссплатформенностью можно не ожидать :).

Официальный пакет на NuGet:
Пожалуйста, авторизуйтесь для просмотра ссылки.

GitHub репозиторий:
Пожалуйста, авторизуйтесь для просмотра ссылки.


Как это выглядит?

Package Manager
PM> Install-Package NotificationManager

.NET CLI
dotnet add package NotificationManager

Использование
Пример реализации прогрессбара
C#:
const int totalTicks = 10;
var options = new ProgressBarOptions
{
    ProgressCharacter = '─',
    ProgressBarOnBottom = true
};
using (var pbar = new ProgressBar(totalTicks, "Initial message", options))
{
    pbar.Tick(); //will advance pbar to 1 out of 10.
    //we can also advance and update the progressbar text
    pbar.Tick("Step 2 of 10");
}

События прогрессбара
Существует 2 способа "подписаться на событие" изменения прогресса. Можно использовать функцию Tick(), как описанно выше. Альтернативным способом является использование экземпляра IProgress<T>, который вы можете получить вызовом AsProgress<T>() в объекте ранее созданного прогрессбара.

Для простых случаев, когда тип прогресса представляет собой плавающее значение между 0.0 и 1.0, представляющее процент завершения, используйте ProgressBar.AsProgress<float>():
C#:
using ProgressBar progressBar = new ProgressBar(10000, "My Progress Message");
IProgress progress = progressBar.AsProgress<float>();
progress.Report(0.25); // Advances the progress bar to 25%
Больше примеров можно посмотреть
Пожалуйста, авторизуйтесь для просмотра ссылки.
или
Пожалуйста, авторизуйтесь для просмотра ссылки.
.

Изменение стиля
Многие свойства пргрессбара могут быть стилизованы, включая цвет переднего плана, фон (неактивная часть) и изменение цвета по завершении.
C#:
const int totalTicks = 10;
var options = new ProgressBarOptions
{
    ForegroundColor = ConsoleColor.Yellow,
    ForegroundColorDone = ConsoleColor.DarkGreen,
    BackgroundColor = ConsoleColor.DarkGray,
    BackgroundCharacter = '\u2593'
};
using (var pbar = new ProgressBar(totalTicks, "showing off styling", options))
{
    TickToCompletion(pbar, totalTicks, sleep: 500);
}

Наследование прогрессбаров
Прогрессбар может создавать дочерние элементы, каждый дочерний прогрессбар может порождать свои собственные. У каждого из них могут быть свои варианты стилизации.

Это отлично подходит для визуализации параллельных запущенных задач.
C#:
const int totalTicks = 10;
var options = new ProgressBarOptions
{
    ForegroundColor = ConsoleColor.Yellow,
    BackgroundColor = ConsoleColor.DarkYellow,
    ProgressCharacter = '─'
};
var childOptions = new ProgressBarOptions
{
    ForegroundColor = ConsoleColor.Green,
    BackgroundColor = ConsoleColor.DarkGreen,
    ProgressCharacter = '─'
};
using (var pbar = new ProgressBar(totalTicks, "main progressbar", options))
{
    TickToCompletion(pbar, totalTicks, sleep: 10, childAction: () =>
    {
        using (var child = pbar.Spawn(totalTicks, "child actions", childOptions))
        {
            TickToCompletion(child, totalTicks, sleep: 100);
        }
    });
}
По умолчанию дочерние элементы будут сворачиваться, освобождая место для новых/параллельных прогрессбаров. Вы можете сохранить их, установив CollapseWhenFinished = false

Библиотека обладает гораздо большим функционалом, чем я указал в теме. Более подробно с ним можно ознакомится в официальном репозитории, однако, к сожалению, документация от разработчиков, вопреки обещаниям, так еще и не вышла :(
 
Арбитр
Продавец
Статус
Оффлайн
Регистрация
13 Июл 2018
Сообщения
1,528
Реакции[?]
1,637
Поинты[?]
280K
//1000 симпатию влепил я)
Красава, получилось отлично. Респект за проделанную работу)
 
Сверху Снизу