127 lines
5.1 KiB
D
127 lines
5.1 KiB
D
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();
|
||
}
|