d-examples/source/examples/ncurses/menu.d
Alexander Zhirov 273b38b49b
Добавлены примеры использования ncurses:
- Интерактивное консольное меню
- Консольное окно для ввода пароля
2025-05-15 19:57:03 +03:00

127 lines
5.1 KiB
D
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}