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