49 lines
1.4 KiB
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");
|
|
}
|