Добавлены примеры использования ncurses:
- Интерактивное консольное меню - Консольное окно для ввода пароля
This commit is contained in:
parent
9f0783409c
commit
273b38b49b
8 changed files with 372 additions and 3 deletions
127
source/examples/ncurses/menu.d
Normal file
127
source/examples/ncurses/menu.d
Normal 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();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue