d-examples/source/examples/shell/spinner.d

49 lines
1.4 KiB
D

module examples.shell.spinner;
import std.stdio;
import core.thread;
import core.time;
import core.stdc.signal : signal, SIGINT;
import core.stdc.stdio : fprintf, stderr;
import core.stdc.stdlib : exit;
// Обработчик сигнала Ctrl+C
extern (C) void handleCtrlC(int sig) nothrow @nogc
{
// Используем fprintf для вывода в stderr
fprintf(stderr, "\033[?25h\rInterrupted! \n");
exit(0);
}
void spinnerShell()
{
// Устанавливаем обработчик для SIGINT (Ctrl+C)
signal(SIGINT, &handleCtrlC);
// Расширенный набор брайлевских символов для плавной анимации
immutable dchar[] spinner = [
'⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧'
];
ulong i = 0;
// Скрываем курсор
write("\033[?25l");
// Пример длительного процесса
foreach (j; 0 .. 40)
{
// Выводим текущий символ спиннера
writef("\rProcessing... %c", spinner[i]);
// Сбрасываем буфер вывода
stdout.flush();
// Переключаем символ спиннера
i = (i + 1) % spinner.length;
// Задержка для анимации
Thread.sleep(dur!("msecs")(100));
}
// Восстанавливаем курсор и очищаем строку
write("\033[?25h\rDone! \n");
}