Добавлены примеры использования ncurses:

- Интерактивное консольное меню
- Консольное окно для ввода пароля
This commit is contained in:
Alexander Zhirov 2025-05-15 19:57:03 +03:00
parent 9f0783409c
commit 273b38b49b
Signed by: alexander
GPG key ID: C8D8BE544A27C511
8 changed files with 372 additions and 3 deletions

View file

@ -0,0 +1,127 @@
module examples.ncurses.menu;
import std.conv; // Импорт модуля для преобразования типов
import std.string; // Импорт модуля для работы со строками
import std.stdio; // Импорт модуля для ввода-вывода
import deimos.ncurses; // Импорт библиотеки ncurses для работы с терминалом
import deimos.form; // Импорт библиотеки форм ncurses (в данном коде не используется)
import core.stdc.locale; // Импорт для работы с локализацией
// Определение констант для цветовых пар
enum
{
COLOR_WINDOW = 1, // Идентификатор цветовой пары для окна
COLOR_BACKGROUND = 2 // Идентификатор цветовой пары для фона
}
void menuNcurses()
{
// Установка локали для корректного отображения символов (например, кириллицы)
setlocale(LC_ALL, "");
// Инициализация ncurses
initscr();
// Включение режима raw (сырой ввод, без обработки специальных символов)
raw();
// Отключение эха ввода (символы не отображаются при вводе)
noecho();
// Скрытие курсора
curs_set(0);
// Инициализация цветового режима
start_color();
// Определение цветовых пар: текст/фон
init_pair(COLOR_WINDOW, COLOR_WHITE, COLOR_RED); // Белый текст на красном фоне
init_pair(COLOR_BACKGROUND, COLOR_WHITE, COLOR_BLUE); // Белый текст на синем фоне
// Получение размеров терминала (высота и ширина)
int width, height;
getmaxyx(stdscr, height, width);
// Установка фона для основного окна (stdscr) с использованием цветовой пары COLOR_BACKGROUND
bkgd(COLOR_PAIR(COLOR_BACKGROUND));
// Обновление экрана для отображения изменений
refresh();
// Создание нового окна размером 7x16, центрированного на экране
WINDOW* win = newwin(7, 16, height / 2 - 4, width / 2 - 8);
// Включение обработки специальных клавиш (например, стрелки) для окна
keypad(win, TRUE);
// Отрисовка рамки вокруг окна
box(win, 0, 0);
// Установка фона окна с использованием цветовой пары COLOR_WINDOW
wbkgd(win, COLOR_PAIR(COLOR_WINDOW));
// Обновление окна для отображения изменений
wrefresh(win);
// Массив пунктов меню
string[] items = [
"Пункт 1", "Пункт 2", "Пункт 3", "Пункт 4",
"Пункт 5"
];
// Индекс текущего выбранного пункта меню
int current_item = 0;
// Количество пунктов меню, преобразованное в int
int count_items = items.length.to!int;
// Переменная для хранения введенной клавиши
int ch;
// Основной цикл обработки ввода
do
{
// Обработка нажатий клавиш
switch (ch)
{
case KEY_UP: // Нажата стрелка вверх
// Переход к предыдущему пункту меню с циклическим переключением
current_item = (current_item - 1 + count_items) % count_items;
break;
case KEY_DOWN: // Нажата стрелка вниз
// Переход к следующему пункту меню с циклическим переключением
current_item = (current_item + 1) % count_items;
break;
case 10: // Нажата клавиша Enter (код 10)
case KEY_ENTER: // Альтернативный код для Enter
// Пока ничего не делает (можно добавить обработку выбора)
break;
default:
// Игнорирование других клавиш
break;
}
// Отрисовка всех пунктов меню
foreach (i, item; items)
{
// Если текущий пункт выбран, включаем инверсию цвета
if (i == current_item)
{
wattron(win, A_REVERSE); // Включение атрибута инверсии
}
// Вывод пункта меню в окне на позиции (i+1, 4)
mvwprintw(win, i.to!int + 1, 4, item.toStringz);
// Отключение инверсии цвета после вывода
wattroff(win, A_REVERSE);
}
// Обновление окна для отображения изменений
wrefresh(win);
}
// Цикл продолжается, пока не нажата клавиша F2
while ((ch = wgetch(win)) != KEY_F(2));
// Завершение работы ncurses и очистка экрана
endwin();
}